Python調用OpenCV讀寫視頻

最近因爲經常對視頻進行操作,所以記錄下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上找到其他的方法,稍微麻煩一點點,這裏還沒整理好,就先不加了。

 

東風夜放花千樹。更吹落、星如雨。

寶馬雕車香滿路。

鳳簫聲動,玉壺光轉,一夜魚龍舞。

蛾兒雪柳黃金縷。笑語盈盈暗香去。

衆裏尋他千百度。

驀然回首,那人卻在,燈火闌珊處。

  --辛棄疾 《青玉案·元夕》

發佈了103 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章