You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:15:01