概述
这是一个Qt使用opencv lib操作摄像头的例子
详细
一、简介
这是一个Qt使用opencv lib操作摄像头的例子
二、代码实现过程
新建一个VideoCapture对象,然后通过这个对象读取Mat图像数据,再讲Mat数据转成QImage显示在QLabel上。
VideoCapture既支持从视频文件(.avi , .mpg格式)读取,也支持直接从摄像机(比如电脑自带摄像头)中读取。要想获取视频需要先创建一个VideoCapture对象,VideoCapture对象的创建方式有以下三种: cop
1.是从文件(.MPG或.AVI格式)中读取视频,对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。
|
2.是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。标识符另外一部分是摄像机域(camera domain),用于表示摄像机的类型,这个域值可以是下面任一预定义常量。
|
以这种方式创建视频捕获对象时,我们所传递的标识符是域索引和摄像机索引的和。例如:
|
这个例子中VideoCapture将尝试打开第2个(编号从0开始)1394摄像机。多数情况下,由于我们只有一个摄像机,因此没必要指定摄像机的域,此时使用cv::CAP_ANY是一种高效的方式(也即是0,所以不用特意指定)。
3.先创建一个捕获对象,然后通过成员函数open()来设定打开的信息,操作如下。
cv::VideoCapture VideoCapture; 这里的第二个VideoCapture是一个对象名
VideoCapture.open( "C:/Users/DADA/DATA/gogo.avi" );
将视频帧读取到cv::Mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。
cv::Mat frame;
cap.read(frame); //读取方式一
cap >> frame; //读取方式二
本次我们采用的是方法2
void MainWindow::openCamara()
{
m_capture.open(0);
m_timer->start(50);
}
void MainWindow::closeCamer()
{
m_timer->stop();
m_capture.release();
}
该项目会使用到opencv编译得到的lib,这个可以自己下载源码编译
opencv3.4.5源码链接 https://opencv.org/releases.html