当前位置:网站首页>opencv学习—VideoCapture 类基础知识「建议收藏」
opencv学习—VideoCapture 类基础知识「建议收藏」
2022-08-03 11:11:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
以下是对两位大神的博客进行简单整理得到:http://blog.csdn.net/weicao1990/article/details/53379881
http://blog.csdn.net/guduruyu/article/details/68486063
便于为需要的同学解惑,便于自己以后复习!
在opencv中关于视频的读操作是通过VideoCapture类来完成的;关于视频的写操作是通过VideoWriter类来实现的。
<一>—VideoCapture—视频的获取操作
VideoCapture既支持从视频文件(.avi , .mpg格式)读取,也支持直接从摄像机(比如电脑自带摄像头)中读取。要想获取视频需要先创建一个VideoCapture对象,VideoCapture对象的创建方式有以下三种: cop
【方式一】是从文件(.MPG或.AVI格式)中读取视频,对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。
方法: cv::VideoCapture capture(const string& filename); // 从视频文件读取 例程: cv::VideoCapture capture("C:/Users/DADA/DATA/gogo.avi"); // 从视频文件读取
【方式二】是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。标识符另外一部分是摄像机域(camera domain),用于表示摄像机的类型,这个域值可以是下面任一预定义常量。
- [cpp]view plain
- cv::VideoCapture capture(int device ); //视频捕捉设备 id —笔记本电脑的用0表示
以这种方式创建视频捕获对象时,我们所传递的标识符是域索引和摄像机索引的和。例如:
[cpp]view plaincopy
- cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);
这个例子中VideoCapture将尝试打开第2个(编号从0开始)1394摄像机。多数情况下,由于我们只有一个摄像机,因此没必要指定摄像机的域,此时使用cv::CAP_ANY是一种高效的方式(也即是0,所以不用特意指定)。
【方式三】先创建一个捕获对象,然后通过成员函数open()来设定打开的信息,操作如下。
[cpp]view plaincopy
- cv::VideoCapture VideoCapture; 这里的第二个VideoCapture是一个对象名
- VideoCapture.open( “C:/Users/DADA/DATA/gogo.avi“ );
将视频帧读取到cv::Mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。
[cpp]view plaincopy
- cv::Mat frame;
- cap.read(frame); //读取方式一
- cap >> frame; //读取方式二
下面是读取视频并显示的示例代码:
[cpp]view plaincopy
- // 示例代码1
- #include <opencv2/opencv.hpp>
- #include <iostream>
- mian()
- {
- cv::VideoCapture capture(“C:/Users/DADA/DATA/gogo.avi“);
- if (!capture.isOpened())
- {
- std::cout << “Read video Failed !” << std::endl;
- return;
- }
- cv::Mat frame;
- cv::namedWindow(“video test”);
- int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);
- std::cout << “total frame number is: “ << frame_num << std::endl;
- for (int i = 0; i < frame_num – 1; ++i)
- {
- capture >> frame;
- //capture.read(frame); 第二种方式
- imshow(“video test”, frame);
- if (cv::waitKey(30) == ‘q’)
- {
- break;
- }
- }
- cv::destroyWindow(“video test”);
- capture.release();
- return 0;
- }
- 示例代码2
- #include <iostream>
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- int main(int argc,char* argv[])
- {
- cv::VideoCapture capture(argv[1]);
- if(!capture.isOpened())
- {
- std::cout<<“video not open.”<<std::endl;
- return 1;
- }
- //获取当前视频帧率
- double rate = capture.get(CV_CAP_PROP_FPS);
- //当前视频帧
- cv::Mat frame;
- //每一帧之间的延时
- //与视频的帧率相对应
- int delay = 1000/rate;
- bool stop(false);
- while(!stop)
- {
- if(!capture.read(frame))
- {
- std::cout<<“no video frame”<<std::endl;
- break;
- }
- //此处为添加对视频的每一帧的操作方法
- int frame_num = capture.get(CV_CAP_PROP_POS_FRAMES);
- std::cout<<“Frame Num : “<<frame_num<<std::endl;
- if(frame_num==20)
- {
- capture.set(CV_CAP_PROP_POS_FRAMES,10);
- }
- cv::imshow(“video”,frame);
- //引入延时
- //也可通过按键停止
- if(cv::waitKey(delay)>0)
- stop = true;
- }
- //关闭视频,手动调用析构函数(非必须)
- capture.release();
- return 0;
- }
上面的代码,我们使用了cv::VideoCapture的成员函数get()并设定标识cv::CAP_PROP_FRAME_COUNT获取了读取视频的帧总数。同样,我们可以指定其他标识,来获取读取视频或摄像头的其他属性。另外,我们也可以使用成员函数set(),设定相应属性的值。cv::VideoCapture中提供的属性标识如下图所示。
下面是该类的API。 1.VideoCapture类的构造函数: C++: VideoCapture::VideoCapture() C++: VideoCapture::VideoCapture(const string& filename) C++: VideoCapture::VideoCapture(int device) 功能:创建一个VideoCapture类的实例,如果传入对应的参数,可以直接打开视频文件或者要调用的摄像头。 参数: filename – 打开的视频文件名。 device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。 2.VideoCapture::open 功能:打开一个视频文件或者打开一个捕获视频的设备(也就是摄像头) C++: bool VideoCapture::open(const string& filename) C++: bool VideoCapture::open(int device) 参数: filename – 打开的视频文件名。 device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。 通过对VideoCapture类的构造函数和open函数分析,可以发现opencv读入视频的方法一般有如下两种。比如读取当前目录下名为”dog.avi”的视频文件,那么这两种写法分别如下。 (1)先实例化再初始化: VideoCapture capture; capture.open(“dog.avi”); (2)在实例化的同时进行初始化: VideoCapture(“dog.avi”); 3.VideoCapture::isOpened C++: bool VideoCapture::isOpened() 功能:判断视频读取或者摄像头调用是否成功,成功则返回true。 4.VideoCapture::release C++: void VideoCapture::release() 功能:关闭视频文件或者摄像头。 5.VideoCapture::grab C++: bool VideoCapture::grab() 功能:从视频文件或捕获设备中抓取下一个帧,假如调用成功返回true。(细节请参考opencv文档说明) 6.VideoCapture::retrieve C++: bool VideoCapture::retrieve(Mat& image, int channel=0) 功能:解码并且返回刚刚抓取的视频帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。 7.VideoCapture::read C++: VideoCapture& VideoCapture::operator>>(Mat& image) C++: bool VideoCapture::read(Mat& image) 功能:该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频帧这是一个最方便的函数对于读取视频文件或者捕获数据从解码和返回刚刚捕获的帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。 从上面的API中我们会发现获取视频帧可以有多种方法 : // 方法一 capture.read(frame); // 方法二 capture.grab(); // 方法三 capture.retrieve(frame); // 方法四 capture >> frame; 8.VideoCapture::get C++: double VideoCapture::get(int propId) 功能:一个视频有很多属性,比如:帧率、总帧数、尺寸、格式等,VideoCapture的get方法可以获取这些属性。 参数:属性的ID。 属性的ID可以是下面的之一: CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds or video capture timestamp. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 – start of the film, 1 – end of the film. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. CV_CAP_PROP_FPS Frame rate. CV_CAP_PROP_FOURCC 4-character code of codec. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). CV_CAP_PROP_HUE Hue of the image (only for cameras). CV_CAP_PROP_GAIN Gain of the image (only for cameras). CV_CAP_PROP_EXPOSURE Exposure (only for cameras). CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. CV_CAP_PROP_WHITE_BALANCE Currently not supported CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently) Note: 如果查询的视频属性是VideoCapture类不支持的,将会返回0。 9.VideoCapture::set C++: bool VideoCapture::set(int propertyId, double value) 功能:设置VideoCapture类的属性,设置成功返回ture,失败返回false。 参数:第一个是属性ID,第二个是该属性要设置的值。 属性ID如下: CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 – start of the film, 1 – end of the film. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. CV_CAP_PROP_FPS Frame rate. CV_CAP_PROP_FOURCC 4-character code of codec. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() . CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras). CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras). CV_CAP_PROP_SATURATION Saturation of the image (only for cameras). CV_CAP_PROP_HUE Hue of the image (only for cameras). CV_CAP_PROP_GAIN Gain of the image (only for cameras). CV_CAP_PROP_EXPOSURE Exposure (only for cameras). CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB. CV_CAP_PROP_WHITE_BALANCE Currently unsupported CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124988.html原文链接:https://javaforall.cn
边栏推荐
- 微信小程序获取用户手机号码
- Web Server 设置缓存响应字段的一些推荐方案
- CADEditorX ActiveX 14.1.X
- 面试一面
- CDH6.3.2开启kerberos认证
- ETL data cleaning case in MapReduce
- Who is more popular for hybrid products, depending on technology or market?
- Machine Learning Overview
- Binary search tree (search binary tree) simulation implementation (there is a recursive version)
- Web Server 设置缓存响应字段的一些推荐方案
猜你喜欢
优维低代码:Provider 构件
下午见!2022京东云数据库新品发布会
完全背包问题
For invoice processing DocuWare, cast off the yoke of the paper and data input, automatic processing all the invoice received
Why is the new earth blurred, in-depth analysis of white balls, viewing pictures, and downloading problems
机器学习(第一章)—— 特征工程
实至名归!九章云极DataCanvas公司荣获智能制造领域多项殊荣
基于PHP7.2+MySQL5.7的回收租凭系统
MySQL - 2059 - Authentication plugin ‘caching_sha2_password‘ cannot be loaded
数据库一席谈:打造开源的数据生态,支撑产业数字化浪潮
随机推荐
redis基础知识总结——数据类型(字符串,列表,集合,哈希,集合)
【LeetCode—第2题 两数之和 代码详解 】附有源码,可直接复制
性能优化|从ping延时看CPU电源管理
FR9811S6 SOT-23-6 23V, 2A Synchronous Step-Down DC/DC Converter
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
再谈“雷克萨斯”安全装置失效!安全手册疑点重重,网友:细思极恐
【Star项目】小帽飞机大战(九)
面试一面
数据库一席谈:打造开源的数据生态,支撑产业数字化浪潮
【TypeScript】Why choose TypeScript?
complete knapsack problem
【一起学Rust】Rust学习前准备——注释和格式化输出
【多线程的相关内容】
Babbitt | Metaverse daily must-read: Players leave, platforms are shut down, and the digital collection market is gradually cooling down. Where is the future of the industry?...
Win10/11 删除文件资源管理器左侧栏目文件夹
程序员架构修炼之道:软件架构基本概念和思维
增加WebView对localStorage的支持
MATLAB Programming and Applications 2.6 Strings
Analysis of the idea of the complete knapsack problem
跨链桥协议 Nomad 遭遇黑客攻击,损失超 1.5 亿美元