opencv python 從攝像頭獲取視頻/從文件獲取視頻 /保存視頻

此次開始學習Getting Started with Videoshtml

1從攝像頭獲取視頻

使用cv2.VideoCapture()獲取視頻.後端

cv2.VideoCapture(builtins.object)ide

要獲取視頻,須要建立一個VideoCapture對象,參數能夠是設備索引(攝像頭索引)或視頻文件的名稱。若是是設備索引,當只鏈接一臺攝像機時,能夠是0或-1;也能夠經過傳遞1來選擇第二個攝像頭。學習

咱們設cap = cv2.VideoCapture(0)測試

cap.open()ui

打開cap編碼

cap.isOpened()code

檢測cap是否初始化成功,若是返回True,則初始化成都,不然使用cap.open()打開cap視頻

cap.read()
返回兩個值
首先返回一個bool值,若是能正確讀取幀,則爲True,不然爲False.能夠經過檢查該返回值來檢查視頻的結尾.
再返回一個值,爲每一幀的圖像,該值是一個三維矩陣htm

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)獲得幀寬和高度.
若是想修改成320x240.只需使用
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()
相關文章
相關標籤/搜索