1、捕獲攝像頭的視頻幀
OpenCV 提供了cv2.VideoCapture() :0為默認計算機默認攝像頭,1或者其他的選擇來更換來源
獲取過程:
????????需要先創(chuàng)建一個VideoCapture的對象,參數(shù)可以是設(shè)備的索引號,或者是一個視頻文件。設(shè)備索引號就是在指定要使用的攝像頭。一般的筆記本電腦都有內(nèi)置攝像頭。所以參數(shù)就是 0??梢酝ㄟ^設(shè)置成 1 或者其他的來選擇別的攝像頭。之后,就可以一幀一幀的捕獲視頻了。最后,一定要停止捕獲視頻。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
????#capture frame-by-frame
????ret , frame = cap.read()# 返回一個布爾值(True/False)。如果幀讀取的是正確的, 就是 True
????#our operation on the frame come here
????gray = cv2.cvtColor(frame , cv2.COLOR_BGR2GRAY)
????#display the resulting frame
????cv2.imshow('frame',gray)
????if cv2.waitKey(1) &0xFF ==ord('q'):
????????#按q鍵退出
????????break
#when everything done , release the capture
cap.release()
cv2.destroyAllWindows()
有時 cap 可能不能成功的初始化攝像頭設(shè)備。這種情況下上面的代碼會報錯。你可以使用 cap.isOpened(),來檢查是否成功初始化了。如果返回值是True,那就沒有問題。否則就要使用函數(shù) cap.open()。
當需要同步一組攝像頭或者一個多頭的攝像頭的時候,read()方法就不適用,一般會采取grab()和retrieve()方法代替它。
cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
success0 = cap0.grab()
success1 = cap1.grab()
if success0 and success1:
? ? frame0 = cap0.retrieve()
? ? frame1 = cap1.retrieve()
可以使用函數(shù) cap.get(propId) 來獲得視頻的一些參數(shù)信息。這里propId 可以是 0 到 41 之間的任何整數(shù)。每一個數(shù)代表視頻的一個屬性。其中的一些值可以使用 cap.set(propId,value) 來修改,value 就是你想要設(shè)置成的新值。
例如,我可以使用 cap.get(3) 和 cap.get(4) 來查看每一幀的寬和高。默認情況下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 來把寬和高改成 320X240。

PS:當get里邊的值不再范圍之內(nèi),即不支持所查詢的這個屬性,會返回0
2、從文件中播放視頻
把設(shè)備索引號改成文件名即可
cap=cv2.VideoCapture('filename.avi')#文件名及格式
在播放每一幀時,使用 cv2.waiKey() 設(shè)置適當?shù)某掷m(xù)時間。一般使用25ms
3、保存視頻
創(chuàng)建一個VideoWrite的對象,確定輸出文件名,指定FourCC編碼,播放頻率和幀的大小,最后是isColor標簽True為彩色。
FourCC是一個4字節(jié)碼,用來確定視頻的編碼格式。在不同的系統(tǒng),編碼格式會稍有不同。
Linux?: DIVX , XVID , MJPG , X264 , WMV1 , WMV2;XVID是最好的,MJPG是高尺寸視頻,X264得到小尺寸視頻
Windows : DIVX

fourcc也可以寫成 fourcc = cv2.VideoWriter_fourcc('I','4','2','0')這樣形式
PS:設(shè)置FourCC格式時,原文里采用了cv2.VideoWriter_fourcc()這個函數(shù),若運行程序的時候顯示這個函數(shù)不存在,可以改用了cv2.cv.CV_FOURCC這個函數(shù)
