Opencv學習筆記——視頻的讀寫

以下均爲github上opencv的個人學習筆記,原路徑如下:

https://github.com/JimmyHHua/opencv_tutorials

源碼示例:

import cv2 as cv
import numpy as np


capture = cv.VideoCapture("./test.avi") 
# capture = cv.VideoCapture(0) 打開攝像頭
height = capture.get(cv.CAP_PROP_FRAME_HEIGHT)
width = capture.get(cv.CAP_PROP_FRAME_WIDTH)
count = capture.get(cv.CAP_PROP_FRAME_COUNT)
fps = capture.get(cv.CAP_PROP_FPS)
print(height, width, count, fps)
out = cv.VideoWriter("./test.avi", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 15,
                     (np.int(width), np.int(height)), True)
while True:
    ret, frame = capture.read()
    if ret is True:
        cv.imshow("video-input", frame)
        out.write(frame)
        c = cv.waitKey(50)
        if c == 27: # ESC
            break
    else:
        break

capture.release()
out.release()

在opencv中關於視頻的讀操作是通過VideoCapture類來完成的;關於視頻的寫操作是通過VideoWriter類來實現的。


<一>---VideoCapture---視頻的獲取操作

       VideoCapture既支持從視頻文件(.avi , .mpg格式)讀取,也支持直接從攝像機(比如電腦自帶攝像頭)中讀取。要想獲取視頻需要先創建一個VideoCapture對象,VideoCapture對象的創建方式有以下三種: 

【方式一】是從文件(.MPG或.AVI格式)中讀取視頻,對象創建以後,OpenCV將會打開文件並做好準備讀取它,如果打開成功,我們將可以開始讀取視頻的幀,並且cv.VideoCapture的成員函數isOpened()將會返回true(建議在打開視頻或攝像頭時都使用該成員函數判斷是否打開成功)。

capture = cv.VideoCapture("./test.avi") 

【方式二】是從攝像機中讀取視頻,這種情況下,我們會給出一個標識符,用於表示我們想要訪問的攝像機,及其與操作系統的握手方式。對於攝像機而言,這個標誌符就是一個標誌數字——如果只有1個攝像機,那麼就是0,如果系統中有多個攝像機,那麼只要將其向上增加即可。標識符另外一部分是攝像機域(camera domain),用於表示攝像機的類型,這個域值可以是下面任一預定義常量。

capture = cv.VideoCapture(int)

                                                                        

以這種方式創建視頻捕獲對象時,我們所傳遞的標識符是域索引和攝像機索引的和。例如(C語言方案):

capture = VideoCapture(cv.CAP_IEEE1394 + 1); 

這個例子中VideoCapture將嘗試打開第2個(編號從0開始)1394攝像機。多數情況下,由於我們只有一個攝像機,因此沒必要指定攝像機的域,此時使用cv::CAP_ANY是一種高效的方式(也即是0,所以不用特意指定)。

VideoCapture有以下函數功能:

函數的具體用法請參見官方鏈接:

https://docs.opencv.org/3.0.0/d8/dfe/classcv_1_1VideoCapture.html

cv.VideoWriter是視頻的寫操作,具體用法和功能函數如下:

更多函數用法請參見官網鏈接:

https://docs.opencv.org/trunk/dd/d9e/classcv_1_1VideoWriter.html

這裏需要說明下,VideoCapture是不支持MP4格式的,要想使其支持該格式,可以使用以下方式處理

將OpenCV中的opencv_ffmpeg330_64.dll(在OpenCV\build\bin文件夾下,注意這是我的opencv版本)文件拷貝到Python的Lib\site-packages文件夾下(與cv2.pyd文件放在一起解碼用)。

編碼格式(('M', 'P', '4', '2') 視頻大小最小):

cv2.VideoWriter_fourcc('M','J','P','G') = motion-jpeg codec

cv2.VideoWriter_fourcc('P','I','M','1') = MPEG-1 codec
cv2.VideoWriter_fourcc('M', 'P', '4', '2') = MPEG-4.2 codec
cv2.VideoWriter_fourcc('D', 'I', 'V', '3') = MPEG-4.3 codec
cv2.VideoWriter_fourcc('D', 'I', 'V', 'X') = MPEG-4 codec
cv2.VideoWriter_fourcc('U', '2', '6', '3') = H263 codec
cv2.VideoWriter_fourcc('I', '2', '6', '3') = H263I codec
cv2.VideoWriter_fourcc('F', 'L', 'V', '1') = FLV1 code
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章