如何实现文件目录下多视频批量帧提取并保持帧编号全局连续?
批量视频帧全局连续编号提取方案
原有代码问题梳理
- 变量拼写错误:循环遍历的变量写为
intput_filenames,存在多打字母n的拼写错误 - 未正确获取视频文件列表:
input_filenames赋值为目录路径字符串,直接遍历字符串只会逐个返回字符,无法读取到目录下的视频文件 - 缺少输出路径管理:提取的帧会默认保存到当前工作目录,没有统一归档
- 预览等待逻辑不适配批量场景:每张帧等待100ms的逻辑如果是批量提取大量视频会非常耗时,仅适合小量测试
修正后可直接运行的代码
import cv2 import os # 全局配置参数 start_index = 1 # 帧编号起始值 video_dir = 'Dataset/videos' # 视频存放目录 frame_output_dir = 'Dataset/extracted_frames' # 帧输出目录 supported_formats = ('.mp4', '.avi', '.mov', '.mkv', '.flv') # 支持的视频格式 enable_preview = False # 是否开启帧预览,批量提取建议关闭 # 初始化输出目录 os.makedirs(frame_output_dir, exist_ok=True) current_idx = start_index # 遍历目录下所有视频文件 for filename in os.listdir(video_dir): if not filename.lower().endswith(supported_formats): continue video_path = os.path.join(video_dir, filename) cap = cv2.VideoCapture(video_path) while True: ret, frame = cap.read() if not ret: break # 保存帧,可调整命名格式,比如补6位零的写法:f"{current_idx:06d}.jpg" frame_save_path = os.path.join(frame_output_dir, f"{current_idx}.jpg") cv2.imwrite(frame_save_path, frame) # 预览逻辑 if enable_preview: cv2.imshow('frame', frame) cv2.waitKey(100) current_idx += 1 cap.release() # 关闭所有预览窗口 if enable_preview: cv2.destroyAllWindows()
补充说明
- 如果需要让帧按固定长度补零(比如000001.jpg、000002.jpg,避免系统按字符串排序时出现1.jpg排在10.jpg之后的问题),可以将保存时的文件名改为
f"{current_idx:06d}.jpg",数字6代表总位数,可自行调整 - 可通过修改
supported_formats元组新增支持的视频格式 - 批量提取时关闭
enable_preview可大幅提升提取速度
内容的提问来源于stack exchange,提问作者Abhishek Srivastava
相关产品推荐
相关产品推荐

