本節主要學習的是通過
.VideoCapture()
調用攝像頭讀取圖像數據,以及使用
cap.set( propId , value )
cap.get( propId )
獲取或者更改視頻屬性。
其中,propId 的值為 0 - 18,19個值並不是每個都可以進行修改,每個值對應的屬性以及功能如下如下:
| 參數 | 值 | 功能/意義 |
|---|---|---|
| CV_CAP_PROP_POS_MSEC | 0 | 視頻文件的當前位置(以毫秒為單位)或視頻捕獲時間戳。 |
| CV_CAP_PROP_POS_FRAMES | 1 | 基於0的索引將被解碼/捕獲下一幀。 |
| CV_CAP_PROP_POS_AVI_RATIO | 2 | 視頻文件的相對位置:0 - 電影的開始,電影的1 - 結束。 |
| CV_CAP_PROP_FRAME_WIDTH | 3 | 視頻每一幀的寬。 |
| CV_CAP_PROP_FRAME_HEIGHT | 4 | 視頻每一幀的高。 |
| CV_CAP_PROP_FPS | 5 | 視頻的幀速。 |
| CV_CAP_PROP_FOURCC | 6 | 4個字符表示的視頻編碼器格式。 |
| CV_CAP_PROP_FRAME_COUNT | 7 | 視頻的幀數。 |
| CV_CAP_PROP_FORMAT | 8 | byretrieve()返回的Mat對象的格式。 |
| CV_CAP_PROP_MODE | 9 | 指示當前捕獲模式的后端特定值。 |
| CV_CAP_PROP_BRIGHTNESS | 10 | 圖像的亮度(僅適用於相機)。 |
| CV_CAP_PROP_CONTRAST | 11 | 圖像對比度(僅適用於相機)。 |
| CV_CAP_PROP_SATURATION | 12 | 圖像的飽和度(僅適用於相機)。 |
| CV_CAP_PROP_HUE | 13 | 圖像的色相(僅適用於相機)。 |
| CV_CAP_PROP_GAIN | 14 | 圖像的增益(僅適用於相機)。 |
| CV_CAP_PROP_EXPOSURE | 15 | 曝光(僅適用於相機)。 |
| CV_CAP_PROP_CONVERT_RGB | 16 | 表示圖像是否應轉換為RGB的布爾標志。 |
| CV_CAP_PROP_WHITE_BALANCE | 17 | 目前不支持 |
| CV_CAP_PROP_RECTIFICATION | 18 | 立體攝像機的整流標志(注意:只有當前支持DC1394 v 2.x后端) |
代碼如下:
#coding:utf-8
import cv2
import numpy as np
"""
函數名:cv2.VideoCapture()
功 能:通過攝像頭捕獲實時圖像數據
返回值:有
參數一:攝像頭代號,0為默認攝像頭,筆記本內建攝像頭一般為 0
或者填寫視頻名稱直接加載本地視頻文件
"""
cap = cv2.VideoCapture(0)#創建一個 VideoCapture 對象
"""
函數名:cap.set( propId , value )
功 能:設置視頻參數。設置視頻的寬高值和攝像頭有關
使用筆記本內置攝像頭時只能設置為 1280*720 以及 640*480,哪怕設置值不同時都會自動校正過來,並且仍然返回 True
返回值:布爾值
參數一:需要設置的視頻參數
參數二:設置的參數值
"""
cap.set(3,480)
cap.set(4,320)
flag = 1;#設置一個標志,用來輸出視頻信息
"""
函數名:cv2.isOpened()
功 能:返回一個布爾值( True / False ),檢查是否初始化成功,成功返回 True
返回值:布爾值
"""
while(cap.isOpened()):#循環讀取每一幀
"""
函數名:cap.read()
功 能:返回兩個值
先返回一個布爾值,如果視頻讀取正確,則為 True,如果錯誤,則為 False,也可用來判斷是否到視頻末尾
再返回一個值,為每一幀的圖像,該值是一個三維矩陣
通用接收方法為:
ret,frame = cap.read();
這樣 ret 存儲布爾值,frame 存儲圖像
若使用一個變量來接收兩個值,如
frame = cap.read()
則 frame 為一個元組,原來使用 frame 處需更改為 frame[1]
返回值:R1:布爾值
R2:圖像的三維矩陣
"""
ret_flag , Vshow = cap.read()
#gray = cv2.cvtColor(Vshow,cv2.COLOR_BGR2GRAY)
#cv2.imshow("Gray",gray)
cv2.imshow("Capture_Test",Vshow) #窗口顯示,顯示名為 Capture_Test
k = cv2.waitKey(1) & 0xFF #每幀數據延時 1ms,延時不能為 0,否則讀取的結果會是靜態幀
if k == ord('s'): #若檢測到按鍵 ‘s’,打印字符串
"""
函數名:cap.get( propId )
功 能:查詢視頻的參數
返回值:無
參數一:查詢的視頻參數,其中部分值可以使用 cap.set() 進行修改
"""
print(cap.get(3));
print(cap.get(4));
elif k == ord('q'): #若檢測到按鍵 ‘q’,退出
break
cap.release() #釋放攝像頭
cv2.destroyAllWindows()#刪除建立的全部窗口
