? ? 老猿Python博文目錄:https://blog.csdn.net/LaoYuanPython ?
用Python通過攝像頭進行視頻錄制
一、引言
要實作攝像頭錄播攝像資訊,通過Python有很多種實作方式,老猿在此介紹的是OpenCV-Python的實作方式,
很多人都知道OpenCV是個影像處理軟體,但其實OpenCV也是可以處理視頻的,因為視頻是一幀幀影像構成的,OpenCV通過VideoCapture類可以實作視頻檔案或攝像頭資訊讀取,通過VideoWriter可以寫入視頻,
二、VideoCapture讀取視頻
VideoCapture既支持從視頻檔案(.avi , .mpg格式)讀取,也支持直接從攝像機(比如電腦自帶攝像頭)中讀取,VideoCapture是一個類,要想獲取視頻需要先創建一個VideoCapture物件,VideoCapture物件的創建方式有以下三種:
- VideoCapture(deviceIndex,apiPreference = CAP_ANY):打開攝像頭捕獲視頻,deviceIndex為攝像頭序列號,打開預設攝像頭傳0,apiPreference 為VideoCapture API后端識別符號,老猿沒有仔細研究,用預設值即可
- VideoCapture(filename,apiPreference = CAP_ANY):打開filename指定的視頻檔案
- VideoCapture():創建一個物件,但沒有確認捕獲資料來源,需要通過VideoCapture其他方法來確認捕獲資料來源
更多VideoCapture的內容請參考《opencv學習—VideoCapture 類基礎知識》,
三、VideoWriter寫入視頻
VideoWriter是個視頻寫入類,用于將一幀幀影像寫入視頻檔案中,VideoWriter共有五個構造方法,在本文重點推薦如下構造方法:
VideoWriter(filename, fourcc, fps, frameSize, bool isColor = True)
相關引數分別為視頻檔案名、視頻編碼格式、幀率、視頻幀大小、是否彩色,
視頻編碼格式引數fourcc相關取值及含義主要有如下:
CV_FOURCC('I','4','2','0') :未壓縮的YUV編碼,4:2:0色度子采樣,這種編碼廣泛兼容,但會產生大檔案,檔案擴展名應為.avi
CV_FOURCC('P','I','M','1') :MPEG-1編碼,檔案擴展名應為.avi,
CV_FOURCC('X','V','I','D') :相對較舊的MPEG-4編碼,如果要限制結果視頻的大小,這是一個很好的選擇,檔案擴展名應為.avi,
CV_FOURCC('M','P','4','V') :另一個相對較舊的MPEG-4編碼,如果要限制結果視頻的大小,這是一個很好的選擇,檔案擴展名應為.mp4
CV_FOURCC('X','2','6','4'): 一種比較新的MPEG-4編碼方式,如果你想限制結果視頻的大小,這可能是最好的選擇,檔案擴展名應為.mp4
CV_FOURCC('F','L','V','1') :此選項為Flash視頻,檔案擴展名應為.flv
以上表達方式結合Python函式的分配引數功能,可以將4個字母用分配引數(呼叫函式傳遞實參時使用星號來傳遞多個引數,相關介紹請參考《python基礎教程 https://blog.csdn.net/laoyuanpython/category_9831699.html》的《 第5.3節 詳說Python風格的函式分配引數 https://blog.csdn.net/LaoYuanPython/article/details/90670154》)的形參方式表示,如:CV_FOURCC('X','V','I','D')可以寫成CV_FOURCC(*'XVID')
四、捕獲攝像頭輸入寫入視頻檔案的代碼案例
下面的代碼打開預設攝像頭捕獲視頻,并將捕獲內容顯示為視窗視頻,并寫入視頻檔案中保存,按q終止退出:
import cv2
def captureVideoFromCamera():
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
WIDTH = 1920
HEIGHT = 1920
FILENAME = r'f:\video\myvideo.avi'
FPS = 24
cap.set(cv2.CAP_PROP_FPS, 24)
# 建議使用XVID編碼,影像質量和檔案大小比較都兼顧的方案
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(FILENAME, fourcc=fourcc, fps=FPS,frameSize=(WIDTH,HEIGHT))
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# 逐幀捕獲
ret, frame = cap.read()
# 如果正確讀取幀,ret為True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv2.flip(frame, 1) # 水平翻轉
ret = out.write(frame)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 顯示結果幀e
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'): break
# 完成所有操作后,釋放捕獲器
out.release()
cap.release()
cv2.destroyAllWindows()
captureVideoFromCamera()
五、小結
本文介紹了使用OpenCV-Python操作視頻的方案,介紹了視頻讀取和寫入類的構造方法,并提供了一個讀取攝像頭視頻寫入視頻檔案的方法,有助于大家理解OpenCV-Python的視頻操作相關方法,但需要強調的是,OpenCV是一個強大的計算機影像處理庫,而不是視頻流編碼器或者解碼器,它的長項不在于此,只是提供了這種能力而已,如果要針對多媒體檔案做復雜的處理,推薦的還是 FFMEPG 或Moviepy庫,
各位大神,你用程式實作過視頻錄播嗎?有什么更簡單的方法嗎?另外說OpenCV這種方式生成的視頻檔案限制檔案大小為2G,老猿沒有驗證過,不知是否有大神愿意指教,
寫博不易,如果覺得本文還有點作用,大家能否幫忙集齊10個贊、10條評論?
更多影像處理的介紹請參考專欄《OpenCV-Python圖形影像處理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初學者疑難問題集》相關文章,
老猿Python, 跟老猿學Python!
? ? 前往老猿Python博文目錄 https://blog.csdn.net/LaoYuanPython ?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277462.html
標籤:AI
