學到實用OpenCV調用筆記本電腦的攝像頭,并錄制視訊儲存到本地硬碟的時候,出現了一點故障,那就是擷取到的檔案總是為0KB。經過一番查找,終于找到了解決辦法。
調用攝像頭
調用攝像頭作為本實驗的基礎是必不可少的,因為我們很有可能在初始化的這一步出錯,而導緻整個視訊錄制的失敗。
引入庫支援
import cv2
初始化
初始化的時候,參數可以是整數,也可以是外部的視訊檔案的名稱。這裡需要強調的是整數類型。
通常來說,筆記本電腦内置了一個攝像頭,我們用0代表,其餘的外接攝像頭我們可以按照具體的情況來使用1,2,3··· ··· 來進行調用和資料的采集。
cap = cv2.VideoCapture(0)
有的時候,我們初始化完成了,但是并不知道到底成功了沒有,這時,我們可以調用cap.isOpened()方法來偵測。
調整界面大小
預設的窗體界面是640X480的,但是我們卻也可以修改,有固定方式和可任意調節方式。
固定大小方式:
cap = cv2.VideoCapture(0)
# cap.set(3,1080)
# cap.set(4,720)
視窗可任意調節方式:
cv2.namedWindow(cv2.WINDOW_NORMAL)
實時顯示
實時顯示就是将OpenCV采集到的一幀一幀的資料實時的顯示到界面窗體上。
import cv2
# 初始化攝像頭
cap = cv2.VideoCapture(0)
while cap.isOpened():
# 采集一幀一幀的圖像資料
isSuccess,frame = cap.read()
# 實時的将采集到的資料顯示到界面上
if isSuccess:
cv2.imshow("My Capture",frame)
# 實作按下“q”鍵退出程式
if cv2.waitKey(1)&0xFF == ord('q'):
break
# 釋放攝像頭資源
cap.release()
cv2.destoryAllWindows()
如此,便可以實時的擷取到攝像頭采集到的資料了。
錄制視訊并儲存
學會了如何采集資料,下一步就是将采集到的資料寫入到一個視訊檔案中。這就涉及到了編碼的問題了,因為将圖檔寫到視訊檔案中需要實時的壓縮,處理。是以我們的電腦上要裝有相應的碼庫。
fourcc問題解決
一開始我是用的fourcc是:
fourcc = cv2.VideoWriter_fourcc(*"XVID")
但是總是不能正确的錄制出視訊檔案,顯示大小為0KB。最後發現是電腦上沒有響應的視訊解碼庫導緻的。
解決辦法:
一開始按照網上的參考資料,說是将out的第二個參數寫為-1,這樣運作的時候會彈出系統擁有的壓縮方式,即可解決。但是在部落客親試之下,完美的失敗了。 :(
第二種方式,部落客親測有效,改變了fourcc的類型。
fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ")
代碼實作
下面看一個完整的錄制視訊的小例子。
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/7'
# __Desc__ = 使用Python借助opencv實作對圖像的讀取,寫入
import cv2
import numpy as np
# 選取攝像頭,0為筆記本内置的攝像頭,1,2···為外接的攝像頭
cap = cv2.VideoCapture(0)
# cap.set(3,1080)
# cap.set(4,720)
# 為儲存視訊做準備
fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ")
# 第三個參數則是鏡頭快慢的,20為正常,小于二十為慢鏡頭
out = cv2.VideoWriter('output2.avi', fourcc,3.0,(640,480))
while True:
# 一幀一幀的擷取圖像
ret,frame = cap.read()
if ret == True:
frame = cv2.flip(frame, 1)
# 在幀上進行操作
# gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# 開始儲存視訊
out.write(frame)
# 顯示結果幀
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 釋放攝像頭資源
cap.release()
out.release()
cv2.destroyAllWindows()
效果展示
親測有效!
總結
本次試驗收獲有:
如何使用OpenCV配合Python實時捕獲攝像頭資料
windows下錄制視訊檔案大小為零的異常
修改圖像顯示窗體大小的兩種方式
錄制視訊的過程中,輸出為快慢鏡頭的調節方式