当前位置: 首页 > news >正文

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍

        这段代码的功能是从一个视频文件中抽取指定数量的帧,并将这些帧保存为图像文件。步骤如下:

  1. 设置路径和参数

    • video_path:视频文件的路径。
    • image_folder:保存抽取图像的目录。
    • num_frames_to_extract:需要抽取的帧数。
  2. 创建输出目录

    • 如果指定的输出目录不存在,则创建该目录。
  3. 打开视频文件

    • 使用cv2.VideoCapture打开视频文件。
  4. 获取视频信息

    • 获取视频的帧率(fps)和总帧数(total_frames)。
  5. 计算抽取间隔

    • 计算抽取帧的间隔,以确保尽可能均匀地从视频中抽取帧。
    • 如果总帧数不能被需要抽取的帧数整除,则增加1以确保最后一帧也能被抽取。
  6. 循环抽取帧

    • 循环读取视频帧,直到抽取的帧数达到指定数量或读取完视频。
    • 使用cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)跳转到指定帧。
    • 读取帧,并保存为图像文件。
  7. 保存图像

    • 每次读取到有效帧时,保存为JPEG格式的图像文件。
    • 文件名格式为normal-XXX.jpg,其中XXX是三位数的帧序号,不足三位数时前面补零。
  8. 释放资源

    • 关闭视频文件。
    • 清理OpenCV窗口。

二、代码

import cv2
import os# 视频文件路径
video_path = r'demo.mp4'# 输出图像目录
image_folder = r'E:\pythonProject\pythonProject\imgs_chouzhen'
if not os.path.exists(image_folder):os.makedirs(image_folder)# 指定要抽取的帧数
num_frames_to_extract = 100# 打开视频文件
cap = cv2.VideoCapture(video_path)# 获取视频总帧数
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 总帧数# 计算抽取间隔(尽量均匀)
frame_interval = total_frames // num_frames_to_extract
if total_frames % num_frames_to_extract != 0:frame_interval += 1frame_count = 0
current_frame = 0while(current_frame < total_frames and frame_count < num_frames_to_extract):cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame)ret, frame = cap.read()if not ret:break# 保存图像img_name = f"normal-{str(frame_count).zfill(3)}.jpg"img_path = os.path.join(image_folder, img_name)cv2.imwrite(img_path, frame)current_frame += frame_intervalframe_count += 1print(f"Total {frame_count} frames extracted.")
cap.release()
cv2.destroyAllWindows()

改成你的视频路径和保存路径,执行结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Oracle(52)分区表有哪些类型?
  • RCE漏洞基础初了解
  • Power Query抓取多页数据导入到Excel
  • C# 解析html
  • FFmpeg源码:av_buffer_is_writable、av_buffer_realloc函数分析
  • Mybatis声明变量并使用
  • 服务器硬件及RAID配置
  • 基于springboot的乐享田园系统
  • Linux系统性能调优技巧
  • 学习计算机网络(三)——IP地址
  • Golang实现简单的HTTP服务,响应RESTful请求判断形状大小
  • 理解张量拼接(torch.cat)
  • cmseasy的两个注入漏洞
  • GiantPandaCV | 大模型训练:Megatron-Kwai中的内存优化
  • Lesson 57 An unusual day
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 30秒的PHP代码片段(1)数组 - Array
  • Computed property XXX was assigned to but it has no setter
  • DataBase in Android
  • Docker 笔记(2):Dockerfile
  • ES6 ...操作符
  • extjs4学习之配置
  • Java 多线程编程之:notify 和 wait 用法
  • js
  • PHP那些事儿
  • Service Worker
  • sessionStorage和localStorage
  • yii2中session跨域名的问题
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 缓存与缓冲
  • 排序算法学习笔记
  • 前端攻城师
  • 前端面试题总结
  • 双管齐下,VMware的容器新战略
  • 通信类
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1)虚拟机的安装与使用,linux系统安装
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (9)STL算法之逆转旋转
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (void) (_x == _y)的作用
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (原創) 物件導向與老子思想 (OO)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 的缓存方案