长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机视觉

    • 基本环境搭建
    • 数据集制作-FFMPEG从视频提取关键帧
      • 方法1:单行命令
        • 使用ffmpeg提取I帧
        • 使用ffmpeg提取I帧并修改图像大小
        • 输出PNG格式
        • 命令详解:
        • 输出JPEG格式
      • 方法2:Python集成方案
        • 参数解释:
        • 高级特性:
        • 注意事项:
    • 数据集制作-图像分类
    • 数据集制作-目标检测
    • 数据集制作-LabelImg的使用
    • ResNet50部署和微调
    • MobileNet部署和微调
    • YOLO部署和微调
    • Janus-Pro部署和使用
  • ESP32开发

  • Linux系统移植

  • 快速开始

  • 编程小知识

  • 技术
  • 计算机视觉
DC Wang
2025-06-07
目录

数据集制作-FFMPEG从视频提取关键帧

# 数据集制作-ffmpeg从视频提取关键帧

使用ffmpeg从视频中提取关键帧(I帧)并处理为固定尺寸的图像,并输出为PNG或JPEG格式。

# 方法1:单行命令

# 使用ffmpeg提取I帧

# 使用FFmpeg提取I帧
ffmpeg -skip_frame nokey -i input.mp4 -vsync 0 out/frame_%03d.jpg
1
2

# 使用ffmpeg提取I帧并修改图像大小

# 输出PNG格式

ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I),scale=w=244:h=244:force_original_aspect_ratio=1,pad=244:244:(ow-iw)/2:(oh-ih)/2:color=gray" -vsync vfr out/output_%03d.png
1
# 命令详解:
  1. select=eq(pict_type\,I) 选择所有I帧(关键帧)。
  2. scale=w=244:h=244:force_original_aspect_ratio=1 将图像缩放至目标尺寸(244x244),force_original_aspect_ratio=1(缩写:force_original_aspect_ratio=decrease)确保缩放后保持原始宽高比,图像不会变形。
  3. pad=244:244:(ow-iw)/2:(oh-ih)/2:color=gray 将缩放后的图像填充至244x244:
    • (ow-iw)/2 和 (oh-ih)/2:自动计算左右/上下填充,使图像居中。
    • color=gray:使用灰色(十六进制 #808080)填充空白区域。
  4. -vsync vfr 确保输出帧率与输入I帧的实际频率一致(可变帧率)。
  5. output_%03d.png 输出文件名格式(例如:output_001.png,output_002.png等),使用PNG格式保留无损质量。如需JPEG,可替换为.jpg并添加-q:v 2控制质量(值越小质量越高)。

# 输出JPEG格式

ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I),scale=244:244:force_original_aspect_ratio=1,pad=244:244:(ow-iw)/2:(oh-ih)/2:color=#808080" -vsync vfr -q:v 2 output_%03d.jpg
1

# 方法2:Python集成方案

import subprocess
import os

def extract_i_frames(input_video, output_dir="output", size=244, color="gray", img_format="png"):
    """
    提取视频的 I 帧并处理为固定尺寸
    
    参数:
    input_video: 输入视频文件路径
    output_dir: 输出目录 (默认: "output")
    size: 输出图像尺寸 (默认: 244)
    color: 填充颜色 (默认: "gray",支持颜色名称或十六进制值)
    img_format: 输出格式 (默认: "png",支持 png/jpg)
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 构建输出路径模板
    output_template = os.path.join(output_dir, f"frame_%03d.{img_format}")
    
    # 构建 FFmpeg 命令
    command = [
        "ffmpeg",
        "-i", input_video,
        "-vf", f"select=eq(pict_type\\,I),"  # 选择 I 帧
               f"scale={size}:{size}:force_original_aspect_ratio=1,"  # 等比缩放
               f"pad={size}:{size}:(ow-iw)/2:(oh-ih)/2:color={color}",  # 填充颜色
        "-vsync", "vfr",  # 可变帧率输出
    ]
    
    # 根据格式添加质量参数
    if img_format == "jpg":
        command.extend(["-q:v", "2"])  # JPG 质量设置 (1-31, 2=高质量)
    
    command.append(output_template)
    
    try:
        # 运行 FFmpeg 命令
        subprocess.run(command, check=True)
        print(f"成功提取 {len(os.listdir(output_dir))} 个 I 帧到 {output_dir} 目录")
    except subprocess.CalledProcessError as e:
        print(f"处理失败: {e}")
    except FileNotFoundError:
        print("错误: 未找到 ffmpeg,请确保已安装 FFmpeg 并添加到系统路径")

if __name__ == "__main__":
    # 示例使用
    extract_i_frames(
        input_video="input.mp4",  # 输入视频文件
        output_dir="iframes",      # 输出目录
        size=244,                 # 图像尺寸
        color="#808080",           # 灰色填充 (支持英文名或十六进制)
        img_format="png"           # 输出格式
    )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# 参数解释:

  • input_video:输入视频文件路径(必需)
  • output_dir:输出目录(默认:"output")
  • size:输出图片尺寸(默认:244)
  • color:填充颜色(支持:颜色名称如"gray"/十六进制值如"#808080")
  • img_format:输出格式("png" 或 "jpg",默认 PNG)

# 高级特性:

  1. 自动创建输出目录:如果输出目录不存在会自动创建
  2. 智能命名:输出文件按序列命名(frame_001.png)
  3. 错误处理:捕获常见错误(FFmpeg 未安装/处理失败)
  4. 质量控制:JPG 输出自动使用高质量压缩

# 注意事项:

  1. 确保系统已安装 FFmpeg
  2. Windows 系统需将 FFmpeg 添加到 PATH 环境变量
  3. 对于大批量视频处理,建议增加日志记录功能
编辑 (opens new window)
#AI#CV#Python
上次更新: 2025/06/07, 21:53:36
基本环境搭建
数据集制作-图像分类

← 基本环境搭建 数据集制作-图像分类→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式