OpenCV 读取 MP4 视频

news/2024/10/11 3:18:33/

在 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.ppmy.cn/news/1506356.html

相关文章

从人工智能神经网络出发

今天与豆包聊天&#xff0c;聊了当前深度学习中的神经网络。 1、跟他多次沟通后&#xff0c;对GPT中的神经网络总结了如下几个关键要点&#xff1a; &#xff08;1&#xff09;GPT是一种基于深度学习的语言模型&#xff0c;它使用线性代数和神经网络来模拟人工神经元。 &…

Java面试题--JVM大厂篇之破解 JVM 性能瓶颈:实战优化策略大全

目录 引言: 正文: 1. 常见的JVM性能问题 频繁的GC导致应用暂停 内存泄漏导致的内存不足 线程争用导致的CPU利用率过高 类加载问题导致的启动时间过长 2. 优化策略大全 2.1 代码层面的优化 2.1.1 避免不必要的对象创建 2.1.2 优化数据结构的选择 2.1.3 使用并发工具…

GPT-5:未来已来,你准备好了吗?

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#xff0c;穆…

Linux 文件系统、动静态库

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、文件系统 1、了解磁盘的存储结构 1.基本知识 2.磁盘中盘片为什么高速旋转&#xff1f; 3.磁头为什么要左右摇摆&#xff1f; 4.如何找到一个指定位置的扇区&#xff1f; 5.文件在磁盘…

网络安全知识讲解

引言 随着互联网的普及和信息化的深入&#xff0c;网络安全已经成为现代社会的一个重要议题。网络安全涉及保护网络和数据免受未经授权的访问、攻击、修改和破坏。本文将系统地讲解网络安全的基本概念、常见威胁、主要技术、最佳实践以及发展趋势&#xff0c;帮助读者全面了解…

“阳光高考爬虫项目揭秘:增量爬虫与断点续抓的Python实战“

阳光高考项目 项目要求 爬取各大高校基本信息和招生简章&#xff08;招生简章要求存储为pdf格式并且入库&#xff09; 数据库表设计 idtask_urlstatus&#xff1a;0(未抓取)&#xff0c;1(抓取中)&#xff0c;2(抓取完毕)&#xff0c;3(错误)&#xff0c;4(更新中)&#xff…

Python 设计模式之单例模式

文章目录 单例模式的实现Module-level SingletonClassic Singleton 单例模式实现的优化线程安全问题违反单一职责原则 单例模式的应用 单例模式是一种创建型设计模式&#xff0c;其目的是为了保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点&#xff0c;这么做…

SQL中插入数据,获取新增数据的id主键

方法一&#xff1a;使用Mybatis plus自带的insert()方法 entity Data AllArgsConstructor NoArgsConstructor TableName("student") public class Student{ApiModelProperty("主键")TableId(type IdType.AUTO)private Integer id;ApiModelProperty(&quo…