news 2026/10/24 10:39:05

【PYTHON】视频转图片

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【PYTHON】视频转图片

【PYTHON】视频转图片

    • 一、前期准备:安装依赖库
    • 二、方案1:基础版 - 按帧提取(提取所有帧/每隔N帧提取)
      • 完整代码
    • 三、方案2:进阶版 - 按时间间隔提取(更精准可控)
      • 完整代码
    • 四、核心功能说明
      • 1. 关键函数与参数
      • 2. 实用优化点
    • 五、使用注意事项
    • 六、标注工具推荐

一、前期准备:安装依赖库

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

# 安装opencv-pythonpipinstallopencv-python# 若需处理特殊视频格式(如MP4编码问题),可额外安装ffmpeg(可选)# Windows:下载ffmpeg并配置环境变量;Ubuntu:sudo apt install ffmpeg;Mac:brew install ffmpeg

二、方案1:基础版 - 按帧提取(提取所有帧/每隔N帧提取)

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

完整代码

importcv2importosdefvideo_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. 创建输出文件夹(若不存在则自动创建)ifnotos.path.exists(output_dir):os.makedirs(output_dir)print(f"创建输出文件夹:{output_dir}")# 2. 打开视频文件cap=cv2.VideoCapture(video_path)ifnotcap.isOpened():raiseValueError(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# 已保存图片计数器whileTrue:# 读取一帧视频ret,frame=cap.read()# 若读取失败(已到视频末尾),退出循环ifnotret:break# 按间隔提取帧ifframe_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+=1frame_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:进阶版 - 按时间间隔提取(更精准可控)

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

完整代码

importcv2importosdefvideo_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. 创建输出文件夹ifnotos.path.exists(output_dir):os.makedirs(output_dir)print(f"创建输出文件夹:{output_dir}")# 2. 打开视频文件cap=cv2.VideoCapture(video_path)ifnotcap.isOpened():raiseValueError(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=0saved_count=0last_saved_time=0.0# 上一次保存图片的时间whileTrue:ret,frame=cap.read()ifnotret:break# 获取当前帧对应的时间(秒)current_time=frame_count/fps# 按时间间隔保存ifcurrent_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+=1last_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")

四、核心功能说明

1. 关键函数与参数

  • 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张)。

2. 实用优化点

  • 文件夹自动创建:无需手动创建输出文件夹,代码会自动判断并创建;
  • 文件名补零对齐:图片名格式为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:工业级标注平台,支持批量标注、多人协作,适合大规模数据集标注。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 7:32:58

Thief职场效率管理工具:三维度五策略实现工作节奏智能调控

Thief职场效率管理工具:三维度五策略实现工作节奏智能调控 【免费下载链接】Thief 一款创新跨平台摸鱼神器,支持小说、股票、网页、视频、直播、PDF、游戏等摸鱼模式,为上班族打造的上班必备神器,使用此软件可以让上班倍感轻松&am…

作者头像 李华
网站建设 2026/10/19 14:54:28

Dify工作流HTTP请求终极指南:从入门到精通

你是否在使用Dify构建工作流程时,经常遇到HTTP请求配置复杂、参数传递混乱、调试困难等问题?别担心,今天我们就来彻底解决这些痛点,让你的工作流开发效率提升300%!🎯 【免费下载链接】Awesome-Dify-Workflo…

作者头像 李华
网站建设 2026/10/21 6:01:49

Ventoy插件开发终极指南:从零基础到高级应用

Ventoy插件开发终极指南:从零基础到高级应用 【免费下载链接】Ventoy 一种新的可启动USB解决方案。 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 你是否曾经为管理多个操作系统启动盘而烦恼?每次添加新系统都需要重新格式化U盘&…

作者头像 李华
网站建设 2026/10/23 3:02:36

IDM激活脚本终极指南:永久解锁30天试用期的完整解决方案

还在为Internet Download Manager试用期结束而苦恼吗?每次重新安装软件的繁琐操作是否让你感到厌烦?这款开源的IDM激活脚本将彻底解决你的困扰,让你轻松享受持续的高速下载体验!无论你是技术新手还是资深用户,都能快速…

作者头像 李华
网站建设 2026/10/21 0:58:00

揭秘macOS下Open-AutoGLM部署全流程:5步实现本地大模型运行

第一章:揭秘Open-AutoGLM与macOS本地部署的核心价值在人工智能快速演进的当下,大语言模型(LLM)的本地化部署正成为开发者与企业关注的重点。Open-AutoGLM 作为一款支持自动化任务推理与生成的开源语言模型,结合 macOS …

作者头像 李华
网站建设 2026/10/23 12:30:49

IDM使用指南:3步实现长期使用

还在为IDM的30天试用期而烦恼吗?想要实现IDM长期使用,让下载速度始终保持在巅峰状态?今天我将为你详细介绍一个简单有效的解决方案,让你更好地使用软件! 【免费下载链接】IDM-Activation-Script IDM Activation & …

作者头像 李华