VideoCapture是OpenCV2.X中新增的一个类,对应于之前C语言版本的Capture结构体。它提供了从摄像机或视频文件捕获视频的C++接口,作用是从视频文件或从摄像头捕获视频并显示出来。
- 读取并播放视频
通过对VideoCapture类的分析,可以发现利用它读入视频的方法一般有如下两种。比如读入的视频为工程路径下名为"l.avi”的视频文件,那么这两种写法
分别如下。
(1)先实例化再初始化:
(2)在实例化的同时进行初始化:VideoCapture capture capture.open("1.avi")
VideoCapture capture(“1.avi”)
这两种写法的区别就如我们定义一个int类型的变量一样:"int a;a=1;”为先定义再初始化:"int a=1;”为在定义时初始化。
视频读入到VideoCapture类对象之后,紧接着可以用一个循坏将每一帧显示出来,相关代码如下:
这段代码中,首先定义了一个Mat变量,用于存储每一帧的图像,接着读取当前帧到Mat变量中,然后调用imshow显示当前的这一帧图像,并用waitKey//循环显示每一帧 while(1) { Matframe;//定义一个Mat变量,用于存储每一帧的图像 capture>>frame://读取当前帧 imshow("读取视頻",frame); //显示当前帧 //延时30ms waitKey(30); }
延时30毫秒,开始下一次循环。
程序运行截图:#include<opencv2\opencv.hpp> using namespace cv; int main(){ //读入视频 VideoCapture capture("mingchangmian.mp4"); //显示每一帧 while (1) { Mat frame; capture >> frame; imshow("名场面", frame); waitKey(30); } return 0; }
- 调用摄像头采集图像
如果我们要调用摄像头进行视频采集的话,将代码VideoCapture capture("mingchangmian.mp4”);的"mingchangmian.mp4”换为0就可以了,表示
调用摄像头而不是从文件中读取视频。对应于上文讲到的两种写法,即:
(1)先实例化再初始化
VideoCapture capture;
capture.open(0);
(2) 在实例化的同时进行初始化
VideoCapture capture(0);
可以发现,利用VideoCapture类调用摄像头采集视频和从文件中读入视频的区别仅仅是在VideoCapture类对象初始化时指定的内容的区别,即,是指定文件名如“mingchangmian.mp4”,还是填一个0表示调用摄像头而已。接下来让我们一起看看用Opencv调用摄像头的精简示例程序,并在代码中熟悉整个调用过程。#include<opencv2\opencv.hpp> using namespace cv; int main(){ //读入视频 VideoCapture capture(0); //显示每一帧 while (1) { Mat frame; capture >> frame; imshow("名场面", frame); waitKey(30); } return 0; }
另外,还可以使用摄像头程序配合canny边缘检测,得到canny边缘检测并高斯模糊后的摄像头采集视频,源码如下: