這次開始學習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時應確保安裝了正確版本的ffmpeg 或gstreamer.
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()