OpenCV 读取 MP4 视频

news2024/9/21 16:40:12

在 C++ 中结合 OpenCV 库来读取 MP4 视频文件是一个常见的任务。以下是一个简单的示例程序,说明了如何使用 OpenCV 的 VideoCapture 类来打开一个 MP4 文件并逐帧显示每一帧。

VideoCapture::VideoCapture(const string& filename);

参数:filename—— 要打开的视频文件的名称;


bool VideoCapture::isOpened();

isOpened() 函数用于检查 VideoCapture 对象是否已经成功地打开了一个视频文件或摄像头。
如果 VideoCapture 对象已经成功初始化并准备好读取视频帧,
那么 isOpened() 将返回 true;
否则,如果还没有打开视频文件或摄像头,或者打开过程中发生了错误,它将返回 false。

void VideoCapture::release();
当您调用这个函数时,它会关闭当前正在使用的视频文件或者摄像头等捕获设备,并释放与此设备相关的所有资源。

VideoCapture& VideoCapture::operator>>(Mat& image);
含义
功能: 这个重载的右移运算符 (>>) 用于从视频源中抓取、解码并返回下一帧图像。
参数:
Mat& image: 一个引用到cv::Mat类型的变量,用于存储从视频中读取的图像数据。
返回值:
返回一个VideoCapture&类型的引用,即VideoCapture对象本身。这种设计允许连续调用或链式调用。
行为:
如果成功读取了一帧,则image将包含该帧的数据。
如果没有更多帧可读(例如到达视频末尾),则不会修改image的内容。

bool VideoCapture::read(Mat& image);
含义
功能: 这个函数同样用于从视频源中读取下一帧图像。
参数:
Mat& image: 一个引用到cv::Mat类型的变量,用于存储从视频中读取的图像数据。
返回值:
返回一个布尔值,如果成功读取了一帧,则返回true;如果没有更多帧可读,则返回false。
行为:
如果成功读取了一帧,则image将包含该帧的数据。
如果没有更多帧可读(例如到达视频末尾),则返回false,并且不会修改image的内容。


double VideoCapture::get(int propId)
含义
功能: 获取指定的 VideoCapture 属性的当前值。
参数:
int propId: 一个整数标识符,代表要获取的属性。属性标识符通常是预定义的常量,例如 CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT, CAP_PROP_FPS 等。
返回值:
返回一个 double 类型的值,表示请求的属性值。不同属性可能会有不同的实际类型,但它们都统一为 double 类型返回。
行为:
根据提供的 propId,返回相应的属性值。
如果请求的属性不存在或无法获取,则返回一个默认值,通常是 0 或者 NaN(不是数字)。

Parameters:	propId 
CV_CAP_PROP_POS_MSEC
含义: 当前视频文件的位置(以毫秒为单位)或视频捕获的时间戳。
用途: 用于获取视频流中的当前时间点。
CV_CAP_PROP_POS_FRAMES
含义: 下一帧的0基索引。
用途: 用于获取或设置视频流中即将解码或捕获的帧的索引位置。
CV_CAP_PROP_POS_AVI_RATIO
含义: 视频文件的相对位置:0 表示影片开始,1 表示影片结束。
用途: 用于获取视频流的当前位置相对于整个视频长度的比例。
CV_CAP_PROP_FRAME_WIDTH
含义: 视频流中帧的宽度(像素)。
用途: 用于获取视频帧的宽度。
CV_CAP_PROP_FRAME_HEIGHT
含义: 视频流中帧的高度(像素)。
用途: 用于获取视频帧的高度。
CV_CAP_PROP_FPS
含义: 视频的帧率(每秒帧数)。
用途: 用于获取视频流的帧率。
CV_CAP_PROP_FOURCC
含义: 编码器的4字符代码。
用途: 用于获取视频编码格式的四字节代码。
CV_CAP_PROP_FRAME_COUNT
含义: 视频文件中的帧数。
用途: 用于获取视频文件的总帧数。
CV_CAP_PROP_FORMAT
含义: 由 retrieve() 方法返回的 Mat 对象的格式。
用途: 用于获取视频帧的格式信息。
CV_CAP_PROP_MODE
含义: 后端特定的值,指示当前的捕获模式。
用途: 用于获取视频捕获设备的工作模式。
CV_CAP_PROP_BRIGHTNESS
含义: 图像的亮度(仅适用于摄像头)。
用途: 用于获取或设置摄像头的亮度。
CV_CAP_PROP_CONTRAST
含义: 图像的对比度(仅适用于摄像头)。
用途: 用于获取或设置摄像头的对比度。
CV_CAP_PROP_SATURATION
含义: 图像的饱和度(仅适用于摄像头)。
用途: 用于获取或设置摄像头的饱和度。
CV_CAP_PROP_HUE
含义: 图像的色调(仅适用于摄像头)。
用途: 用于获取或设置摄像头的色调。
CV_CAP_PROP_GAIN
含义: 图像的增益(仅适用于摄像头)。
用途: 用于获取或设置摄像头的增益。
CV_CAP_PROP_EXPOSURE
含义: 曝光(仅适用于摄像头)。
用途: 用于获取或设置摄像头的曝光。
CV_CAP_PROP_CONVERT_RGB
含义: 布尔标志,指示图像是否应该转换为 RGB 格式。
用途: 用于获取或设置是否自动将图像转换为 RGB 格式。
CV_CAP_PROP_WHITE_BALANCE
含义: 目前不支持。
用途: 未定义。
CV_CAP_PROP_RECTIFICATION
含义: 立体相机的校正标志(注意:目前仅由 DC1394 v 2.x 后端支持)。
用途: 用于获取或设置立体相机的校正标志。

代码:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{


	// 打开视频文件
	VideoCapture cap("1.mp4");

	// 检查是否成功打开文件
	if (!cap.isOpened()) 
    {
		cout << "Error opening video file" << endl;
		return -1;
	}

	// 获取视频的帧率
	double fps = cap.get(CAP_PROP_FPS);
	cout << "Frames per second using video.get(cv::CAP_PROP_FPS): " << fps << endl;

	// 循环读取并显示每一帧
	Mat frame;
	while (true)
	{
		// 从视频中读取一帧
		cap >> frame;

		// 如果没有读取到帧,则退出循环
		if (frame.empty()) 
        {
			break;
		}

		// 显示这一帧
		imshow("Video", frame);

		// 按键退出
		if (waitKey(1000 / fps) >= 0)
		{
			break;
		}
	}

	// 释放资源
	cap.release();

	// 销毁所有窗口
	destroyAllWindows();

	return 0;
}

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{


	// 打开视频文件
	VideoCapture cap("1.mp4");

	// 检查是否成功打开文件
	if (!cap.isOpened()) {
		cout << "Error opening video file" << endl;
		return -1;
	}

	// 获取视频的帧率
	double fps = cap.get(CAP_PROP_FPS);
	cout << "Frames per second using video.get(cv::CAP_PROP_FPS): " << fps << endl;

	// 循环读取并显示每一帧
	Mat frame;
	while (cap.read(frame))// 从视频中读取一帧
	{
		//VideoCapture 类中的 read 函数用于从视频流中读取下一帧。
		//这个函数返回一个布尔值,表示是否成功读取了一帧。如果读取成功,它会将该帧存储在一个 Mat 对象中。如果到达视频末尾或出现错误,它将返回 false。

		// 如果没有读取到帧,则退出循环
		if (frame.empty()) 
		{
			break;
		}

		// 显示这一帧
		imshow("Video", frame);

		// 按键退出
		if (waitKey(1000 / fps) >= 0)
		{
			break;
		}
	}

	// 释放资源
	cap.release();

	// 销毁所有窗口
	destroyAllWindows();

	return 0;
}

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

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

相关文章

一个Android下载网络图片显示并保存到系统相册的完整案例

文章目录 1. 案例简介1.1 效果演示 2. 工程配置3. 网络层3.1 网络接口定义3.2 Retrofit工具类 4. 主界面及完整代码4.1 完整主界面代码 ImageDownloadActivity4.2 布局文件 5. 总结 1. 案例简介 在 Android开发 中&#xff0c;下载图片保存到本地是常见的需求&#xff0c;看似…

一个简单的录音软件(利用QT录音,ffmpeg进行音频重采样,fdk-aac编码)

录音软件是一种非常有用的工具&#xff0c;可以帮助我们记录和存储语音信息。在本文中&#xff0c;我们将介绍一个简单的录音软件&#xff0c;该软件利用QT进行录音&#xff0c;使用ffmpeg进行音频重采样&#xff0c;并使用fdk-aac编码。 一、 环境介绍 1、QT版本: QT5.…

绕过微信电脑版旧版本限制,版本过低不给登录的问题

这张图&#xff0c;对于还在使用低版本微信电脑版的人很熟悉了吧&#xff01;因为微信逐步开始限制低版本的客户端了&#xff0c;导致无法登陆进去。 为什么这么多人还在使用旧版&#xff1f; 因为很多机器人、框架、HOOK版本的微信等等都是在旧版的基础上开发的&#xff0c;…

嘉立创PCB板子降层(从4层到2层实例)

降层导致的改变 走线和连接&#xff0c;若想正常设计先把要用的内容全部移动到其他层。若不使用可以按照下面方式全部删除。 删除定义使用的规则 删除在需要删除层的走线等所有内容

相同的 LLM 在「不同 GPU 上」会产生不同输出?为什么?

编者按&#xff1a; 在大语言模型(LLMs)的部署及其相关的算力扩容过程中&#xff0c;更换 GPU 是否也可能会对模型的输出产生重大影响&#xff1f;这个问题的答案对于确保 LLMs 在不同硬件环境下的一致性和可靠性至关重要。 我们今天为大家带来的这篇文章&#xff0c;作者的核心…

利用docker部署图形化工具 portainer

docker查找图形化工具 Portainer 拉取镜像 docker pull portainer/portainer启动docker UI容器 docker run -d -p 9209:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/data3/mydocker/portainer_data:/data portainer/porta…

MFC多个控件组合存在显示不出来现象

MFC多个控件组合存在显示不出来现象 1、找到rc文件 &#xff0c; 右键查看代码 2、 3、将基础组件放在最前面即可

C++(week16): C++提高:(六) Qt基础

文章目录 零、课前须知一、Qt基础1.CLI与GUI2.事件驱动模型3.Qt快捷键 二、QtCreator1.Qt的安装&#xff1a;Qt框架、IDE2.Qt的六大模式3.核心模块4.布局5.Qt项目中的文件6.信号与槽机制7.添加资源&#xff1a;资源文件qrc8.main.cpp解析(1)ui文件 和 纯代码(2)按钮 信号槽机制…

在嵌入式Linux平台上使用Nginx搭建RTMP流媒体服务器

概述 Nginx是一个以高效稳定著称的高性能的HTTP和反向代理web服务器&#xff0c;它同时也是基于事件驱动开发的异步高性能跨平台服务器。Nginx-RTMP是基于Nginx框架的模块开发&#xff0c;很好地继承了Nginx的异步高性能以及扩展性好的优点。 RTMP 是 Real Time Messaging Pr…

docker 部署 ElasticSearch;Kibana

ELasticSearch 创建网络 docker network create es-netES配合Kibana使用时需要组网&#xff0c;使两者运行在同一个网络下 命令 docker run -d \ --name es \ -e "discovery.typesingle-node" \ -v /usr/local/es/data:/usr/share/elasticsearch/data \ -v /usr/…

C语言——编译与链接

目录 引言 翻译环境与运行环境 翻译环境 1.翻译环境的简述 2.编译过程 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 3.链接 运行环境 结束语 引言 C语言编译与链接过程是理解程序如何从代码转化…

8月5日学习笔记 glibc安装与安全用户角色权限

一&#xff0c;glibc安装 https://www.mysql.com/ 官⽹ https://downloads.mysql.com/archives/community/ https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-li nux-glibc2.12-x86_64.tar 安装步骤 1.安装依赖库 [rootlocalhost ~]# yum list installed |g…

在vscode中使用ssh运行docker:从下载到运行全流程

首先在本机或者服务器上下载docker并运行 本文目的旨在本机下载docker并打包&#xff0c;然后在服务器上进行加载 docker -v Docker version 27.0.3, build 7d4bcd8有输出说明在运行 一、下载 在docker hub上下载docker以tensorflow为例 点击tag搜索自己想要的版本 copy命…

All-Reduce通信原语;Reduce+LayerNorm+Broadcast算子;gRPC:远程过程调用(RPC)框架;

目录 All-Reduce通信原语 定义与作用 实例说明 示例图解(以Ring算法为例) 结论 Reduce+LayerNorm+Broadcast算子 1. Reduce算子 2. LayerNorm算子 3. Broadcast算子 组合使用场景 gRPC:远程过程调用(RPC)框架 All-Reduce通信原语 是计算机科学中,特别是在分布式…

解锁成都跃享未来教育咨询抖音小店

在数字化浪潮汹涌的今天&#xff0c;教育行业的变革与创新层出不穷&#xff0c;其中&#xff0c;成都跃享未来教育咨询以其敏锐的洞察力和前瞻性的教育理念&#xff0c;在抖音平台上开设的小店&#xff0c;正悄然改变着人们的学习方式和教育资源的获取途径。本文将深入探讨成都…

骰子游戏的UML分析

一、需求分析 游戏者掷两个骰子,如果总点数是7则赢得游戏,否则为输 二、概要设计 2.1 设计用例 用例是基于某个场景(注:包括成功和失败场景,重要体现需求的边界)说明了用户如何通过系统实现实现其目标。 示例:玩游戏场景用例 用例名称:玩游戏 主要参与者: 游戏用户 前…

实时数据监控,三防平板在工业领域的应用解析

随着工业4.0时代的到来&#xff0c;数字化转型已成为各行各业的共同目标。在这一过程中&#xff0c;实时数据监控扮演着至关重要的角色&#xff0c;为企业提供数据驱动的决策支持&#xff0c;提升效率、降低成本、提高安全性。而作为移动终端设备&#xff0c;三防平板凭借其可靠…

深兰科技荣获2024年度金势奖“AI出海先锋品牌”金奖

近日&#xff0c;由金势奖组委会、凤凰网、营销国际协会等国内外知名机构、集团共同主办的“第四届未来营销大会暨锐品牌盛典”在上海举行。大会揭晓了第四届“金势奖锐品牌大赏”奖项的评选结果&#xff0c;深兰科技凭借自身在机器人产品出口和海外市场开拓等出海全球化发展方…

2-59 基于matlab的全离散法单自由度稳定极限切深叶瓣图绘制、两自由度稳定极限切深叶瓣图绘制

基于matlab的全离散法单自由度稳定极限切深叶瓣图绘制、两自由度稳定极限切深叶瓣图绘制&#xff0c;特定切削力系数进行数值积分。输出相应的叶瓣图。程序已调通&#xff0c;可直接运行。 2-59 两自由度稳定极限切深叶瓣图 - 小红书 (xiaohongshu.com)

【计算机组成原理】3.程序的执行

程序的执行 进程与线程 一个程序&#xff0c;读入内存&#xff0c;全是0和1构成 从内存读入到CPU计算&#xff0c;这个时候要通过总线 怎么区分一段01的数据到底是数据还是指令&#xff1f; 总线分类为三种&#xff1a;控制线 地址线 数据线 一个程序的执行&#xff0c;首…