python如何处理视频_OpenCV-Python系列之视频处理入门
視頻處理在OpenCV中處于極為重要的地位,目標實時跟蹤等各種實時圖像處理算法都是以視頻為基礎。
從相機捕獲視頻
首先我們來了解一下使用電腦自帶的相機來進行捕獲視頻。通常,我們必須使用攝像機捕獲實時流。OpenCV提供了一個非常簡單的界面來執行此操作。讓我們從相機捕獲視頻(我使用筆記本電腦上的內置網絡攝像頭),我們需要了解幾個函數:
cap = cv2.VideoCapture(0)
VideoCapture()中參數是0,表示打開筆記本的內置攝像頭,參數是視頻文件路徑則打開視頻,如cap = cv2.VideoCapture("../test.avi"),當然了,如果你外接的有其他的攝像頭,那就可以選用其他的參數例如1從而調用它。
ret,frame = cap.read()
cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結尾,它的返回值就為False。frame就是每一幀的圖像,是個三維矩陣,我們都知道視頻是由一幀一幀的圖像連續組成的,OpenCV在對圖像處理時就是對每一幀的圖像進行快速處理。
cv2.waitkey()
waitKey()方法本身表示等待鍵盤輸入,參數是1,表示延時1ms切換到下一幀圖像,對于視頻而言;參數為0,如cv2.waitKey(0)只顯示當前幀圖像,相當于視頻暫停,;參數過大如cv2.waitKey(1000),會因為延時過久而卡頓感覺到卡頓。
c得到的是鍵盤輸入的ASCII碼,esc鍵對應的ASCII碼是27,即當按esc鍵是if條件句成立。
release()
調用release()釋放攝像頭,調用destroyAllWindows()關閉所有圖像窗口。
現在我們首先進行代碼實驗,之后會進行一些說明: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可以確定攝像頭是否被打開,如果打開則繼續,如果未成功打開則自動退出。前面的時候我們已經講過,frame所指代的,就是攝像頭視頻的每一幀圖像,所以在顯示時,我們也是顯示每一幀。如果對每一幀圖像都進行灰度化處理,那么所顯示的視頻就是灰度化視頻,當然,關于灰度化現在還沒有講到,但是可以先做個小實驗,我們來看代碼: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()
大家自己實驗,體驗一下效果。或許有的人已經發現了,我們的視頻跟實際中好像是相反的,屬于鏡像效果,我們可以取消這種效果,在這里需要介紹一個函數,后面在圖像增強部分也會介紹到:
cv2.flip?()
函數原型:flip(src, flipCode[, dst])
src代表輸入的圖像,我么你來看一下flipCode的參數表:
現在我們加入這行代碼: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()
再實驗會發現圖像已經沒有那種鏡像效果了。
從文件播放視頻
從文件播放視頻與從攝像機捕獲視頻相同,只是將攝像機索引更改為視頻文件名。另外,在顯示框架時,請使用適當的時間cv.waitKey()。如果太少,則視頻將非常快,而如果太高,則視頻將變得很慢(嗯,這就是顯示慢動作的方式)。正常情況下25毫秒就可以了。
給出實例代碼: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()
保存視頻
當我們想要保存圖像的時候,,這非常簡單:只需使用cv2.imwrite()。而當我們想要保存視頻的時候,需要做更多的工作。
這次我們創建一個VideoWriter對象。我們應該指定輸出文件名(例如:output.avi)。然后,我們應指定FourCC代碼(下一段中的詳細信息)。然后應傳遞每秒的幀數(fps)和幀大小。最后一個是isColor標志。如果為True,則編碼器需要彩色框,否則將與灰度框一起使用。
FourCC是一個4字節的代碼,用于指定視頻編碼器以及****。可用代碼列表可在fourcc.org中找到,它取決于平臺。在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG可以生成大尺寸的視頻。X264提供非常小的尺寸的視頻)
在Windows中:DIVX(尚待測試和添加)
在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
FourCC代碼作為MJPG的`cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')`傳遞。
以下代碼從攝像機捕獲,在垂直方向上翻轉每一幀,然后保存視頻: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()
大家可以自己嘗試演示效果。
視頻處理的部分基本上就結束了,以上介紹到的將是以后學習中非常重要的基礎。而事實上,OpenCV中對于視頻的處理也有更多的操作,現在介紹最后一個函數:
VideoCapture.get()
由于前面我們已經指定cap = cv.VideoCapture(0),所以調用此函數只需用cap.get(),get中將傳入參數,給出參數表:
共有18個參數,而至于相關的代碼,請大家自己實驗,可以使用print函數輸出視頻的詳細信息。
總結
以上是生活随笔為你收集整理的python如何处理视频_OpenCV-Python系列之视频处理入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot jar中没有主清单
- 下一篇: 如何获取filecoin_获得Filec