視頻信號(以下簡稱為視頻)是非常重要的視覺信息來源,它是視覺處理過程中經(jīng)常要處理的一類信號。實際上,視頻是由一系列圖像構(gòu)成的,這一系列圖像被稱為幀,幀是以固定的時間間隔從視頻中獲取的。獲?。úシ牛乃俣确Q為幀速率,其單位通常使用“幀/秒”表示,代表在1 秒內(nèi)所出現(xiàn)的幀數(shù),對應(yīng)的英文是 FPS(Frames Per Second)。如果從視頻中提取出獨立的幀,就可以使用圖像處理的方法對其進行處理,達到處理視頻的目的。
OpenCV 提供了 cv2.VideoCapture 類和 cv2.VideoWriter 類來支持各種類型的視頻文件。在不同的操作系統(tǒng)中,它們支持的文件類型可能有所不同,但是在各種操作系統(tǒng)中均支持 AVI格式的視頻文件。
VideoCapture 類
OpenCV 提供了 cv2.VideoCapture 類來處理視頻
。cv2.VideoCapture 類處理視頻的方式非常簡單、快捷,而且它既能處理視頻文件又能處理攝像頭信息。
類函數(shù)介紹
cv2.VideoCapture 類的常用函數(shù)包括初始化、打開、幀捕獲、釋放、屬性設(shè)置等,下面對
這些函數(shù)進行簡單的介紹。
1. 初始化
OpenCV 為 cv2.VideoCapture 類提供了構(gòu)造函數(shù) cv2.VideoCapture()
,用于打開攝像頭并完成攝像頭的初始化工作。該函數(shù)的語法格式為:
捕獲對象=cv2.VideoCapture(“攝像頭 ID 號”)
式中:
-
“攝像頭 ID 號”就是攝像頭的 ID 號碼。需要注意的是,這個參數(shù)是攝像設(shè)備(攝像頭)的 ID 編號,而不是文件名。其默認值為-1,表示隨機選取一個攝像頭;如果有多個攝像頭,則用數(shù)字“0”表示第 1 個攝像頭,用數(shù)字“1”表示第 2 個攝像頭,以此類推。
所以,如果只有一個攝像頭,既可以使用“0”,也可以使用“-1”作為攝像頭 ID 號。在某些平臺上,如果該參數(shù)值為“-1”,OpenCV 會彈出一個窗口,讓用戶手動選擇希望使用的攝像頭。 -
“捕獲對象”為返回值,是 cv2.VideoCapture 類的對象。
例如,要初始化當(dāng)前的攝像頭,可以使用語句:
cap = cv2.VideoCapture(0)
OpenCV 官網(wǎng)在介紹函數(shù) cv2.VideoCapture()時,特別強調(diào):視頻處理完以后,要記得釋放攝像頭對象。
該(構(gòu)造)函數(shù)也能夠用于初始化視頻文件,初始化視頻文件時,參數(shù)為文件名。此時函數(shù)的形式為:
捕獲對象=cv2.VideoCapture(“文件名”)
例如,打開當(dāng)前目錄下文件名為“vtest.avi”的視頻文件,可以使用語句:
cap = cv2.VideoCapture('vtest.avi')
- cv2.VideoCapture.open()函數(shù)和cv2.VideoCapture.isOpened()函數(shù)
一般情況下,使用 cv2.VideoCapture()函數(shù)即可完成攝像頭的初始化。有時,為了防止初始化發(fā)生錯誤,可以使用函數(shù) cv2.VideoCapture.isOpened()來檢查初始化是否成功。該函數(shù)的語法格式為:
retval = cv2.VideoCapture.isOpened()
該函數(shù)會判斷當(dāng)前的攝像頭是否初始化成功:
- 如果成功,則返回值 retval 為 True。
- 如果不成功,則返回值 retval 為 False。
如果攝像頭初始化失敗,可以使用函數(shù) cv2.VideoCapture.open()打開攝像頭。該函數(shù)的語法格式為:
retval = cv2.VideoCapture.open( index )
式中:
- index 為攝像頭 ID 號。
- retval 為返回值,當(dāng)攝像頭(或者視頻文件)被成功打開時,返回值為 True。
同樣,函數(shù) cv2.VideoCapture.isOpened()和函數(shù) cv2.VideoCapture.open()也能用于處理視頻文件。在處理視頻文件時,函數(shù) cv2.VideoCapture.open()的參數(shù)為文件名,其語法格式為:
retval = cv2.VideoCapture.open( filename )
3. 捕獲幀
攝像頭初始化成功后,就可以從攝像頭中捕獲幀信息了。捕獲幀所使用的是函數(shù)cv2.VideoCapture.read()
。該函數(shù)的語法是:
retval, image=cv2.VideoCapture.read()
式中:
- image 是返回的捕獲到的幀,如果沒有幀被捕獲,則該值為空。
- retval 表示捕獲是否成功,如果成功則該值為 True,不成功則為 False。
4. 釋放
在不需要攝像頭時,要關(guān)閉攝像頭。關(guān)閉攝像頭使用的是函數(shù)
cv2.VideoCapture.release()。
該函數(shù)的語法是:
None=cv2.VideoCapture.release()
例如,當(dāng)前有一個 VideoCapture 類的對象 cap,要將其釋放,可以使用語句:
cap.release()
5 屬性設(shè)置
有時,我們需要獲取 cv2.VideoCapture 類對象的屬性,或是更改該類對象的屬性。函數(shù)cv2.VideoCapture.get()用于獲取 cv2.VideoCapture 類對象的屬性,該函數(shù)的語法格式是:
retval = cv2.VideoCapture.get( propId )
式中,參數(shù) propId 對應(yīng)著 cv2.VideoCapture 類對象的屬性。
例如,有一個 cv2.VideoCapture 類對象 cvc,則:
- 通過 cvc.get(cv2.CAP_PROP_FRAME_WIDTH),就能獲取當(dāng)前幀對象的寬度。
- 通過 cvc.get(cv2.CAP_PROP_FRAME_HEIGHT),就能獲取當(dāng)前幀對象的高度。
函數(shù) cv2.VideoCapture.set()用來設(shè)置 cv2.VideoCapture 類對象的屬性。該函數(shù)的語法是:
retval = cv2.VideoCapture.set( propId, value )
式中,propId 對應(yīng) cv2.VideoCapture 類對象的屬性,value 對應(yīng)屬性 propid 的值。
例如,有一個 cv2.VideoCapture 類對象 cvc,則:
- 語句 ret = cvc.set(cv2.CAP_PROP_FRAME_WIDTH, 640)將當(dāng)前幀對象的寬度設(shè)置為
640 像素。 - 語句 ret = cvc.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)將當(dāng)前幀對象的高度設(shè)置為480 像素。
cv2.VideoCapture 類對象的屬性值及含義如表 18-1 所示。
5. cv2.VideoCapture.grab()函數(shù)cv2.VideoCapture.retrieve()函數(shù)
一般情況下,如果需要讀取一個攝像頭的視頻數(shù)據(jù),最簡便的方法就是使用函數(shù)
cv2.VideoCapture.read()。但是,如果需要同步一組或一個多頭(multihead)攝像頭(例如立體攝像頭或 Kinect)的視頻數(shù)據(jù)時,該函數(shù)就無法勝任了。可以把函數(shù) cv2.VideoCapture.read()
理解為是由函數(shù) cv2.VideoCapture.grab()和函數(shù) cv2.VideoCapture.retrieve()組成的。函數(shù)
cv2.VideoCapture.grab()用來指向下一幀,函數(shù) cv2.VideoCapture.retrieve()用來解碼并返回一幀。
因此,可以使用函數(shù) cv2.VideoCapture.grab()和函數(shù)cv2.VideoCapture.retrieve()獲取多個攝像頭的數(shù)據(jù)。
函數(shù) cv2.VideoCapture.grab()用來指向下一幀,其語法格式是:
retval= cv2.VideoCapture.grab( )
如果該函數(shù)成功指向下一幀,則返回值 retval 為 True。
函數(shù) cv2.VideoCapture.retrieve()用來解碼,并返回函數(shù) v2.VideoCapture.grab()捕獲的視頻幀。
該函數(shù)的語法格式為:
retval, image = cv2.VideoCapture.retrieve( )
式中:
- image 為返回的視頻幀,如果未成功,則返回一個空圖像。
- retval 為布爾型值,若未成功,返回 False;否則,返回 True。
對于一組攝像頭,可以使用如下代碼捕獲不同攝像頭的視頻幀:文章來源:http://www.zghlxwxcb.cn/news/detail-654423.html
success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
frame0 = cameraCapture0.retrieve()
frame1 = cameraCapture1.retrieve()
與 VideoCapture 類內(nèi)的其他函數(shù)一樣,cv2.VideoCapture.grab()和 cv2.VideoCapture.retrieve()
也能用來讀取視頻文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-654423.html
示例:顯示帥哥或美女視頻
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('frame',frame)
c = cv2.waitKey(1)
if c==27: #ESC 鍵
break
cap.release()
cv2.destroyAllWindows()
到了這里,關(guān)于opencv進階09-視頻處理cv2.VideoCapture示例(打開本機電腦攝像頭)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!