本次尝试记录一个使用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方法
在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秀儿显示出一张图片啦
哈哈,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"
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)));
从而完成了调用摄像头并显示的功能啦
最后便是一个关闭摄像头的控件,这个十分简单,同样是新建一个控件然后转到槽,在槽函数中写入如下代码,完成~
void MainWindow::on_pushButton_3_clicked()
{
timer->stop();
ui->label->clear();
capture.release();
}