原型代碼
- 內存模型:
- 核心變量:
frame
,Numpy ndarray,每次會被覆蓋,大小保持恒定
- 核心變量:
import cv2video_path = 'your_video.mp4'cap = cv2.VideoCapture(video_path)if not cap.isOpened():print("Can't open Video")exit()while True:ret, frame = cap.read()if not ret:break# # 在這里對每一幀進行處理# cv2.imshow('Frame', frame)if cv2.waitKey(25) & OxFF == ord('q'): # 25ms內,有按鈕按下,且按下的按鈕為qbreakcap.release()
cv2.destroyAllWindows()
函數封裝
對其進行一個函數封裝,傳入一個process函數,其對每個frame進行統一的處理,然后輸出一個處理后的視頻。
import cv2
import numpy as np # 用于幀的類型提示
from typing import Callable, Optional # 用于類型提示def process_video_frames( video_file_path: str, frame_processor: Callable[[np.ndarray], np.ndarray], output_path=Optional[str] = None ) -> None:cap = cv2.VideoCaputer(video_path)if not cap.isOpened():print("Can't open Video")exit()# [[OpenCV-獲取視頻屬性]]frame_width, frame_height, fps = get_video_properties(video_capture: cv2.VideoCapture)video_writer = Noneif output_path:fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 定義視頻編碼器video_writer = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))if not video_writer.isOpened():print("Init Video Writer Failed.Processed Video will not be saved")video_writer = Nonewhile True:ret, frame = cap.read()if not ret:break# # 在這里對使用process函數對每一幀進行進行處理processed_frame = frame_processor(current_frame)# 如果輸出視頻寫入器已成功初始化,則寫入處理后的幀if video_writer:# 確保處理后的幀尺寸與原始視頻一致,否則可能無法寫入if processed_frame.shape[:2] != (frame_height, frame_width):print(f"警告: 處理后的幀尺寸 {processed_frame.shape[:2]} 與原始視頻尺寸 "f"{(frame_height, frame_width)} 不匹配。可能導致寫入問題。")video_writer.write(processed_frame) cap.release()if video_writer:video_writer.release()cv2.destroyAllWindows()