QT使用Opencv3.4读取图片与调用摄像头实时显示

这里写自定义目录标题

  • 前提
    • 读取图片与显示图片(两种方法)
    • 打卡摄像头

前提

本次尝试记录一个使用QT调用opencv3.4读取图片与打开摄像头实时显示的效果,电脑安装好QT,OPENCV3.4,并能成功在QT中搭建opencv的环境,具体可以参考之前写的一篇博客。[https://blog.csdn.net/weixin_46096032/article/details/115570677?spm=1001.2014.3001.5501]

完成环境的搭建后让我们开始吧~

读取图片与显示图片(两种方法)

新建的一个QT项目会有两个CPP文件和一个.h的头文件,其中main.cpp的文件我们不会去进行编辑。读取图片与显示图片有两种方式
先说第一种,使用opencv自制的imread方法

QT使用Opencv3.4读取图片与调用摄像头实时显示_第1张图片
在UI中拉出一个Push Button,然后右键点击转到槽,此时自动跳到cpp的这里,然后我们利用opencv的语法规则编写以下代码,然后确定。在这里插入图片描述

	cv::Mat src=cv::imread("C:/Users/admin/Desktop/cross.jpg");
    cv::imshow("input imgage",src);
    cv::waitKey(0);
    cv::destroyAllWindows();

运行后,便会通过opencv的 im秀儿显示出一张图片啦
QT使用Opencv3.4读取图片与调用摄像头实时显示_第2张图片
哈哈,imshow=i m 秀儿

2.使用QT界面来显示,不同于opencv,在qt界面显示图片需要将opencv的Mat格式图片转换为Qt的QImage格式,由于opencv的图片格式RGB三颜色的通道顺序是BGR,还要先把BGR转成RGB。
这个相对比较复杂,后期会更新写出,或者单独写一篇博客介绍这个方法~

打卡摄像头

打开摄像头,需要我们先新建一个button和一个label。
同样的将button转到槽,在写代码之前我们需要将该定义的变量定义好,还有该声明的声明好,为了顺利显示出一个摄像头的画面,还需要定义timer,capture等。我们在.h的头文件private中定义好,同时也在头文件定义好需要用到的库

#include
#include"QTimer"
#include"QImage"
#include"opencv2/opencv.hpp"

QT使用Opencv3.4读取图片与调用摄像头实时显示_第3张图片

private:
    Ui::MainWindow *ui;
    VideoCapture capture;//VideoCapture类的实例化
    QTimer *timer;//计时器
    Mat frame;//获取的一帧画面

接着在刚才转到的槽中解析这个函数;

void MainWindow::on_pushButton_2_clicked()
{
    capture.open(0);//打开一个捕捉视频的设备,并获取视频
    timer->start(20);//开始计时
}

现在我们已经完成了摄像头的定义并且打开了摄像头,接下来就是要将捕获的帧返回到label并显示出来
首先在头文件定义一个读取帧的函数

void ReadFrame();//读取帧数

先做好槽函数与控件的连接

	setWindowTitle("video-test");
    timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrame()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(on_pushButton_2_clicked()));

ReadFrame的代码如下,

void MainWindow::ReadFrame()
{
    capture>>frame;//返回每一帧
    //QImage image=Mat2QImage(frame);
    //将视频显示在label上
    QImage image=QImage((const uchar*)frame.data,frame.cols,frame.rows,QImage::Format_RGB888).rgbSwapped();
    ui->label->setPixmap(QPixmap::fromImage(image));
}

另外,从摄像头中返回的frame取出来的是镜像图片,在水平方向上是左右颠倒的,如果要恢复正常可以将QImage那里加上mirrored

ui->label->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));

从而完成了调用摄像头并显示的功能啦
QT使用Opencv3.4读取图片与调用摄像头实时显示_第4张图片
最后便是一个关闭摄像头的控件,这个十分简单,同样是新建一个控件然后转到槽,在槽函数中写入如下代码,完成~

void MainWindow::on_pushButton_3_clicked()
{
    timer->stop();
    ui->label->clear();
    capture.release();
}

你可能感兴趣的:(opencv,qt,计算机视觉,c++)