opencv python 從攝像頭獲取視訊/從檔案獲取視訊 /儲存視訊

sakurala發表於2019-02-16

這次開始學習Getting Started with Videos

1從攝像頭獲取視訊

使用cv2.VideoCapture()獲取視訊.

cv2.VideoCapture(builtins.object)

要獲取視訊,需要建立一個VideoCapture物件,引數可以是裝置索引(攝像頭索引)或視訊檔案的名稱。如果是裝置索引,當只連線一臺攝像機時,可以是0或-1;也可以通過傳遞1來選擇第二個攝像頭。

我們設cap = cv2.VideoCapture(0)

cap.open()

開啟cap

cap.isOpened()

檢測cap是否初始化成功,如果返回True,則初始化成都,否則使用cap.open()開啟cap

cap.read()
返回兩個值
首先返回一個bool值,如果能正確讀取幀,則為True,否則為False.可以通過檢查該返回值來檢查視訊的結尾.
再返回一個值,為每一幀的影像,該值是一個三維矩陣

Note :如果使用一個變數接受兩個值,frame = cap.read() 則 frame 為一個元組,原來使用 frame 處需更改為 frame[1]

cap.get(propld)

通過cap.get(propld)訪問視訊的某些功能,propld是0到18之間的數字。每個數字表示視訊的屬性。
比如:
cap.get(cv2.CAP_PROP_FRAME_WIDTH)和cap.get(cv2.CAP_PROP_FRAME_HEIGHT)得到幀寬和高度.
如果想修改為320×240.只需使用
ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)和
ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240).

引數 propld 功能
cv2.CAP_PROP_POS_MSEC 0 視訊檔案的當前位置(以毫秒為單位)或視訊捕獲時間戳
cv2.CAP_PROP_POS_FRAMES 1 基於0的索引將被解碼/捕獲下一幀
cv2.CAP_PROP_POS_AVI_RATIO 2 視訊檔案的相對位置:0 – 視訊的開始,1 – 視訊的結束
cv2.CAP_PROP_FRAME_WIDTH 3 幀的寬度
cv2.CAP_PROP_FRAME_HEIGHT 4 幀的高度
cv2.CAP_PROP_FPS 5 幀速
cv2.CAP_PROP_FOURCC 6 4個字元表示的視訊編碼器格式
cv2.CAP_PROP_FRAME_COUNT 7 幀數
cv2.CAP_PROP_FORMAT 8 byretrieve()返回的Mat物件的格式
cv2.CAP_PROP_MODE 9 指示當前捕獲模式的後端特定值
cv2.CAP_PROP_BRIGHTNESS 10 影像的亮度(僅適用於相機)
cv2.CAP_PROP_CONTRAST 11 影像對比度(僅適用於相機)
cv2.CAP_PROP_SATURATION 12 影像的飽和度(僅適用於相機)
cv2.CAP_PROP_HUE 13 影像的色相(僅適用於相機)
cv2.CAP_PROP_GAIN 14 影像的增益(僅適用於相機)
cv2.CAP_PROP_EXPOSURE 15 曝光(僅適用於相機)
cv2.CAP_PROP_CONVERT_RGB 16 表示影像是否應轉換為RGB的布林標誌
cv2.CAP_PROP_WHITE_BALANCE 17
cv2.CAP_PROP_RECTIFICATION 18 立體攝像機的整流標誌

應用

從攝像頭獲取視訊,並將其轉換為灰度視訊並顯示它.
程式碼 :

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations 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()#刪除全部視窗

Note :最後不要忘記release capture

1從檔案獲取視訊

使用cv2.VideoCapture()獲取視訊.

cv2.VideoCapture(builtins.object)

與從攝像頭獲取視訊相同,只是引數為視訊檔案的名稱.

應用

程式碼 :

import numpy as np
import cv2

cap = cv2.VideoCapture(`vtest.avi`)

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow(`frame`,gray)
    if cv2.waitKey(1) & 0xFF == ord(`q`):
        break

cap.release()
cv2.destroyAllWindows()

Note :

  • 應為cv2.waitKey選擇恰當的時間,如果設定太小,視訊播放將非常快,如果設定太大,視訊將顯示慢動作,一般設定25毫秒.
  • 在使用Video Capture時應確保安裝了正確版本的ffmpeggstreamer.

3儲存視訊

使用cv2.VideoWriter()儲存視訊.

cv2.VideoWriter()

首先建立一個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程式碼通過cv2.VideoWriter_fourcc()傳遞
比如:
對於MJPG,FourCC程式碼作為cv2.VideoWriter_fourcc(`M`,`J`,`P`,`G`)cv2.VideoWriter_fourcc(*`MJPG`)傳遞.

應用

從攝像頭獲取視訊,在垂直方向上翻轉每一幀並儲存它.
程式碼 :

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*`XVID`)
out = cv2.VideoWriter(`output.avi`,fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow(`frame`,frame)
        if cv2.waitKey(1) & 0xFF == ord(`q`):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

相關文章