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

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 <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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL:触发器(Trigger)
  • C# 枚举 扩展方法
  • 【乐吾乐大屏可视化组态编辑器】数据绑定
  • Mac 连接 Synology NAS【Finder】
  • 【C语言篇】自定义类型:联合体和枚举详细介绍
  • 【django升级】django从2.2.6版本升级到3.2.25
  • 【ubuntu20.04 运行sudo apt-get upgrade报错】
  • 主机加固是什么?主机加固与产线工控安全关系
  • pg_stat_statements插件使用指南
  • NLP——文本预处理-新闻主题分类案例
  • MySQL——数据库的设计、事务、视图
  • GraalVM全面介绍:革新Java应用开发的利器
  • 【循环神经网络】案例:周杰伦歌词文本预测【训练+python代码】
  • 你真正了解低代码么?(国内低代码平台状况分析)
  • 华为od(D卷)最大N个数和最小N个数的和
  • 【RocksDB】TransactionDB源码分析
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【刷算法】从上往下打印二叉树
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C++11: atomic 头文件
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6 ...操作符
  • Leetcode 27 Remove Element
  • Lucene解析 - 基本概念
  • Mithril.js 入门介绍
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python socket服务器端、客户端传送信息
  • Redis在Web项目中的应用与实践
  • SQLServer之创建数据库快照
  • Vue ES6 Jade Scss Webpack Gulp
  • 创建一种深思熟虑的文化
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 如何使用 JavaScript 解析 URL
  • 如何选择开源的机器学习框架?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 通过git安装npm私有模块
  • 线上 python http server profile 实践
  • 一道面试题引发的“血案”
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # Kafka_深入探秘者(2):kafka 生产者
  • #07【面试问题整理】嵌入式软件工程师
  • #QT(一种朴素的计算器实现方法)
  • (4)STL算法之比较
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (搬运以学习)flask 上下文的实现
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (循环依赖问题)学习spring的第九天
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)LINQ之路
  • (转)Oracle 9i 数据库设计指引全集(1)
  • *** 2003
  • .Net - 类的介绍
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例