Python实现视频转图片的两种方案

作者:

文章目录
  • 核心使用 opencv-python(OpenCV)库处理视频和图像,这是Python视觉处理的主流库,先通过pip安装:
  • 适合大多数标注场景,可灵活设置提取间隔,避免图片过多冗余。
  • 适合需要按固定时间间隔(如每2秒提取1张)的场景,比按帧间隔更直观,不受视频帧率影响。
  • 视频路径问题: 若使用相对路径,需将视频文件放在Python脚本同一目录下; 绝对路径示例(Windows):"D:/videos/test.mp4",(Linux/Mac):"/home/user/videos/test.mp4"; 图片冗余控制: 标注时无需提取所有帧,建议按1~3秒间隔提取,避免图片过多增加标注工作量; 若视频画面变化缓慢(如监控视频),可增大间隔(如5~10秒); 编码问题处理: 若出现“无法打开视频”或“保存图片失败”,大概率是视频编码不兼容,可先用FFmpeg转换为MP4格式(ffmpeg -i input.avi -c:v libx264 output.mp4); 内存占用: 处理超长视频时,无需担心内存溢出,代码逐帧读取并保存,不会缓存全部帧。
  • 转换后的图片可使用以下主流标注工具进行标注: LabelImg:轻量级图形化标注工具,支持VOC/YOLO格式,适合目标检测标注; LabelMe:支持多边形、关键点等复杂标注,适合语义分割、实例分割标注; CVAT:工业级标注平台,支持批量标注、多人协作,适合大规模数据集标注。 以上就是Python实现视频转图片的两种方案的详细内容,更多关于Python视频转图片的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 基于Python实现合并多张图片转成mp4视频 Python将视频转换为图片介绍 Python实现图片和视频的相互转换 Python实现图片与视频互转代码实战(亲测有效) 如何用python反转图片,视频
  • 目录
    • 一、前期准备:安装依赖库
    • 二、方案1:基础版 – 按帧提取(提取所有帧/每隔N帧提取)
      • 完整代码
    • 三、方案2:进阶版 – 按时间间隔提取(更精准可控)
      • 完整代码
    • 四、核心功能说明
      • 1. 关键函数与参数
      • 2. 实用优化点
    • 五、使用注意事项
      • 六、标注工具推荐

        核心使用 opencv-python(OpenCV)库处理视频和图像,这是Python视觉处理的主流库,先通过pip安装:

        适合大多数标注场景,可灵活设置提取间隔,避免图片过多冗余。

        import cv2
        import os
        
        def video_to_images_basic(
            video_path,          # 输入视频文件路径(如:test.mp4)
            output_dir,          # 输出图片文件夹路径
            frame_interval=30,   # 提取间隔:每30帧提取1张(默认30帧,对应1秒/帧,可调整)
            img_format="jpg",    # 输出图片格式(jpg/png,推荐jpg,占用空间小)
            img_prefix="frame"   # 图片文件名前缀(如:frame_0001.jpg)
        ):
            # 1. 创建输出文件夹(若不存在则自动创建)
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
                print(f"创建输出文件夹:{output_dir}")
        
            # 2. 打开视频文件
            cap = cv2.VideoCapture(video_path)
            if not cap.isOpened():
                raise ValueError(f"无法打开视频文件:{video_path}")
        
            # 3. 获取视频基本信息
            total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 视频总帧数
            fps = cap.get(cv2.CAP_PROP_FPS)                        # 视频帧率(每秒帧数)
            print(f"视频信息:总帧数={total_frames},帧率={fps:.2f},预计提取图片数={total_frames//frame_interval + 1}")
        
            # 4. 循环提取帧并保存
            frame_count = 0  # 当前帧计数器
            saved_count = 0  # 已保存图片计数器
        
            while True:
                # 读取一帧视频
                ret, frame = cap.read()
        
                # 若读取失败(已到视频末尾),退出循环
                if not ret:
                    break
        
                # 按间隔提取帧
                if frame_count % frame_interval == 0:
                    # 构造图片文件名(补零对齐,方便排序)
                    img_name = f"{img_prefix}_{saved_count:04d}.{img_format}"
                    img_path = os.path.join(output_dir, img_name)
        
                    # 保存图片
                    cv2.imwrite(img_path, frame)
                    print(f"已保存:{img_path}")
        
                    saved_count += 1
        
                frame_count += 1
        
            # 5. 释放资源
            cap.release()
            print(f"n转换完成!共保存 {saved_count} 张图片,存储路径:{output_dir}")
        
        # ------------------- 调用示例 -------------------
        if __name__ == "__main__":
            # 配置参数
            VIDEO_PATH = "input_video.mp4"  # 你的视频文件路径
            OUTPUT_DIR = "extracted_images" # 图片输出文件夹
            FRAME_INTERVAL = 30             # 每30帧提取1张(1秒1张,若视频帧率25,则每1.2秒1张)
        
            # 执行转换
            video_to_images_basic(
                video_path=VIDEO_PATH,
                output_dir=OUTPUT_DIR,
                frame_interval=FRAME_INTERVAL,
                img_format="jpg"
            )
        

        适合需要按固定时间间隔(如每2秒提取1张)的场景,比按帧间隔更直观,不受视频帧率影响。

        import cv2
        import os
        
        def video_to_images_by_time(
            video_path,          # 输入视频文件路径
            output_dir,          # 输出图片文件夹路径
            time_interval=1.0,   # 时间间隔:每1.0秒提取1张(可调整,如2.0=每2秒1张)
            img_format="jpg",    # 输出图片格式
            img_prefix="frame"   # 图片文件名前缀
        ):
            # 1. 创建输出文件夹
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
                print(f"创建输出文件夹:{output_dir}")
        
            # 2. 打开视频文件
            cap = cv2.VideoCapture(video_path)
            if not cap.isOpened():
                raise ValueError(f"无法打开视频文件:{video_path}")
        
            # 3. 获取视频基本信息
            total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
            fps = cap.get(cv2.CAP_PROP_FPS)
            video_duration = total_frames / fps  # 视频总时长(秒)
            frame_interval = int(fps * time_interval)  # 换算为帧间隔
        
            print(f"视频信息:总帧数={total_frames},帧率={fps:.2f},总时长={video_duration:.2f}秒")
            print(f"时间间隔={time_interval}秒,对应帧间隔={frame_interval}帧,预计提取图片数={int(video_duration//time_interval) + 1}")
        
            # 4. 循环提取帧并保存
            frame_count = 0
            saved_count = 0
            last_saved_time = 0.0  # 上一次保存图片的时间
        
            while True:
                ret, frame = cap.read()
                if not ret:
                    break
        
                # 获取当前帧对应的时间(秒)
                current_time = frame_count / fps
        
                # 按时间间隔保存
                if current_time - last_saved_time >= time_interval:
                    img_name = f"{img_prefix}_{saved_count:04d}.{img_format}"
                    img_path = os.path.join(output_dir, img_name)
                    cv2.imwrite(img_path, frame)
                    print(f"时间{current_time:.2f}秒:已保存 {img_path}")
        
                    saved_count += 1
                    last_saved_time = current_time
        
                frame_count += 1
        
            # 5. 释放资源
            cap.release()
            print(f"n转换完成!共保存 {saved_count} 张图片,存储路径:{output_dir}")
        
        # ------------------- 调用示例 -------------------
        if __name__ == "__main__":
            VIDEO_PATH = "input_video.mp4"
            OUTPUT_DIR = "extracted_images_by_time"
            TIME_INTERVAL = 2.0  # 每2秒提取1张图片
        
            video_to_images_by_time(
                video_path=VIDEO_PATH,
                output_dir=OUTPUT_DIR,
                time_interval=TIME_INTERVAL,
                img_format="jpg"
            )
        

        • cv2.VideoCapture(video_path):打开视频文件,返回视频捕获对象;
        • cap.read():读取一帧视频,返回(ret, frame)ret为布尔值(是否读取成功),frame为当前帧图像(numpy数组);
        • cap.get(cv2.CAP_PROP_FRAME_COUNT):获取视频总帧数;
        • cap.get(cv2.CAP_PROP_FPS):获取视频帧率(每秒播放的帧数);
        • cv2.imwrite(img_path, frame):将帧图像保存为图片文件;
        • 核心参数调整:
          • frame_interval(方案1):帧间隔,数值越大提取图片越少,推荐30(对应1秒1张);
          • time_interval(方案2):时间间隔,按需设置(如0.5=每0.5秒1张,5.0=每5秒1张)。

        • 文件夹自动创建:无需手动创建输出文件夹,代码会自动判断并创建;
        • 文件名补零对齐:图片名格式为frame_0001.jpg,方便后续标注软件按顺序加载;
        • 格式灵活选择:支持jpg(占用空间小)和png(无损压缩,适合高精度标注);
        • 进度打印:实时打印保存路径,方便查看转换进度;
        • 资源释放:使用cap.release()释放视频资源,避免内存泄漏。

        1. 视频路径问题
          • 若使用相对路径,需将视频文件放在Python脚本同一目录下;
          • 绝对路径示例(Windows):"D:/videos/test.mp4",(Linux/Mac):"/home/user/videos/test.mp4"
        2. 图片冗余控制
          • 标注时无需提取所有帧,建议按1~3秒间隔提取,避免图片过多增加标注工作量;
          • 若视频画面变化缓慢(如监控视频),可增大间隔(如5~10秒);
        3. 编码问题处理
          • 若出现“无法打开视频”或“保存图片失败”,大概率是视频编码不兼容,可先用FFmpeg转换为MP4格式(ffmpeg -i input.avi -c:v libx264 output.mp4);
        4. 内存占用
          • 处理超长视频时,无需担心内存溢出,代码逐帧读取并保存,不会缓存全部帧。

        转换后的图片可使用以下主流标注工具进行标注:

        1. LabelImg:轻量级图形化标注工具,支持VOC/YOLO格式,适合目标检测标注;
        2. LabelMe:支持多边形、关键点等复杂标注,适合语义分割、实例分割标注;
        3. CVAT:工业级标注平台,支持批量标注、多人协作,适合大规模数据集标注。

        以上就是Python实现视频转图片的两种方案的详细内容,更多关于Python视频转图片的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • 基于Python实现合并多张图片转成mp4视频
        • Python将视频转换为图片介绍
        • Python实现图片和视频的相互转换
        • Python实现图片与视频互转代码实战(亲测有效)
        • 如何用python反转图片,视频

        站内搜索