OpenCV 读取 MP4 视频

在 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 "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{


	// 打开视频文件
	VideoCapture cap("025.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;
		}

		// 显示这一帧
		namedWindow("Video", WINDOW_NORMAL);
		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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值