使用計(jì)算機(jī)視覺反轉(zhuǎn)視頻
介紹
在本文中,我們將使用[計(jì)算機(jī)視覺技術(shù)開發(fā)一個(gè)應(yīng)用程序,該應(yīng)用程序?qū)⒎崔D(zhuǎn)視頻,并且我們將能夠?qū)⒎崔D(zhuǎn)的視頻保存在我們的本地系統(tǒng)中。在此應(yīng)用程序中,我們還可以更改其質(zhì)量,例如 360/720p。
因此,讓我們首先了解構(gòu)建這個(gè)應(yīng)用程序需要做什么。
構(gòu)建此應(yīng)用程序的步驟
本節(jié)將討論構(gòu)建此應(yīng)用程序需要完成的步驟。在這里,我們將設(shè)置模板并在整個(gè)教程中遵循此方法。
導(dǎo)入 cv2 庫(kù):這是一個(gè)非常簡(jiǎn)單的工作, cv2即 Python 的計(jì)算機(jī)視覺庫(kù)。
閱讀/捕捉視頻:然后,我們將閱讀我們想要反轉(zhuǎn)的視頻。
使用幀:在本節(jié)中,我們將使用視頻的幀來(lái)獲得處理速度,即每秒幀數(shù)和幀數(shù)。
高度和寬度:在這里,我們將簡(jiǎn)單地提取我們已閱讀的視頻的高度和寬度,以便我們可以之后的重新縮放部分中使用它。
重新縮放和設(shè)置輸出視頻的類型:現(xiàn)在,在這一部分中,我們將簡(jiǎn)單地將視頻重新縮放到一定的大小,并設(shè)置最后要保存的視頻類型。
循環(huán)所有內(nèi)容:最后,我們將所有內(nèi)容都放入與幀相關(guān)的一些條件的循環(huán)中,并且我們都準(zhǔn)備好反轉(zhuǎn)我們的視頻。
原始視頻
在進(jìn)行編碼部分之前,我們應(yīng)該知道我們的原始視頻是什么樣子的!這樣在查看結(jié)果的同時(shí),我們可以輕松地比較它們。
本文選擇的視頻是來(lái)自 YouTube 的 ens pack 開場(chǎng)視頻,在本文中,我們將只處理這個(gè)視頻,并使用計(jì)算機(jī)視覺技術(shù)將其反轉(zhuǎn)。
導(dǎo)入庫(kù)
這里我們只導(dǎo)入計(jì)算機(jī)視覺庫(kù),即cv2。
import cv2
閱讀視頻實(shí)例
這里是我們閱讀視頻的步驟。首先,讓我們看一下代碼,然后我們將討論它。
cap = cv2.VideoCapture('sample2.mp4')
我們使用 cv2 的Video Capture 函數(shù)來(lái)讀取視頻。為此,我們用引號(hào)括起來(lái)的參數(shù)中傳遞視頻的路徑;請(qǐng)記住一件事,如果視頻位于同一文件夾中,則不需要使用完整路徑;使用帶有擴(kuò)展名的視頻名稱。
使用框架
在這個(gè)部分中,我們將獲取視頻所擁有的總幀數(shù),為此,我們將使用FRAME COUNT對(duì)象
frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
因此,在這里,可以在分解函數(shù)名稱的同時(shí)輕松解碼函數(shù):
CAP:CapturePROP:PropertyFRAME_COUNT:總幀數(shù)
但是我們是否使用最有效的方法來(lái)獲取每秒的總幀數(shù)?
簡(jiǎn)單的答案是:“是的!”
原因:如果我們使用循環(huán)來(lái)計(jì)數(shù)幀并每次遞增計(jì)數(shù)器,那么由于處理時(shí)間的原因,這對(duì)開發(fā)人員和 CPU 來(lái)說(shuō)都是一個(gè)耗費(fèi)精力的過(guò)程,但如果我們使用內(nèi)置方法,那么我們就可以解決這兩個(gè)問(wèn)題。
因此,就在我們現(xiàn)在獲取視頻的總幀數(shù)之前,我們將嘗試獲取每秒幀數(shù) (FPS)。
fps = cap.get(cv2.CAP_PROP_FPS)
如果你有計(jì)算總幀數(shù)的概念,這將非常容易理解。如果我們分解計(jì)算FPS的內(nèi)置函數(shù),那么我們可以看到以下縮寫:
· CAP: Capture
· PROP: Property
· FPS: Frames per second
獲取視頻的高度和寬度
在這里,我們將計(jì)算視頻的高度和寬度,以便我們可以根據(jù)自己的喜好重新縮放輸出視頻。
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
高度:我們這里使用的內(nèi)置函數(shù)是CAP_PROP_FRAME_HEIGHT,在這里我們可以看到FRAME_HEIGHT會(huì)得到每一幀的高度,即完整
頻的高度。寬度:同樣,F(xiàn)RAME_WIDTH 將用于查找視頻的寬度。啟動(dòng)視頻的輸出寫入器
現(xiàn)在我們將首先使用Video Writer, fourcc方法,將 4 個(gè)字符的代碼賦予輸出視頻以根據(jù)我們的需要壓縮幀。
這里我們使用“MJPG”字符代碼來(lái)壓縮幀。它也被稱為視頻編解碼器,我們有多種視頻編解碼器,如果我們想查看參數(shù)列表,我們可以將其作為參數(shù)傳遞給函數(shù),然后可以在 FOURCC 頁(yè)面上找到。
注意:我們使用的是 MJPG 字符代碼,即 motion-jpeg 編解碼器。
然后我們簡(jiǎn)單地將輸出視頻重新縮放到它們的一半比例,即高度和寬度都減少到 50%。
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('reversed2.a(chǎn)vi', fourcc,fps ,(int(width*0.5), int(height*0.5)))
讓我們打印一些結(jié)果
1. 總幀數(shù)
2. 處理期間的每秒幀數(shù)。
print("No. of frames are : {}".format(frames))
print("FPS is :{}".format(fps))
輸出:
No. of frames are : 488.0
FPS is :25.0
在這里,我們將檢索索引,即視頻最后一幀的位置。
frame_index = frames-1
最后一步
讓我們將所有內(nèi)容放在一個(gè)循環(huán)中以獲得結(jié)果;在這里,我們將循環(huán)執(zhí)行之前已經(jīng)完成的所有操作,然后將視頻保存在我們的本地系統(tǒng)中
if(cap.isOpened()):
while(frame_index。0):
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
ret, frame = cap.read()
frame = cv2.resize(frame,(int(width*0.5), int(height*0.5)))
out.write(frame)
frame_index = frame_index-1
if(frame_index%100==0):
print(frame_index)
out.release()
cap.release()
cv2.destroyAllWindows()
輸出:
400.0
300.0
200.0
100.0
0.0
代碼分解:
1. 我們先借助opens() 函數(shù)檢查一下視頻的實(shí)例是否準(zhǔn)備好了
2. 然后我們將使用幀索引讀取幀直到視頻結(jié)束
3. 現(xiàn)在,由于我們想要獲得反向視頻,我們將當(dāng)前幀的位置初始化為最后一幀。
4. 可選:現(xiàn)在,如果我們想看實(shí)時(shí)反向視頻,我們可以使用 cv2.imshow('name', frame),但是,
5. 如果我們想在本地系統(tǒng)中下載(寫入)視頻,那么我們將使用 write 方法,并且在每一步之后,我們將簡(jiǎn)單地減少幀索引。
6. 最后一步是打印幀值(這只是為了檢查進(jìn)度),然后釋放實(shí)例并銷毀窗口。
輸出:
因此,在這里我們可以看到,在我們之前所做的所有計(jì)算機(jī)視覺操作的幫助下,原始視頻已成功反轉(zhuǎn)。
結(jié)論
我們已經(jīng)涵蓋了我們之前討論過(guò)的所有步驟,現(xiàn)在我們已經(jīng)編寫(下載)了我們的反轉(zhuǎn)視頻,你可以在上面的 YouTube 視頻鏈接中看到。
現(xiàn)在讓我們總結(jié)一下到目前為止我們學(xué)到的東西。
1. 本文的第一個(gè)要點(diǎn)是,我們學(xué)習(xí)了如何 在本地和實(shí)時(shí)視頻中使用幀。
2. 我們還學(xué)習(xí)了使用內(nèi)置函數(shù)獲取視頻幀及其處理時(shí)間的最佳方法。
3. 然后在預(yù)處理后編寫視頻的同時(shí),我們還注意到一個(gè)簡(jiǎn)單的變換可以給我們正確的輸出(這里是反向視頻)。
原文標(biāo)題 : 使用計(jì)算機(jī)視覺反轉(zhuǎn)視頻

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
圖片新聞
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-
長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
-
小米汽車研發(fā)中心重磅落地,寶馬家門口“搶人”
最新活動(dòng)更多
-
即日-9.16點(diǎn)擊進(jìn)入 >> 【限時(shí)福利】TE 2025國(guó)際物聯(lián)網(wǎng)展·深圳站
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 先進(jìn)算力新選擇 | 2025華為算力場(chǎng)景發(fā)布會(huì)暨北京xPN伙伴大會(huì)成功舉辦
- 2 人形機(jī)器人,正狂奔在批量交付的曠野
- 3 宇樹機(jī)器人撞人事件的深度剖析:六維力傳感器如何成為人機(jī)安全的關(guān)鍵屏障
- 4 解碼特斯拉新AI芯片戰(zhàn)略 :從Dojo到AI5和AI6推理引擎
- 5 AI版“四萬(wàn)億刺激”計(jì)劃來(lái)了
- 6 騰訊 Q2 財(cái)報(bào)亮眼:AI 已成第二增長(zhǎng)曲線
- 7 2025年8月人工智能投融資觀察
- 8 a16z最新AI百?gòu)?qiáng)榜:硅谷頂級(jí)VC帶你讀懂全球生成式AI賽道最新趨勢(shì)
- 9 10 Manus跑路,大廠掉線,只能靠DeepSeek了