python如何处理视频_OpenCV-Python系列之视频处理入门
視頻處理在OpenCV中處于極為重要的地位,目標(biāo)實(shí)時(shí)跟蹤等各種實(shí)時(shí)圖像處理算法都是以視頻為基礎(chǔ)。
從相機(jī)捕獲視頻
首先我們來(lái)了解一下使用電腦自帶的相機(jī)來(lái)進(jìn)行捕獲視頻。通常,我們必須使用攝像機(jī)捕獲實(shí)時(shí)流。OpenCV提供了一個(gè)非常簡(jiǎn)單的界面來(lái)執(zhí)行此操作。讓我們從相機(jī)捕獲視頻(我使用筆記本電腦上的內(nèi)置網(wǎng)絡(luò)攝像頭),我們需要了解幾個(gè)函數(shù):
cap = cv2.VideoCapture(0)
VideoCapture()中參數(shù)是0,表示打開(kāi)筆記本的內(nèi)置攝像頭,參數(shù)是視頻文件路徑則打開(kāi)視頻,如cap = cv2.VideoCapture("../test.avi"),當(dāng)然了,如果你外接的有其他的攝像頭,那就可以選用其他的參數(shù)例如1從而調(diào)用它。
ret,frame = cap.read()
cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個(gè)返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結(jié)尾,它的返回值就為False。frame就是每一幀的圖像,是個(gè)三維矩陣,我們都知道視頻是由一幀一幀的圖像連續(xù)組成的,OpenCV在對(duì)圖像處理時(shí)就是對(duì)每一幀的圖像進(jìn)行快速處理。
cv2.waitkey()
waitKey()方法本身表示等待鍵盤輸入,參數(shù)是1,表示延時(shí)1ms切換到下一幀圖像,對(duì)于視頻而言;參數(shù)為0,如cv2.waitKey(0)只顯示當(dāng)前幀圖像,相當(dāng)于視頻暫停,;參數(shù)過(guò)大如cv2.waitKey(1000),會(huì)因?yàn)檠訒r(shí)過(guò)久而卡頓感覺(jué)到卡頓。
c得到的是鍵盤輸入的ASCII碼,esc鍵對(duì)應(yīng)的ASCII碼是27,即當(dāng)按esc鍵是if條件句成立。
release()
調(diào)用release()釋放攝像頭,調(diào)用destroyAllWindows()關(guān)閉所有圖像窗口。
現(xiàn)在我們首先進(jìn)行代碼實(shí)驗(yàn),之后會(huì)進(jìn)行一些說(shuō)明:import?numpy?as?np
import?cv2?as?cv
cap?=?cv.VideoCapture(0)
if?not?cap.isOpened():
print("Cannot?open?camera")
exit()
while?True:
#?Capture?frame-by-frame
ret,?frame?=?cap.read()
#?if?frame?is?read?correctly?ret?is?True
if?not?ret:
print("Can't?receive?frame?(stream?end?).?Exiting?...")
break
#?Our?operations?on?the?frame?come?here
#?gray?=?cv.cvtColor(frame,?cv.COLOR_BGR2GRAY)
#?Display?the?resulting?frame
cv.imshow('frame',?gray)
if?cv.waitKey(1)?==?ord('q'):
break
#?When?everything?done,?release?the?capture
cap.release()
cv.destroyAllWindows()
isOpened可以確定攝像頭是否被打開(kāi),如果打開(kāi)則繼續(xù),如果未成功打開(kāi)則自動(dòng)退出。前面的時(shí)候我們已經(jīng)講過(guò),frame所指代的,就是攝像頭視頻的每一幀圖像,所以在顯示時(shí),我們也是顯示每一幀。如果對(duì)每一幀圖像都進(jìn)行灰度化處理,那么所顯示的視頻就是灰度化視頻,當(dāng)然,關(guān)于灰度化現(xiàn)在還沒(méi)有講到,但是可以先做個(gè)小實(shí)驗(yàn),我們來(lái)看代碼:import?numpy?as?np
import?cv2?as?cv
cap?=?cv.VideoCapture(0)
if?not?cap.isOpened():
print("Cannot?open?camera")
exit()
while?True:
#?Capture?frame-by-frame
ret,?frame?=?cap.read()
#?if?frame?is?read?correctly?ret?is?True
if?not?ret:
print("Can't?receive?frame?(stream?end?).?Exiting?...")
break
#?Our?operations?on?the?frame?come?here
gray?=?cv.cvtColor(frame,?cv.COLOR_BGR2GRAY)
#?Display?the?resulting?frame
cv.imshow('frame',?gray)
if?cv.waitKey(1)?==?ord('q'):
break
#?When?everything?done,?release?the?capture
cap.release()
cv.destroyAllWindows()
大家自己實(shí)驗(yàn),體驗(yàn)一下效果。或許有的人已經(jīng)發(fā)現(xiàn)了,我們的視頻跟實(shí)際中好像是相反的,屬于鏡像效果,我們可以取消這種效果,在這里需要介紹一個(gè)函數(shù),后面在圖像增強(qiáng)部分也會(huì)介紹到:
cv2.flip?()
函數(shù)原型:flip(src, flipCode[, dst])
src代表輸入的圖像,我么你來(lái)看一下flipCode的參數(shù)表:
現(xiàn)在我們加入這行代碼:import?numpy?as?np
import?cv2?as?cv
cap?=?cv.VideoCapture(0)
if?not?cap.isOpened():
print("Cannot?open?camera")
exit()
while?True:
#?Capture?frame-by-frame
ret,?frame?=?cap.read()
frame?=?cv.flip(frame,?1)
#?if?frame?is?read?correctly?ret?is?True
if?not?ret:
print("Can't?receive?frame?(stream?end?).?Exiting?...")
break
#?Our?operations?on?the?frame?come?here
gray?=?cv.cvtColor(frame,?cv.COLOR_BGR2GRAY)
#?Display?the?resulting?frame
cv.imshow('frame',?gray)
if?cv.waitKey(1)?==?ord('q'):
break
#?When?everything?done,?release?the?capture
cap.release()
cv.destroyAllWindows()
再實(shí)驗(yàn)會(huì)發(fā)現(xiàn)圖像已經(jīng)沒(méi)有那種鏡像效果了。
從文件播放視頻
從文件播放視頻與從攝像機(jī)捕獲視頻相同,只是將攝像機(jī)索引更改為視頻文件名。另外,在顯示框架時(shí),請(qǐng)使用適當(dāng)?shù)臅r(shí)間cv.waitKey()。如果太少,則視頻將非常快,而如果太高,則視頻將變得很慢(嗯,這就是顯示慢動(dòng)作的方式)。正常情況下25毫秒就可以了。
給出實(shí)例代碼:import?cv2?as?cv
cap?=?cv.VideoCapture('test.avi')
while?cap.isOpened():
ret,?frame?=?cap.read()
#?if?frame?is?read?correctly?ret?is?True
if?not?ret:
print("Can't?receive?frame?(stream?end?).?Exiting?...")
break
cv.imshow('frame',?frame)
if?cv.waitKey(25)?==?ord('q'):
break
cap.release()
cv.destroyAllWindows()
保存視頻
當(dāng)我們想要保存圖像的時(shí)候,,這非常簡(jiǎn)單:只需使用cv2.imwrite()。而當(dāng)我們想要保存視頻的時(shí)候,需要做更多的工作。
這次我們創(chuàng)建一個(gè)VideoWriter對(duì)象。我們應(yīng)該指定輸出文件名(例如:output.avi)。然后,我們應(yīng)指定FourCC代碼(下一段中的詳細(xì)信息)。然后應(yīng)傳遞每秒的幀數(shù)(fps)和幀大小。最后一個(gè)是isColor標(biāo)志。如果為True,則編碼器需要彩色框,否則將與灰度框一起使用。
FourCC是一個(gè)4字節(jié)的代碼,用于指定視頻編碼器以及****。可用代碼列表可在fourcc.org中找到,它取決于平臺(tái)。在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG可以生成大尺寸的視頻。X264提供非常小的尺寸的視頻)
在Windows中:DIVX(尚待測(cè)試和添加)
在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
FourCC代碼作為MJPG的`cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')`傳遞。
以下代碼從攝像機(jī)捕獲,在垂直方向上翻轉(zhuǎn)每一幀,然后保存視頻:import?numpy?as?np
import?cv2?as?cv
cap?=?cv.VideoCapture(0)
#?Define?the?codec?and?create?VideoWriter?object
fourcc?=?cv.VideoWriter_fourcc(*'XVID')
out?=?cv.VideoWriter('output.avi',?fourcc,?20.0,?(640,??480))
while?cap.isOpened():
ret,?frame?=?cap.read()
if?not?ret:
print("Can't?receive?frame?(stream?end?).?Exiting?...")
break
frame?=?cv.flip(frame,?1)
#?write?the?flipped?frame
out.write(frame)
cv.imshow('frame',?frame)
if?cv.waitKey(1)?==?ord('q'):
break
#?Release?everything?if?job?is?finished
cap.release()
out.release()
cv.destroyAllWindows()
大家可以自己嘗試演示效果。
視頻處理的部分基本上就結(jié)束了,以上介紹到的將是以后學(xué)習(xí)中非常重要的基礎(chǔ)。而事實(shí)上,OpenCV中對(duì)于視頻的處理也有更多的操作,現(xiàn)在介紹最后一個(gè)函數(shù):
VideoCapture.get()
由于前面我們已經(jīng)指定cap = cv.VideoCapture(0),所以調(diào)用此函數(shù)只需用cap.get(),get中將傳入?yún)?shù),給出參數(shù)表:
共有18個(gè)參數(shù),而至于相關(guān)的代碼,請(qǐng)大家自己實(shí)驗(yàn),可以使用print函數(shù)輸出視頻的詳細(xì)信息。
總結(jié)
以上是生活随笔為你收集整理的python如何处理视频_OpenCV-Python系列之视频处理入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: springboot jar中没有主清单
- 下一篇: 如何获取filecoin_获得Filec