上篇文章我們學習了圖片的數據采集,今天主要了解一下視頻數據采集的方法。視頻是由一系列圖像構成的,其中每一張圖片就是一幀。視頻數據采集方法通常有自動圖像采集和基于處理器的圖像采集兩種。我們學習一下如何利用python 工具和筆記本計算機攝像頭進行視頻數據的實時采集。
1、基礎操作方法
在Python中使用OpenCV庫錄制視頻是一種常見的需求,尤其是在進行視頻處理、機器視覺項目或教學視頻錄制時。OpenCV(Open Source Computer Vision Library)提供了強大的視頻處理功能,包括視頻錄制。
1)cv2.VideoWriter()方法
cv2.VideoWriter(video_file_name,fourcc,fps,frameSize[,isColor])
video_file_name:創建寫入對象,錄制視頻的名稱
fourcc:用來指定視頻的編碼格式,每個編/解碼器都有一個4字符標記
fps:視頻的幀速率,指視頻每秒多少幀
frameSize:錄制視頻的窗口大小(長和寬)
isColor:判斷是否為彩色圖像,非零為彩色幀,否在為灰度幀
2)fourcc常用編碼格式
在OpenCV中,fourcc通常是一個四字符代碼,用于標識不同的編解碼器。例如:
- 'XVID'?通常用于MP4文件,特別是在使用x264編解碼器時。
- 'DIVX'?也是一個常用的編解碼器,特別是在較老的系統中。
- 'X264'?用于H.264編碼,這是一種廣泛使用的視頻編碼格式。
- 'MJPG'?用于Motion JPEG編碼,通常用于.avi文件。
舉例說明:
# 定義視頻編解碼器和創建VideoWriter對象
# 參數分別是:輸出文件名,編解碼器,幀率,幀大小,是否為彩色
fourcc = cv2.VideoWriter_fourcc(*'XVID')? # 或者使用'MJPG', 'X264', 'DIVX'等
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
3)cv2.VideoCapture.get()方法
cv2.VideoCapture.get()?是 OpenCV 庫中用于獲取視頻捕獲設備(例如攝像頭或視頻文件)的屬性值的方法。這個方法非常有用,因為它允許你訪問和調整攝像頭的各種參數,比如幀寬、幀高、幀率等。
獲取攝像頭的幀寬和幀高
import cv2
# 創建一個VideoCapture對象,0通常是內置攝像頭的索引
cap = cv2.VideoCapture(0)
# 獲取攝像頭的幀寬和幀高
frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(f"Frame width: {frame_width}")
print(f"Frame height: {frame_height}")
# 釋放VideoCapture對象
cap.release()
獲取攝像頭的幀率
import cv2
# 創建一個VideoCapture對象,0通常是內置攝像頭的索引
cap = cv2.VideoCapture(0)
# 獲取攝像頭的幀率
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"Frame rate: {fps}")
# 釋放VideoCapture對象
cap.release()
2、舉例說明
我們試著通過通過筆記本攝像頭錄一段視頻:
錄制視頻并保存的基本步驟如下:
1)使用cv2.VideoCapture(0)來獲取默認攝像頭。
2)使用cv2.VideoWriter來創建視頻寫入對象。
3)循環讀取攝像頭的幀,并使用write方法寫入視頻文件。
4)當不再需要視頻寫入對象時,使用release方法釋放資源。
import cv2??? #導入CV2庫來使用
video_dir ="D:\\dewi\\project2024\\myListPractice\\pythonProject1\\test_data\\get_videos\\"
file_name = "005.avi"
video_file_name = video_dir + file_name
cap = cv2.VideoCapture(0)? #開啟攝像頭,0指筆記本內置攝像頭
#設置視頻的寬度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
#創建視頻寫入對象
out_video = cv2.VideoWriter(video_file_name,
??????????????????????????? cv2.VideoWriter_fourcc("D","I","V","X"),
??????????????????????????? 20,(frame_width,frame_height))
??
while True:
??? ret,frame = cap.read()? #捕獲幀信息
??? if ret:
??????? out_video.write(frame)
??????? print("寫入成功")
??? else:
??????? print("獲取圖片出錯了!")
??????? break
cap.release()? #釋放攝像頭
out_video.release()? #釋放視頻對象
cv2.destroyAllWindows()? #關閉所有圖像窗口
3、進階練習
在上一個練習的基礎上,我們錄取10段視頻,每秒鐘30幀圖片。參考代碼:
import cv2??? #導入CV2庫來使用
import time
video_dir ="D:\\dewi\\project2024\\myListPractice\\pythonProject1\\test_data\\get_videos\\"
cap = cv2.VideoCapture(0)? #開啟攝像頭,0指筆記本內置攝像頭
#設置視頻的寬度和高度,幀率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
for seg in range(10):??? #獲取10段視頻
??? # 獲取當前系統時間戳(秒)
??? current_timestamp = time.time()
??? # 轉換為本地時間
??? current_time = time.localtime(current_timestamp)
??? # 格式化輸出
??? formatted_time = time.strftime("%Y-%m-%d_%H%M%S", current_time)
??? file_name = f"video_{formatted_time}.avi"? #視頻名稱添加當前時間的時間戳
??? video_file_name = video_dir + file_name
??? #創建視頻寫入對象
??? out_video = cv2.VideoWriter(video_file_name,
??????????????????????????? cv2.VideoWriter_fourcc(*"XVID"),
??????????????????????????? fps,(frame_width,frame_height))
??? for count in range(300):? #每段視頻為10秒,需要300幀數據,30幀/秒
??????? ret,frame = cap.read()? #捕獲幀信息
??????? if ret:
??????????? out_video.write(frame)
??????????? #print("寫入成功")
??????? else:
??????????? print("獲取圖片出錯了!")
??????????? break
??? print(f"第{seg+1}段視頻錄制(fps:{fps})成功:",file_name)
??? out_video.release()
cap.release()
cv2.destroyAllWindows()
執行結果參考:
第1段視頻錄制成功: video_2025-03-30_181125.avi
第2段視頻錄制成功: video_2025-03-30_181136.avi
第3段視頻錄制成功: video_2025-03-30_181146.avi
……
在對應的文件夾下看到了錄制的10段視頻。
每天進步一點點,繼續加油!