書名: 深度學習與計算機視覺:項目式教材作者名: 彭飛 張強編著本章字數: 664字更新時間: 2024-12-11 17:11:51
1.3 任務2:視頻的獲取、顯示和保存
1.3.1 任務描述
基于龍芯平臺,利用OpenCV和本地攝像頭獲取視頻、顯示視頻和保存視頻。
1.3.2 技術準備
在計算機中,視頻資源可以源自專用攝像機、網絡攝像頭,也可以源自本地視頻文件或圖像序列文件。視頻處理的是運動圖像,而不是靜止圖像。OpenCV的VideoCapture類和VideoWriter類是視頻處理中重要的類,提供了視頻處理功能,可以支持多種格式的視頻文件。
VideoCapture類是捕獲視頻對象的類,支持返回獲取的外部視頻對象。通過對返回的外部視頻對象進行讀取,VideoWriter類可用作把視頻對象保存至本地的程序接口,完成視頻的顯示、保存操作。
視頻處理的基本操作步驟如下。
(1)以視頻文件或者攝像頭作為數據源,創建VideoCapture對象。
(2)調用VideoCapture對象的read()方法獲取視頻中的幀,這里每一幀都是一幅圖像。獲取視頻的流程圖如圖1-2所示。

▲圖1-2 獲取視頻的流程圖
(3)調用VideoWriter對象的write()方法將幀寫入指定的視頻文件。保存視頻的流程圖如圖1-3所示。

▲圖1-3 保存視頻的流程圖
1.3.3 任務實施
通過本地攝像頭獲取視頻、顯示視頻并保存視頻的代碼如下。
import cv2 # 通過本地攝像頭獲取視頻并保存至當前文件夾 # 創建VideoCapture對象,視頻源為默認攝像頭0 cap = cv2.VideoCapture(0) # 檢查攝像頭是否成功打開 if (cap.isOpened() == False): print("Error ") # 默認分辨率取決于系統 # 將分辨率從float類型轉換為int類型 frame_width = int(cap.get(3)) frame_height = int(cap.get(4)) # 定義編解碼器并創建VideoWriter對象,把輸出結果存儲在r8c_SaveVideo.avi文件中 out = cv2.VideoWriter('Resources/r8c_SaveVideo.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 35,(frame_width, frame_height)) # 循環讀取視頻幀,直到視頻結束 while True: ret, frame = cap.read() if ret == True: # 將視頻幀寫入文件r8c_SaveVideo.avi out.write(frame) # 顯示視頻幀 cv2.imshow('frame', frame) # 按Q鍵停止記錄 if cv2.waitKey(1) & 0xFF == ord('q'): break # 跳出循環 else: break # 釋放視頻捕獲器以及視頻寫對象 cap.release() out.release() # 關閉所有的窗口 cv2.destroyAllWindows()
視頻獲取與顯示結果如圖1-4所示。

▲圖1-4 視頻獲取與顯示結果