Python使用OpenCV提取视频帧保存至指定文件夹问题求助
你的代码存在以下问题:
- 未过滤非视频文件,
os.listdir()会返回目标路径下所有文件和子文件夹,非视频文件会导致cv2.VideoCapture初始化失败,后续逻辑无法运行 - 保存帧的文件夹命名不符合需求,当前代码直接用带后缀的视频文件名当文件夹名,你需要的是
[视频名]_frameimage格式的文件夹 - 生成的帧文件名带视频后缀,比如会生成
video_1.mp4_frame0.jpg,不符合你要的video_1_frame0.jpg格式 cap.release()放在了遍历视频的循环外,只有最后一个视频的句柄会被释放,前面的视频处理完后句柄一直被占用,可能出现资源泄漏- 路径硬编码重复,后续修改存储路径需要改多处,容易出错
修正后可直接运行的代码:
import cv2 import os # 统一配置路径,修改时只需要改这里即可 root_path = "C:/Users/정지원/Desktop/Video_files" # 支持的视频后缀,可根据自己的需求新增 video_suffix = ('.mp4', '.avi', '.mov', '.mkv') # 遍历目标文件夹下所有文件 for video_file in os.listdir(root_path): # 过滤掉非视频文件 if not video_file.lower().endswith(video_suffix): continue # 拆分视频文件名和后缀,用于生成文件夹和帧文件名 video_name = os.path.splitext(video_file)[0] video_full_path = os.path.join(root_path, video_file) # 生成专属存储文件夹路径 frame_save_path = os.path.join(root_path, f"{video_name}_frameimage") # 文件夹不存在则自动创建,exist_ok=True 避免重复创建报错 os.makedirs(frame_save_path, exist_ok=True) cap = cv2.VideoCapture(video_full_path) index = 0 while True: ret, frame = cap.read() # 视频读取结束就退出循环 if not ret: break # 每300帧保存一次,可按需调整间隔 if index % 300 == 0: frame_name = f"{video_name}_frame{index}.jpg" print(f"Creating... {frame_name}") cv2.imwrite(os.path.join(frame_save_path, frame_name), frame) index += 1 # 处理完当前视频立即释放句柄 cap.release() # 销毁所有opencv创建的窗口 cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Freshman_Python
相关产品推荐
相关产品推荐

