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

从视频中每隔10帧截取一帧并保存为图片

  • 要从视频中每隔10帧截取一帧并保存为图片,可以使用 OpenCV 库。
import cv2# 视频文件的路径
video_path = 'path/to/your/video.mp4'# 创建一个 VideoCapture 对象
cap = cv2.VideoCapture(video_path)# 检查是否成功打开视频文件
if not cap.isOpened():print("Error opening video file")# 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"Frames per second: {fps:.2f}")# 初始化帧计数器
frame_count = 0# 循环读取视频帧
while cap.isOpened():# 读取一帧ret, frame = cap.read()# 如果读取成功,ret 将为 Trueif ret:# 每隔10帧保存一次if frame_count % 10 == 0:# 构建输出图片的文件名output_path = f'output/frame_{frame_count}.jpg'# 保存图片cv2.imwrite(output_path, frame)print(f"Frame saved at {output_path}")# 增加帧计数器frame_count += 1else:# 如果读取失败(到达视频末尾),则退出循环break# 释放 VideoCapture 对象
cap.release()# 关闭所有 OpenCV 窗口(如果有打开的话)
cv2.destroyAllWindows()

在这段代码中:

  1. 我们首先导入 cv2 模块。
  2. 使用 cv2.VideoCapture() 函数打开视频文件。
  3. 检查视频是否成功打开。
  4. 获取视频的帧率,这可以帮助你了解视频的播放速度。
  5. 初始化一个帧计数器 frame_count
  6. 使用一个无限循环来读取视频帧,直到视频结束。
  7. 在循环中,我们使用 cap.read() 函数读取每一帧。ret 变量将返回一个布尔值,表示读取是否成功;frame 变量将包含实际的图像数据。
  8. 如果读取成功,我们检查 frame_count 是否是10的倍数。如果是,我们就保存当前帧为图片。
  9. 使用 cv2.imwrite() 函数保存图片,文件名格式为 frame_{frame_count}.jpg
  10. 增加帧计数器。
  11. 如果读取失败(通常是因为到达了视频的末尾),我们跳出循环。
  12. 最后,我们释放 VideoCapture 对象并关闭所有 OpenCV 窗口。

确保将 'path/to/your/video.mp4' 替换为你的视频文件的实际路径。

  • 如果你想要按照更精确的时间间隔(比如每秒一次)从视频中提取帧,而不只是简单地每隔一定数量的帧提取,你可以利用视频的编码时间戳。OpenCV 的 VideoCapture 类提供了访问这些时间戳的方法,但默认情况下并不直接提供它们。为了获取时间戳,你需要在读取每一帧时同时读取它们。

下面是一个修改后的示例,展示如何根据时间戳每秒提取一帧:

import cv2
import time# 视频文件的路径
video_path = 'path/to/your/video.mp4'# 创建一个 VideoCapture 对象
cap = cv2.VideoCapture(video_path)# 检查是否成功打开视频文件
if not cap.isOpened():print("Error opening video file")# 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"Frames per second: {fps:.2f}")# 获取视频的总时间(以毫秒为单位)
total_time_ms = cap.get(cv2.CAP_PROP_POS_MSEC)# 计算视频的总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 初始化当前时间戳
current_time_ms = 0# 循环读取视频帧
for frame_num in range(total_frames):# 设置视频的位置到特定的时间戳cap.set(cv2.CAP_PROP_POS_MSEC, current_time_ms)# 读取一帧ret, frame = cap.read()# 如果读取成功,ret 将为 Trueif ret:# 构建输出图片的文件名output_path = f'output/frame_{int(current_time_ms / 1000)}.jpg'# 保存图片cv2.imwrite(output_path, frame)print(f"Frame saved at {output_path}")# 更新时间戳,增加一秒current_time_ms += 1000else:# 如果读取失败(到达视频末尾),则退出循环break# 释放 VideoCapture 对象
cap.release()# 关闭所有 OpenCV 窗口(如果有打开的话)
cv2.destroyAllWindows()

然而,上述代码有一个关键问题:它假设视频的帧率是恒定的,并且每一帧的持续时间都是相等的。在实际情况中,视频的帧率可能不是完全恒定的,特别是对于一些编码方式更为复杂的视频。因此,使用时间戳来定位帧可能不会总是准确的,尤其是在视频的某些部分帧率发生变化时。

  • 一个更可靠的方法是使用视频的解码时间戳,但这需要额外的库,如 ffmpeg-python 或 moviepy,它们可以提供更高级的视频处理功能,包括对时间戳的精确访问。如果你需要非常精确的时间控制,你可能需要考虑使用这些库之一。

例如,使用 ffmpeg-python 库,你可以如下操作:

import ffmpeg# 视频文件的路径
video_path = 'path/to/your/video.mp4'# 使用 ffmpeg 接口读取视频
input_video = ffmpeg.input(video_path)# 获取视频的总时间(以秒为单位)
probe = ffmpeg.probe(video_path)
video_info = next(s for s in probe['streams'] if s['codec_type'] == 'video')
total_time_s = float(video_info['duration'])# 循环遍历每一秒
for sec in range(int(total_time_s)):# 使用 ffmpeg 接口截取视频中的特定帧out, _ = (ffmpeg.filter(input_video, 'select', f'gte(t,{sec}').output('pipe:', format='rawvideo', pix_fmt='rgb24').run(capture_stdout=True))# 将字节流转换为 numpy 数组image = np.frombuffer(out, np.uint8).reshape([int(video_info['height']), int(video_info['width']), 3])# 构建输出图片的文件名output_path = f'output/frame_{sec}.jpg'# 保存图片cv2.imwrite(output_path, image)print(f"Frame saved at {output_path}")

请注意,使用 ffmpeg-python 或 moviepy 可能需要安装额外的依赖项,并且它们的使用方法与 OpenCV 有所不同。上述 ffmpeg-python 示例代码需要你有 ffmpeg 工具安装在你的系统上,并且熟悉 ffmpeg 的命令行语法。

相关文章:

从视频中每隔10帧截取一帧并保存为图片

要从视频中每隔10帧截取一帧并保存为图片,可以使用 OpenCV 库。 import cv2# 视频文件的路径 video_path path/to/your/video.mp4# 创建一个 VideoCapture 对象 cap cv2.VideoCapture(video_path)# 检查是否成功打开视频文件 if not cap.isOpened():print("E…...

防火墙、firewalld指令、更改yum源为阿里云的yum源及常见问题

一、防火墙分类 1、硬件防火墙 2、软件防火墙(咱们昨天学的就属于这个) 3、waf 4、下一代防火墙 二、工作原理 1、通过对进出口数据的(数据、端口、IP等)进行过滤,达到对内网数据的保护。 2、防护危险的一堵墙、…...

5G Multicast/Broadcast Services(MBS) (二) Multicast

这篇是Multicast handling的overview,正文开始。 值得注意的是,对于5MBS multicast,UE只有处于 RRC connected和Inactive时,网络侧才可以 通过MRB将MBS multicast数据传输到 UE;处于Idle态只能进行MBS broadcast过程。 对于multicast涉及的RN...

【计算机方向】中科院二区潜力刊!最快14天accept,还是非OA ,不能错过!

期刊解析 🚩本 期 期 刊 看 点 🚩 非OA 审稿友好,审稿速度快 自引率7.9% 今天小编带来计算机领域SCI快刊的解读! 如有相关领域作者有意投稿,可作为重点关注! 01 期刊信息✦ 期刊名称:Inter…...

合适做项目交付的物联网平台:ThingsKit

ThingsKit,作为一个专为项目交付设计的物联网平台,凭借其强大的功能和灵活性,成为了众多企业的首选。 一、ThingsKit的核心优势 模块化设计:ThingsKit采用模块化设计,使得用户可以根据自己的需求灵活选择和组合不同的…...

python绘制3D瀑布图

成品: 代码: def line_3d(x, y, z, x_label_indexs):"""在y轴的每个点,向x轴的方向延伸出一个折线面:展示每个变量的时序变化。x: x轴,时间维,右边。y: y轴,变量维,…...

ArcGIS中怎么合并多个点图层并删除重复点?

最近,我接到了一个怎么合并多个点图层并删除其中的重复点的咨询。 下面是我对这个问题的解决思路: 1、合并图层 在地理处理工具里面 选择合并 并设置好要合并的图层即可 2、接下来在 数据管理工具→常规→删除相同项 即可 希望这些建议能对大家有所帮…...

【vue、UI】使用 Vue2 和 Element UI 封装 CSV 文件上传组件,实现csv回显

文章目录 前言组件功能概述实现效果组件模板结构组件的核心逻辑1.数据属性定义2.方法拆解3.CSV 文件解析方法4. 错误处理方法 组件样式完整组件代码总结待优化的地方 前言 在 Vue2 项目中,我们经常需要封装一些可重用的组件来提升开发效率。本文将介绍如何使用 Vue…...

erlang学习: Mnesia Erlang数据库2

Mnesia数据库增加与查询学习 -module(test_mnesia).-record(shop, {item, quantity, cost}). -record(cost, {name, price}). -record(design, {info, plan}). %% API -export([insert/3,select/1,start/0]). start() ->mnesia:start().insert(Name, Quantity, Cost) ->…...

电脑文件怎么备份?推荐6个高效便捷的文件备份的方法

在日常使用电脑的过程中,数据备份是一项至关重要的任务。无论是个人用户还是企业用户,都需要确保重要文件的安全性和可恢复性。 以下是推荐的六个高效便捷的文件备份方法,帮助你轻松守住你的文档安全。 1. 使用USB存储设备 USB存储设备如U盘…...

Procdump抓ToDesk密码

目录 前言 1.工具教程 2.转储数据 3.密码获取 4.总结 前言 本文是因为在公众号上看到一篇文章随想着实战中利用ToDesk秀操作失败后,实验环境成功复现后写下。ProcDump[1] 是一个命令行实用工具,其主要用途是监视应用程序的 CPU 峰值,并在…...

ESP8266下载固件→连接阿里云

一、工具准备 1、ESP8266Wifi模块 2、ESP8266下载器 ESP8266-01模块 二、固件配置 CH340串口工具-烧录ESP8266-01固件_esp8266 ch340烧录-CSDN博客文章浏览阅读444次,点赞6次,收藏3次。CH340会有供电不足的问题,因此需要外部供电_esp…...

20240911软考架构-------软考156-160答案解析

每日打卡题156-160答案 156、NoSQL整体框架分为4层,由下至上分为数据持久层、数据分布层、数据逻辑模型层和(1)。(2)定义了数据的存储形式。(3)定义了数据是如何分布的。(4&#xf…...

工厂模式与策略模式(golang示例)

一、工厂模式简介 工厂模式是一种创建型设计模式,主要用于封装对象的创建过程。通过使用工厂模式,客户端代码无需直接实例化对象,而是通过工厂类来创建对象。这样可以将对象的创建与使用分离,从而提高代码的灵活性。 1.1 工厂模…...

批量视频如何做成一个二维码(分步骤教程)

原创教程,阿酷TONY,2024.9.11,湖南长沙 批量视频如何做成一个二维码(分步骤教程),场景应用: 1. 一批视频需要按组分类,生成一个二维码,实现扫一个二维码,观看…...

OpengGL教程(三)---使用VAO和VBO方式绘制三角形

本章参考官方教程:learnopengl-cn VertexShader.glsl #version 330 core layout(location 0) in vec3 position; layout(location 1) in vec3 color; uniform mat4 projection; // 投影矩阵 out vec4 ourColor; void main() {gl_Position projection * vec4(p…...

【单片机开发】单片机常用开发工具

【前言】 在嵌入式系统领域,单片机(Microcontroller, MCU)作为核心组件,广泛应用于智能家居、工业控制、汽车电子等众多领域。而单片机开发工具,则是开发者们实现创意、解决问题的重要助手。本文主要讲述目前主流的单…...

一、计算机网络的体系结构

1.1 计算机网络的组成 1)从组成部分上分为:硬件、软件、协议。硬件是指主机、通信链路、交换设备和通信处理机组曾。软件包括各种实现资源共享的软件以及各种软件工具(如网络操作系统、邮件收发程序、FTP程序、聊天软件)。 2&…...

C语言补习课——文件篇

来源:黑马程序员 第157讲 C语言操作文件概述 读取文件:输入流 写文件:输出流 读写的方向判断取决与参照,一般我们站在程序的角度判断读写方向。 第158讲 路径 基本概念 路径就是指文件在电脑中的位置,eg&#xf…...

【可测试性实践】C++ 单元测试代码覆盖率统计入门

引言 最近在调研C工程怎么做单元测试和代码覆盖率统计,由于我们工程有使用Boost库,尝试使用Boost.Test来实现单元测试并通过Gcov和Lcov来生成代码覆盖率报告。本文记录完整的搭建测试Demo,希望能带来一定参考。 常用C单测框架对比 特性Goo…...

C++笔记---list

1. list的介绍 list其实就是就是我们所熟知的链表(双向循环带头结点),但其是作为STL中的一个类模板而存在。 也就是说,list是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型&…...

JavaWeb开发中为什么Controller里面的方法是@RequestMapping?

在Java Web开发中,尤其是在使用Spring MVC框架时,RequestMapping注解被广泛应用于Controller层的方法上,这是因为RequestMapping是Spring MVC提供的一个核心注解,用于将HTTP请求映射到相应的处理器类或处理器方法上。通过这种方式…...

若依移动版使用微信小程序打开失败

现象 解决办法:删掉自带的appid...

精准控图工具 Concept Sliders:超好用的 控制 Lora 适配器

Concept Sliders 你有没有遇到这样的情况?你花费大量时间制作提示和寻找种子,以使用文本到图像模型生成所需的图像。但是,你还需要对生成图像中的属性强度(如眼睛大小或照明)进行更细致、更精细的控制。修改提示会破坏…...

【EI会议征稿通知】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)

第四届材料工程与应用力学国际学术会议(ICMEAAE 2025) 2025 4th International Conference on Materials Engineering and Applied Mechanics 本次会议将重点讨论材料科学、应用力学等领域的最新研究进展与发展趋势。会议旨在为国内外从事这些领域研究…...

Hadoop安全之Knox

Apache Knox 是一个 REST API 网关,为 Hadoop 集群提供安全的访问方式。Knox 提供了一层保护,简化了对 Hadoop 生态系统(如 HDFS、YARN、Hive、HBase 等)中各个组件的访问,并通过单点登录 (SSO)、认证、授权和审计功能…...

SprinBoot+Vue应急信息管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…...

索尼研究的AI部门将与AI新加坡合作开发大型语言模型

索尼研究公司签署了一项合作协议,以帮助测试和优化东南亚语言一网通(SEA-LION)人工智能(AI)模型,重点关注印度语言。 索尼研究公司的AI部门将与负责开发AI新加坡(AISG)的公司合作&a…...

【OJ刷题】双指针问题

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…...

基于SpringBoot+Vue+MySQL的校园食堂订餐

系统展示 用户前台界面 管理员后台界面 系统背景 随着信息技术的飞速发展和互联网的普及,传统校园食堂的运作模式已难以满足现代学生日益增长的便捷性、个性化需求。学生们希望能够在忙碌的学习生活中,通过更加高效、便捷的方式完成就餐选择,…...