3. 视频帧保存为图像

视频帧保存为图像 学习卡片

任务目标

从输入视频中按固定帧间隔抽取帧,并将抽取的帧保存为JPEG图像文件。本案例使用OpenCV的VideoCapture读取视频,通过帧计数判断是否到达保存间隔,最终将符合条件的帧写入指定输出目录。

环境依赖

  • Python 3.7+
  • OpenCV:pip install opencv-python

完整实现

import cv2
import os

def extract_frames(video_path, output_dir, interval=30):
    """
    从视频中按指定帧间隔保存JPEG图像

    Args:
        video_path: 输入视频文件路径
        output_dir: 输出图像目录
        interval:   帧间隔,每interval帧保存一帧
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    # 打开视频
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        raise IOError(f"无法打开视频文件: {video_path}")

    frame_count = 0
    saved_count = 0

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 每interval帧保存一次
        if frame_count % interval == 0:
            out_path = os.path.join(output_dir, f"frame_{saved_count:04d}.jpg")
            cv2.imwrite(out_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 95])
            saved_count += 1

        frame_count += 1

    cap.release()
    print(f"处理完成: 共读取 {frame_count} 帧, 保存 {saved_count} 张图像到 {output_dir}")

if __name__ == "__main__":
    # 使用示例
    extract_frames("input_video.mp4", "output_frames", interval=30)

运行方式

  1. 将上述代码保存为 extract_frames.py。
  2. 将待处理的视频文件命名为 input_video.mp4 并放在同一目录下(或修改代码中的路径)。
  3. 执行命令:python extract_frames.py

验证方法

  • 程序运行结束后,检查当前目录下是否生成了 output_frames 文件夹。
  • 打开该文件夹,确认其中包含按 frame_0000.jpg、frame_0001.jpg 顺序编号的JPEG图像文件。
  • 若视频总帧数为N,且间隔为30,则保存的图像数量约为 N/30 + 1 张(首帧始终保存)。
  • 用图片查看器打开任意一张图像,确认画面内容与视频对应时间点的画面一致,且文件可正常打开(非空文件)。

关键说明

  • interval=30 表示每30帧保存一帧,即若视频帧率为30fps,则每秒保存1张图像。可根据需要调整该参数。
  • JPEG质量参数设为95,可在文件大小与画质间取得平衡;如需调整,修改 cv2.IMWRITE_JPEG_QUALITY 后的数值(范围0~100)。
  • 若视频编码格式特殊导致无法打开,请确认OpenCV版本支持该格式,或先使用格式转换工具预处理视频。