最近因為經常對視頻進行操作,所以記錄下Python用opencv來讀寫視頻的方法。
一、opencv讀視頻
python調用opencv來讀視頻比較簡單,可以直接調用cv2.VideoCapture來讀取視頻和攝像頭,基本上,常見的avi和mp4都能夠正常讀取。cv2.VideoCapture是通過傳入數字來讀取對應的攝像頭,或者通過傳入一個路徑字符串來讀取對應的視頻文件。
最簡單直接的讀取視頻的例子如下:
import cv2
cap = cv2.VideoCapture(0) #讀取攝像頭
#cap = cv2.VideoCapture("video.mp4") #讀取視頻文件
while(True):
ret, frame = cap.read()
if ret:
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
讀取視頻后,OpenCV提供了很多的視頻相關的屬性,我覺得常見且比較有用的幾個屬性見如下表格(完整表格見官網文檔):
C/C++: CAP_PROP_POS_MSEC Python: cv.CAP_PROP_POS_MSEC |
Current position of the video file in milliseconds.當前視頻幀在第幾毫秒 |
C/C++: CAP_PROP_POS_FRAMES Python: cv.CAP_PROP_POS_FRAMES |
0-based index of the frame to be decoded/captured next.當前幀在視頻中第幾幀,從0開始 |
C/C++: CAP_PROP_POS_AVI_RATIO Python: cv.CAP_PROP_POS_AVI_RATIO |
Relative position of the video file: 0=start of the film, 1=end of the film.視頻幀在視頻中的相對位置 |
C/C++: CAP_PROP_FRAME_WIDTH Python: cv.CAP_PROP_FRAME_WIDTH |
Width of the frames in the video stream.視頻幀寬度 |
C/C++: CAP_PROP_FRAME_HEIGHT Python: cv.CAP_PROP_FRAME_HEIGHT |
Height of the frames in the video stream.視頻幀高度 |
C/C++: CAP_PROP_FPS Python: cv.CAP_PROP_FPS |
Frame rate.幀率 |
C/C++: CAP_PROP_FOURCC Python: cv.CAP_PROP_FOURCC |
4-character code of codec. see VideoWriter::fourcc .視頻編碼格式 |
C/C++: CAP_PROP_FRAME_COUNT Python: cv.CAP_PROP_FRAME_COUNT |
Number of frames in the video file.視頻總幀數 |
有了上面的屬性后,要獲取對應的屬性值,可以通過cv2.VideoCapture的get方法來獲取,同樣,可以通過set方法來寫屬性:
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = cap.get(cv2.CAP_PROP_FPS)
二、 opencv寫視頻
opencv寫視頻調用的是cv2.VideoWriter,cv2.VideoWriter需要傳入的四個主要的參數:保存的視頻路徑、編碼格式、幀率、視頻幀尺寸。
簡單的寫視頻的例子在上面讀視頻的例子基礎上,稍微添加一點代碼,例子如下:
import cv2
cap = cv2.VideoCapture(0) #讀取攝像頭
#cap = cv2.VideoCapture("video.mp4") #讀取視頻文件
fps = 15
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('video.mp4', cv2.VideoWriter_fourcc('M','P','E','G'), fps, size)
while(True):
ret, frame = cap.read()
if ret:
videoWriter.write(frame)
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
videoWriter.release()
這里主要說下編碼格式,常見的視頻編碼格式可以在找fourcc.org上面查找。
opencv中比較常見的編碼格式有"DIVX"、”MJPG"、"XVID"、"MPEG"等,這幾個基本上opencv都是自帶的可以直接讀寫的,保存的文件格式可以是.mp4也可以是.avi,但是OpenCV並不是自帶的支持所有格式的,有時候在工程中可能會遇到需要其它編碼格式,例如在web中要顯示的話,常見的還是h264這種支持流的格式,而這一種opencv是不自帶的,所以需要通過其它途徑來實現。
要想使用OpenCV來保存h264視頻的話,需要使用額外的庫,在windows上是比較簡單的,直接下載openh264庫來使用即可,使用方法也比較簡單,到openh264的github上下載相關的文件,比如我用的opencv-python為3.4.3.18,它使用的openh264版本是1.7,所以就可以下載http://ciscobinary.openh264.org/openh264-1.7.0-win64.dll.bz2的版本,如下:
下載之后直接解壓,放到腳本所在的路徑下,然后修改上面寫視頻的編碼格式,格式可以是'h','2','6','4'或者'x','2','6','4',如下:
videoWriter = cv2.VideoWriter('video.mp4', cv2.VideoWriter_fourcc('h','2','6','4'), fps, size)
Linux稍微麻煩一點,本來以為可以參照Windows這種做法從上面的路徑下載庫文件來使用,但實際上運行的時候並沒有用,會有問題,所以沒解決,后面在github上找到其他的方法,稍微麻煩一點點,這里還沒整理好,就先不加了。
東風夜放花千樹。更吹落、星如雨。
寶馬雕車香滿路。
鳳簫聲動,玉壺光轉,一夜魚龍舞。
蛾兒雪柳黃金縷。笑語盈盈暗香去。
眾里尋他千百度。
驀然回首,那人卻在,燈火闌珊處。
--辛棄疾 《青玉案·元夕》