如何在视频中提取关键帧?

在视频处理中,提取关键帧是一项常见的任务。下面将介绍如何基于FFmpeg和Python,结合OpenCV库来实现从视频中提取关键帧的功能。

实现思路

  1. 使用FFmpeg获取视频的关键帧时间戳:FFmpeg是一个强大的视频处理工具,可以通过命令行获取视频中关键帧的时间戳信息。
  2. 使用OpenCV根据时间戳提取关键帧:OpenCV是一个广泛使用的计算机视觉库,可以根据视频的时间戳读取相应的帧。

代码实现

import cv2
import subprocess
import redef get_keyframe_timestamps(video_path):"""使用FFmpeg获取视频中关键帧的时间戳:param video_path: 视频文件的路径:return: 关键帧的时间戳列表"""# 构建FFmpeg命令command = ['ffmpeg','-i', video_path,'-skip_frame', 'nokey','-vsync', '0','-frame_pts', '1','-loglevel', 'verbose','-f', 'image2','-']try:# 执行FFmpeg命令并捕获输出result = subprocess.run(command, capture_output=True, text=True, check=True)output = result.stderr# 使用正则表达式提取关键帧的时间戳timestamps = re.findall(r'pts_time:([\d.]+)', output)timestamps = [float(ts) for ts in timestamps]return timestampsexcept subprocess.CalledProcessError as e:print(f"FFmpeg命令执行出错: {e.stderr}")return []def extract_keyframes(video_path, output_folder):"""根据关键帧的时间戳提取关键帧并保存到指定文件夹:param video_path: 视频文件的路径:param output_folder: 保存关键帧的文件夹路径"""# 打开视频文件cap = cv2.VideoCapture(video_path)if not cap.isOpened():print("无法打开视频文件")return# 获取关键帧的时间戳timestamps = get_keyframe_timestamps(video_path)for i, ts in enumerate(timestamps):# 设置视频的播放位置到关键帧的时间戳cap.set(cv2.CAP_PROP_POS_MSEC, ts * 1000)ret, frame = cap.read()if ret:# 保存关键帧到指定文件夹output_path = f"{output_folder}/keyframe_{i}.jpg"cv2.imwrite(output_path, frame)print(f"保存关键帧 {output_path}")# 释放视频捕获对象cap.release()if __name__ == "__main__":video_path = "your_video.mp4"  # 替换为实际的视频文件路径output_folder = "keyframes"  # 替换为实际的输出文件夹路径extract_keyframes(video_path, output_folder)

代码解释

  1. get_keyframe_timestamps函数

    • 使用FFmpeg命令获取视频中关键帧的时间戳信息。
    • 通过正则表达式从FFmpeg的输出中提取关键帧的时间戳。
  2. extract_keyframes函数

    • 打开视频文件。
    • 调用get_keyframe_timestamps函数获取关键帧的时间戳。
    • 根据时间戳设置视频的播放位置,并读取关键帧。
    • 将关键帧保存到指定的文件夹中。

使用方法

  1. 确保已经安装了FFmpeg和OpenCV库。
  2. 将代码中的video_path替换为实际的视频文件路径。
  3. 将代码中的output_folder替换为实际的输出文件夹路径。
  4. 运行代码,即可从视频中提取关键帧并保存到指定文件夹。

注意事项

  • 请确保FFmpeg的可执行文件已经添加到系统的环境变量中,否则可能会出现命令执行失败的问题。
  • 提取的关键帧将以keyframe_0.jpg, keyframe_1.jpg, … 的格式保存到指定的文件夹中。

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

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

相关文章

九、数据治理架构流程

一、总体结构 《数据治理架构流程图》(Data Governance Architecture Flowchart) 水平结构:流程图采用水平组织,显示从数据源到数据应用的进程。 垂直结构:每个水平部分进一步划分为垂直列,代表数据治理的…

Docker 搭建 Gitlab 服务器 (完整详细版)

参考 Docker 搭建 Gitlab 服务器 (完整详细版)_docker gitlab-CSDN博客 Docker 安装 (完整详细版)_docker安装-CSDN博客 Docker 日常命令大全(完整详细版)_docker命令-CSDN博客 1、Gitlab镜像 # 查找Gitlab镜像 docker search gitlab # 拉取Gitlab镜像 docker pull gitlab/g…

Spring MVC 框架学习笔记:从入门到精通的实战指南

目录 1. Spring MVC 概述 2. Spring MVC 项目搭建 3. Spring MVC 执行流程 4. Spring MVC RequestMapping 注解 5. Spring MVC 获取请求参数 6. Spring MVC 常见注解 7. Spring MVC 响应处理 8. Spring MVC SSM 整合 9. Spring MVC 作用域传参 10. Spring MVC 上传 1…

RK3568开发笔记-AD7616调试笔记

目录 前言 一、AD7616介绍 高分辨率 高速采样速率 宽模拟输入范围 集成丰富功能 二、原理图连接 三、设备树配置 四、内核驱动配置 五、AD芯片测试 总结 前言 在嵌入式数据采集领域,将模拟信号精准转换为数字信号至关重要。AD7616 作为一款性能卓越的 16 位模数转换器…

【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读

Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…

ASP.NET Core 8.0学习笔记(二十八)——EFCore反向工程

一、什么是反向工程 1.原则:DBFirst 2.反向工程:根据数据库表来反向生成实体类 3.生成命令:Scaffold-DbContext ‘连接字符串’ 字符串示例: Server.;DatabaseDemo1;Trusted_Connectiontrue; MultipleActiveResultSets true;Tru…

springcloud和dubbo的区别

Spring Cloud和Dubbo作为微服务架构中非常流行的两个框架,它们在多个方面存在显著的区别。以下是对两者区别的详细分析: 1. 初始定位和生态环境 Spring Cloud:定位为微服务架构下的一站式解决方案,依托于Spring平台,…

【大模型LLM】DeepSeek LLM Scaling Open-Source Language Models with Longtermism

深度探索LLM:以长期主义扩展开源语言模型 0.论文摘要 开源大语言模型(LLMs)的快速发展确实令人瞩目。然而,以往文献中描述的扩展规律得出了不同的结论,这为LLMs的扩展蒙上了一层阴影。我们深入研究了扩展规律&#…

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…

Qt常用控件之多行输入框QTextEdit

多行输入框QTextEdit QTextEdit 是一个多行输入框控件&#xff0c;支持富文本和 markdown 格式&#xff0c;当文本内容超出编辑框的范围时能自动提供滚动条。 QPlainTextEdit 是只支持富文本格式的多行输入框&#xff0c;属性和使用上与 QTextEdit 几乎没有区别。 QTextEdit属…

VC++零基础入门之系列教程 【附录E MFC快速参考指南】

附录E MFC快速参考指南 E.1 创建窗口 使用M F C CWnd wnd; W n d . C r e a t e E x ( E xSt y l e , C l a s s N a m e , Wi n d o w N a m e , S t y l e , x , y, Wi d t h , H e i g h t , P a r e n t , M e n u , P a r a m ) ; 使用A P I HWND hwnd=::CreateWi n d …

【前端】react+ts 轮播图的实现

一、场景描述 在很多网站的页面中都有轮播图&#xff0c;所以我想利用react.js和ts实现一个轮播图。自动轮播图已经在前面实现过了&#xff0c;如&#xff1a;https://blog.csdn.net/weixin_43872912/article/details/145622444?sharetypeblogdetail&sharerId145622444&a…

python与C系列语言的差异总结(4)

如果具有传统编译型语言的经验&#xff0c;大家可能会对是否使用字典而犹豫不决&#xff0c;担心字典的效率比列表或数组低。事实上Python字典的执行速度已经相当快了。Python语言的许多内部特性都依赖于字典&#xff0c;为提高字典的效率已经投入了大量的心血。Python的所有数…

[Web 安全] 反序列化漏洞 - 学习笔记

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] Web 安全攻防 - 学习手册-CSDN博客 0x01&#xff1a;反序列化漏洞 — 漏洞介绍 反序列化漏洞是一种常见的安全漏洞&#xff0c;主要出现在应用程序将 序列化数据 重新转换为对象&#xff08;即反序列化&#xff09;的过程中…

深入理解C语言中的位段

在C语言编程中&#xff0c;我们常常会遇到需要对内存进行精细控制的场景&#xff0c;位段&#xff08;bit - field&#xff09;便是C语言提供的一种强大工具&#xff0c;它允许我们在一个字节或多个字节内对数据进行按位的定义和操作&#xff0c;极大地提高了内存使用效率。 一…

实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能

下面将详细介绍如何实现使用RBF&#xff08;径向基函数&#xff09;神经网络模拟二阶电机数学模型中的非线性干扰&#xff0c;以及使用WNN&#xff08;小波神经网络&#xff09;预测模型中的非线性函数来抵消迟滞影响的功能。我们将按照以下步骤进行&#xff1a; 步骤1&#x…

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention&#xff08;GQA&#xff09;详解 Grouped-Query Attention&#xff08;GQA&#xff09; 是 Multi-Query Attention&#xff08;MQA&#xff09; 的改进版&#xff0c;它通过在 多个查询头&#xff08;Query Heads&#xff09;之间共享 Key 和 Value&am…

ReentrantLock 用法与源码剖析笔记

&#x1f4d2; ReentrantLock 用法与源码剖析笔记 &#x1f680; 一、ReentrantLock 核心特性 &#x1f504; 可重入性&#xff1a;同一线程可重复获取锁&#xff08;最大递归次数为 Integer.MAX_VALUE&#xff09;&#x1f527; 公平性&#xff1a;支持公平锁&#xff08;按等…

基于GO语言的车牌识别api技术-港澳车牌文字识别

随着科技的飞速发展&#xff0c;智能化管理逐渐渗透到我们生活的方方面面。车牌识别技术作为智能交通的重要组成部分&#xff0c;不仅极大提升了交通管理的效率&#xff0c;还为市民出行带来了更多便利。而港澳地区的车牌识别技术&#xff0c;凭借其高效、精准、快速的特点&…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…