【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()

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业相机图像采集卡

什么是图像采集卡&#xff1f; 图像采集卡又称为图像卡&#xff0c;它将相机的图像视频信号&#xff0c;以帧为单位传送到计算机的内存和VGA帧存&#xff0c;供计算机处理&#xff0c;存储&#xff0c;显示和传输等使用。在机器视觉系统中&#xff0c;图像采集卡采集到的图像供…

【C语言】双链表

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、什么是双链表&#xff1f; 二、双链表温习 1. 双链表的结构…

【Django开发】前后端分离django美多商城项目第2篇:展示用户注册页面,1. 创建用户模块子应用【附代码文档】

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦~ 本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体…

如何诱导AI犯罪-提示词注入

我们用到的大模型基本把政治类信息、犯罪相关信息都已屏蔽。但是&#xff0c;黑客依旧可以使用提示词诱导和提示词注入的方式对大模型进行攻击。 1、提示词诱导 如果直接让AI提供犯罪过程&#xff0c;AI会直接拒绝。虽然AI对于大部分知识了然于心&#xff0c;但因为经过了人工…

javase综合案例3 -- 通讯录

文章目录 一&#xff0c;项目要求基础功能拓展 二&#xff0c;导入jar包 pinyin4j.jar三&#xff0c;程序报下建立Pinyin4j类四&#xff0c;创建实体类Contact五&#xff0c;创建通讯录接口ContactDao六&#xff0c;创建ContactDao接口的视线子类ContactDaoImpl6.1 创建全局的M…

【Dash】Dash模块介绍

什么是Dash&#xff1f; Dash 是一个开源的 Python 框架&#xff0c;用于创建基于 Web 的应用程序。它由 Plotly 公司开发&#xff0c;专为数据科学家和分析师设计&#xff0c;以便他们可以构建自定义的数据可视化 Web 应用程序&#xff0c;而无需具备前端开发知识。Dash 提供…

NGINX项目实战

一、nginx四层代理 部署支持4层TCP/UDP代理的Nginx服务器 部署nginx服务器 编译安装必须要使用--with-stream参数开启4层代理模块。 [rootproxy ~]# rm -rf /usr/local/nginx/ #清理环境 [rootproxy nginx-1.16.1]# ./configure --with-http_ssl_module --with-stream #开…

Oracle特有的DECODE函数

Oracle中的DECODE函数是一种条件表达式函数&#xff0c;用于基于给定的条件从一组值中选择一个值返回。它的基本语法如下&#xff1a; DECODE(expression, search1, result1, [search2, result2, ...], [default])expression&#xff1a;要比较的表达式或列。searchN&#xff…

DDPM 核心代码解析(1)

所有代码 已上传至GitHub - duhanyue349/diffusion_model_learned_ddpm_main: 扩散模型基础框架源代码 目录结构如下 在train_cifar.py 中展示了扩散模型训练的所有代码 如果没有安装wandb 可以在create_argparser()设置 log_to_wandbFalse 一、加载模型参数 args 这里用了一…

直播圈不再只讲技术和千川,管理成为新焦点

直播圈不讲技术&#xff0c;也不讲千川啦&#xff0c;开始讲管理啦&#xff0c;感叹直播带货发展真快&#xff0c;都说要傻瓜化&#xff0c;讲的东西一年能迭代 3 个版本&#xff0c;甚至带货线下课不讲半天团队管理你的课都显得low。关键没一个能告诉你管理是什么管什么&#…

【1】CPU飙升到200%以上问题汇总

原链接 【1】CPU飙升到200%以上问题汇总 CPU飙升到200%以上是生成中常见的问题 注意&#xff1a; 1. linux的cpu使用频率是根据cpu个数和核数决定的 2. top&#xff0c;然后你按一下键盘的1&#xff0c;这就是单个核心的负载&#xff0c;不然是所有核心的负载相加&#xff0c;…

弹幕背后:B站UP主创作服务解析

引言 在B站&#xff0c;每一条飘过的弹幕都是一个故事的碎片&#xff0c;它们汇聚成一幅幅生动的社交画卷。这里&#xff0c;不仅仅是一个视频分享平台&#xff0c;弹幕背后更是一个充满活力的创作者生态系统。B站以其独特的弹幕文化&#xff0c;为创作者和观众之间搭建起了一座…

RxJava基础使用

Rx思想 事件从起点流向终点。 过程中可以对事件进行拦截&#xff0c;拦截时可以对事件进行处理&#xff0c;处理后将处理后的事件继续流向终点。 终点接收上一次处理后的事件。 获取网络图片并显示 基础实现 使用Observable.just(path) 创建图片路径的Observable。 使用m…

Unity | Shader基础知识(第二十集:应用-简易流光、LOD)

目录 一、前言 二、LOD 1.什么是LOD 2.代码如何调节LOD 三、流光 1.资源准备 2.uv移动 3.获取图片中的uv 4.改变uv去取流光的颜色&#xff08;时间的应用&#xff09; 5.图片叠加 6.透明图片的叠加 四、纯净代码 五、作者的碎碎念 一、前言 有小伙伴问&#xf…

Studying-代码随想录训练营day45| 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

第45天&#xff0c;子序列part03&#xff0c;编辑距离&#x1f4aa;(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 115.不同的子序列 文档讲解&#xff1a;代码随想录不同的子序列 视频讲…

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制&#xff1a;每个索引都可以被分片 索引my_doc只有一个主分片&#xff1b;索引shop有三个主分片&#xff1b;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据&#xff0c;由于目前是单机&#xff0c;所以副分片是没有的&a…

安全开发第一篇

文章目录 参与RASP、IAST等安全防护工具的开发技术背景开发流程技术挑战工具和资源示例结论 以phpstudydvwa为列 实现 SQL 注入检测脚本 参与RASP、IAST等安全防护工具的开发 参与 RASP&#xff08;Runtime Application Self-Protection&#xff09;和 IAST&#xff08;Intera…

为开源奉献一份自己的力量:Cesium没有热力图组件,我们自己封装!

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;专注可视化、数字孪生、前端提效、nodejs、AI学习、GIS等学习沉淀&#xff0c;这是2024年输出的第27/100篇文章。 交流合作&#xff1a;brown_7778 前言 热力图&#xff0c;在很多可视化场景开发中会被经常提到&#x…

electron 主进程和渲染进程

最近在整理electron 相关的项目问题&#xff0c;对自己来说也是温故知新&#xff0c;也希望能对小伙伴们有所帮助&#xff0c;大家共同努力共同进步。加油&#xff01;&#xff01;&#xff01;&#xff01; 虽然最近一年前端大环境不好&#xff0c;但是大家还是要加油鸭&#…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞&#xff0c;通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段&#xff0c;对评估网络系统安全防护及措施至关重要&#xff0c;因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…