如何使用cv2 VideoCapture从指定起始帧按每分钟1张的频率提取视频帧
自定义视频帧提取实现代码
你可以直接调用OpenCV原生的set方法跳转到指定起始帧,不需要逐帧读取跳过前面的内容,效率很高,完整实现代码如下:
import cv2 # 可配置参数 video_path = r'C:\my_folder\my_video.mp4' save_dir = r'C:\my_folder\pictures/' start_frame = 2700 # 起始提取帧 frame_interval = 1800 # 间隔帧数 extract_count = 30 # 需要提取的总图片数 cap = cv2.VideoCapture(video_path) if not cap.isOpened(): print("视频打开失败") exit() # 直接跳转到起始帧位置 cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame) current_frame = start_frame saved_count = 0 while cap.isOpened() and saved_count < extract_count: ret, frame = cap.read() if not ret: break # 每间隔指定帧数保存 if (current_frame - start_frame) % frame_interval == 0: cv2.imwrite(f"{save_dir}{current_frame}.jpg", frame) saved_count += 1 current_frame += 1 cap.release() cv2.destroyAllWindows()
代码说明
- 直接通过
cap.set(cv2.CAP_PROP_POS_FRAMES, 起始帧)定位到提取起点,避免逐帧跳过前面的内容,不需要提前裁剪视频 - 三个可配置参数可以根据需求灵活调整:
- 要设置结束帧而非提取数量的话,把循环条件改成
current_frame < end_frame即可 - 间隔帧数如果要对应每分钟提取的话,直接用
视频帧率 * 60计算即可,适配不同帧率的视频
- 要设置结束帧而非提取数量的话,把循环条件改成
- 提取到指定数量的图片后会自动终止循环,不会多余读取后续视频内容
内容的提问来源于stack exchange,提问作者Kriszti
相关产品推荐
相关产品推荐

