Python OpenCV讀取攝像頭或視頻文件並播放顯示

任務:使用Anaconda Python和OpenCV,讀取攝像頭或視頻文件並播放顯示。

要從攝像頭或視頻文件讀取視頻,首先導入opencv庫cv2. 使用cv2.VideoCapture()方法創建一個VideoCapture對象。該方法接收攝像頭的索引或視頻文件名。如果只有一個攝像頭,則以整數0進行索引。如果有多個攝像頭,則分別以0,1,2…進行索引。如果是讀取視頻文件,則需傳入視頻文件的全名稱(包括路徑和擴展名)字符串。

任務實現代碼如下。


In []:

import cv2 #導入opencv

cap = cv2.VideoCapture(0) #創建VideoCapture對象

while(True): #創建無限循環,用於播放每一幀圖像

ret, frame = cap.read() #讀取圖像的每一幀

cv2.imshow('frame',frame) #顯示幀

#等待1毫秒,判斷此期間有無按鍵按下,以及按鍵的值是否是Esc鍵

if cv2.waitKey(1) & 0xFF == 27:

break #中斷循環

cap.release() #釋放ideoCapture對象

cv2.destroyAllWindows() #釋放視頻播放窗口


Out:


Python OpenCV讀取攝像頭或視頻文件並播放顯示

播放視頻截圖


上述代碼中,使用cv2.VideoCapture(0)方法創建了一個VideoCapture對象cap. 參數0是攝像頭的索引。為讀取和播放每一幀圖像,使用while(True)創建了一個無限循環,在循環體內讀取每幀圖像並播放。

cap.read()方法讀取視頻的每一幀。它返回兩個參數,第一個參數(本例ret)是bool型,表示是否成功讀取到一幀圖像。True表示成功讀取,False表示讀取失敗。第二個參數(本例frame)為圖像的數據。它是一個形狀為(height, width, channels)的整數型數組。height, width, channels分別表示圖像幀的高度、寬度、通道。數組中的每個元素的值是像素值,範圍為0-255. 3個通道0,1,2分別表示B(藍色),G(綠色),R(紅色)。

cv2.imshow()方法用於播放幀。它接收兩個參數,如本例中cv2.imshow('frame',frame)所示。第一個參數接收字符串,表示播放視頻窗口的名稱,它將顯示在窗口上方。第二個參數即要播放的圖像幀。它可以是cap讀取的圖像frame,也可以是處理過的圖像。

要終止播放,可以設置一個按鍵,當檢測到該按鍵按下後,使用break方法中斷循環。這裡用到了cv2.waitKey()方法。它接收整數,表示等待的時間(毫秒)。在等待期間判斷是否有按鍵按下,如果有則返回按鍵的ASCII碼。如果傳入的參數為小於等於0的整數,則表示無限等待,直到有按鍵按下。

由於不同操作系統返回的鍵值長度可能不一樣,而ASCII碼只有8位,為保險起見,將cv2.waitKey()返回的鍵值與0xFF進行與運算,只取其低8位,即cv2.waitKey(1) & 0xFF,這樣保證獲得一個準確的ASCII碼。本例使用Esc(ASCII碼的十進制為27)鍵作為終止循環按鍵。如果使用其他按鍵(例如q), 則可以使用形如ord(’q’)的方法獲取按鍵的ASCII碼。

終止播放後,要使用cap.release()方法釋放VideoCapture對象cap,使用cv2.destroyAllWindows()方法銷燬播放窗口。


分享到:


相關文章: