點贊 + 關注 + 收藏 = 學會了
推薦關注 《OpenCV-Python專欄》
上一講介紹了 OpenCV 的讀取圖片的方法,這一講簡單聊聊 OpenCV 讀取和保存視頻。
視頻的來源主要有2種,一種是本地視頻文件,另一種是實時視頻流,比如手機和電腦的攝像頭。
要讀取這兩種視頻的方法都是一樣的,只是傳的參數不同而已。
讀取攝像頭視頻
讀取攝像頭的內容並顯示出來需要幾步
- 獲取攝像頭內容
- 逐幀渲染
import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened():
# 獲取一幀
ret, frame = cap.read()
if not ret:
print("找不到攝像頭")
break # 如果讀取失敗(如視頻結束),退出循環
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# 釋放攝像頭資源並關閉所有窗口
cap.release()
cv2.destroyAllWindows()
解讀一下上面的代碼。
- 通過
cv2.VideoCapture(0)讀取視頻,傳入參數 0 表示打開默認攝像頭。對於有多個攝像頭的設備,可以使用 1、2 等參數指定其他攝像頭。 - 使用
cap.isOpened()檢查攝像頭是否成功打開。如果失敗,程序將退出。 cap.read()可以讀取視頻裏的1幀,ret表示讀取是否成功,frame包含圖像數據。- 1幀只有1個畫面,所以通過
while循環不斷讀取視頻流的內容。 - 將
cv2.waitKey(1)設置為 1 毫秒的延時,這樣可以實現幾乎實時的顯示效果。 - 最後通過
cv2.waitKey(1) == ord('q')判斷用户有沒有按下“q”鍵,如果按下了就退出循環,然後關閉所有窗口釋放資源。
讀取本地視頻文件
讀取本地視頻文件的操作流程和讀取攝像頭視頻流差不多,最主要的區別是 cv2.waitKey() 裏需要傳入的數值。
import cv2
input_video_path = "./01.mov" # 輸入視頻路徑
cap = cv2.VideoCapture(input_video_path)
while cap.isOpened():
# 獲取一幀
ret, frame = cap.read()
if not ret:
print("找不到視頻")
break # 如果讀取失敗(如視頻結束),退出循環
cv2.imshow('frame', frame)
if cv2.waitKey(30) == ord('q'):
break
# 釋放攝像頭資源並關閉所有窗口
cap.release()
cv2.destroyAllWindows()
input_video_path存放本地視頻的文件地址,需要包含文件類型的後綴名。- 把視頻地址丟進
cv2.VideoCapture()裏就可以讀取到這個視頻了。 while裏的操作和前面讀取攝像頭視頻流一樣,唯一區別是cv2.waitKey(30),這裏我傳入了30,這表示每一幀的顯示時間是30毫秒,這樣視頻播放速度就比較正常。
保存視頻
不管是將攝像頭的視頻保存到本地,還是在本地視頻增加一點濾鏡再保存到本地,操作都是一樣的。
主要有以下幾步操作:
- 獲取視頻源
- 設置要輸出的視頻路徑、參數(寬、高、幀率)
- 逐幀保存視頻
舉個例子,我要將一個彩色的視頻轉成黑白視頻再保存到本地。
import cv2
# 指定本地視頻路徑和輸出路徑
input_video_path = "01.mov" # 輸入視頻路徑
output_video_path = "01_gray.mp4" # 輸出灰度視頻路徑
# 打開輸入視頻文件
cap = cv2.VideoCapture(input_video_path)
# 檢查視頻是否成功打開
if not cap.isOpened():
print("Error: Could not open video.")
exit()
# 獲取原視頻的寬度、高度和幀率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# 創建 VideoWriter 對象,用於保存灰度視頻
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 視頻編碼格式
out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height), isColor=False)
# 逐幀讀取視頻、轉換為灰度並保存
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 將幀轉換為灰度圖像
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 保存灰度幀到輸出視頻
out.write(gray_frame)
# 顯示灰度幀(可選)
cv2.imshow("Gray Video", gray_frame)
# 設置退出條件:按下 'q' 鍵退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放視頻資源並關閉所有窗口
cap.release()
cv2.destroyAllWindows()
説明一下上面的代碼。
- 讀取視頻:
cv2.VideoCapture(input_video_path)用於讀取視頻文件。 - 獲取視頻屬性:如幀寬度、高度和幀率等,用於配置輸出視頻。
-
創建輸出視頻:
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)用於創建保存視頻的對象。cv2.VideoWriter的output_video_path參數用來指定保存視頻文件的路徑。-
fourcc表示視頻編碼格式的四字符代碼,常用的格式有:cv2.VideoWriter_fourcc(*'XVID'): 常用於 .avi 格式的視頻,跨平台兼容性較好。cv2.VideoWriter_fourcc(*'MJPG'): 使用 Motion JPEG 編碼,也可以用於 .avi 格式。cv2.VideoWriter_fourcc(*'mp4v'): 常用於 .mp4 格式的視頻。cv2.VideoWriter_fourcc(*'DIVX'): 支持 .avi 格式。
fps表示視頻的幀率,即每秒幀數(Frames Per Second)。幀率決定視頻的播放速度和流暢度。常用的幀率數值有24、30、60。在上面的例子中使用的是原視頻的幀率。frameSize用於設置輸出視頻幀的寬度和高度,單位是像素。isColor指示視頻是否是彩色。默認是True表示才是。
- 循環讀取和保存幀:每一幀讀取後可以對幀進行處理,然後寫入到輸出視頻中。
- 釋放資源:處理完成後釋放資源,確保文件保存正確。
以上就是本文的全部內容。加上上一篇介紹如何讀取和保存圖片,學習 OpenCV 需要的“材料”已經準備好了。接下來幾講都是介紹 OpenCV 的基礎用法,也就是學習“如何加工這些材料”。基礎紮實後再講解幾個實戰案例。
點贊 + 關注 + 收藏 = 學會了