【PYTHON】视频转图片

【PYTHON】视频转图片

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

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

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

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

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

完整代码

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

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

完整代码

import cv2 import os defvideo_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. 创建输出文件夹ifnot os.path.exists(output_dir): os.makedirs(output_dir)print(f"创建输出文件夹:{output_dir}")# 2. 打开视频文件 cap = cv2.VideoCapture(video_path)ifnot 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# 上一次保存图片的时间whileTrue: ret, frame = cap.read()ifnot 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")

四、核心功能说明

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:工业级标注平台,支持批量标注、多人协作,适合大规模数据集标注。

Read more

宏智树 AI:重构学术创作流程 ——ChatGPT 学术版驱动的 AI 5.0 智能写作平台

宏智树 AI:重构学术创作流程 ——ChatGPT 学术版驱动的 AI 5.0 智能写作平台

在这个信息爆炸与学术竞争白热化的时代,论文写作不再仅仅是思想的表达,更演变成了一场对效率、规范与数据处理能力的综合考验。 面对海量文献的筛选、枯燥的数据清洗、以及反复的格式调整,传统的写作方式显得愈发沉重。宏智树 AI(官网:www.hzsxueshu.com)应运而生,它不是一个简单的文字生成器,而是一款由ChatGPT 学术版模型深度驱动、基于AI 5.0 技术架构构建的专业学术智能解决方案平台。 我们致力于打破工具间的壁垒,为科研工作者和高校师生提供从大纲构思到定稿答辩的一站式学术写作服务。 一、 核心引擎:源于顶尖,专于学术 宏智树 AI 的强大,源于其底层核心的技术基因。我们深知学术写作对准确性、逻辑性和专业性的极致要求,因此选择了目前最强大的语言模型之一进行深度定制。 * ChatGPT 学术版驱动:不同于通用的聊天机器人,宏智树 AI 搭载的是经过海量学术语料微调的 ChatGPT 学术版。它不仅拥有惊人的语言理解能力,更具备深厚的学术逻辑推理能力。无论是晦涩的理科公式推导,还是严谨的社科理论综述,它都能以符合学术规范的语言进行表达,杜绝口语化和废话文学。

By Ne0inhk

Cogito-v1-preview-llama-3B应用场景:工业设备故障日志分析与维修建议生成

Cogito-v1-preview-llama-3B应用场景:工业设备故障日志分析与维修建议生成 1. 工业设备运维的痛点与机遇 在工业制造领域,设备故障是每个工厂管理者最头疼的问题。一台关键设备的突然停机,可能导致整条生产线瘫痪,每小时损失数以万计。传统的故障排查方式往往依赖经验丰富的老师傅,通过查看设备日志、听声音、摸温度来判断问题所在。 但这种传统方式面临三大挑战:人才断层(老师傅越来越少)、响应延迟(排查需要时间)、经验局限(个人经验有限)。现在,借助Cogito-v1-preview-llama-3B这样的智能模型,我们可以让设备运维进入智能化时代。 Cogito v1预览版是Deep Cogito推出的混合推理模型,在标准基准测试中超越了同等规模的其他开源模型。它不仅能直接回答问题,还能进行自我反思和推理,特别适合处理工业设备故障日志这类复杂的技术问题。 2. Cogito模型的独特优势 2.1 混合推理能力 Cogito模型最大的特点是混合推理能力。当面对设备故障日志时,它不会简单地匹配关键词,而是会: * 先理解:分析日志中的技术术语和上下文关系

By Ne0inhk
GitHub Copilot Pro 学生认证免费订阅及VS Code集成完整教程

GitHub Copilot Pro 学生认证免费订阅及VS Code集成完整教程

GitHub Copilot Pro 学生认证免费订阅及VS Code集成完整教程 一、学生认证资格与前期准备 1.1 认证资格要求 GitHub Copilot Pro 为经官方验证的全日制学生、在职教师及热门开源项目维护者提供免费订阅权限。认证需满足以下核心条件: * 学生需提供有效学籍证明(学生卡/学信网认证) * 教师需提供工作证/教师资格证 * 使用学校官方邮箱(以.edu或.edu.cn结尾) * 账户需通过双重身份认证(2FA) 1.2 账户设置准备 1. 绑定教育邮箱 在GitHub账户设置中添加学校邮箱,并完成验证: * 进入Settings → Emails → Add email address * 输入形如[email protected]的邮箱 * 登录学校邮箱查收验证邮件并确认 2. 完善个人信息 在Profile → Edit profile中填写:

By Ne0inhk

TRAE vs Qoder vs Cursor vs GitHub Copilot:谁才是真正的“AI 工程师”?

引言:工具选择 = 成本 + 效率 + 风险 的综合权衡 2026 年,AI 编程工具已从“玩具”走向“生产主力”。但面对 TRAE、Qoder、Cursor、GitHub Copilot 等选项,开发者不仅要问: * 它能写 Rust 吗?支持中文需求吗? * 更要问:一个月多少钱?团队用得起吗?代码安全有保障吗? 本文将从 五大核心维度 深度剖析四大主流 AI IDE: 1. 核心理念与自主性 2. 多语言与跨生态支持能力 3. 工程化与交付闭环能力 4. 中文本地化与业务适配 5. 收费模式、定价策略与企业成本 帮你做出技术可行、经济合理、风险可控的决策。 一、核心理念:

By Ne0inhk