QT += core gui multimedia multimediawidgets
INCLUDEPATH += C:\opencv40\opencv\build\include
LIBS += C:\opencv40\opencv\build_qt\bin\libopencv_*.dll
(其中,build_qt是我cmake编译时起的名字,配置好的文件也都在这个文件夹下。
配置过程详见以下链接:
https://blog.csdn.net/huyiping12345/article/details/103157822)
2. h文件:
引入头文件:
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include
using namespace cv;
using namespace std;
public:
public:
QImage MatImageToQt(const Mat &src); //Mat转QLabel
槽函数:
private slots:
void readFarme();
void jiankongProcess(int);
私有变量:
private:
VideoCapture cap;
Mat src_image;
QTimer *timer;
#include
#include
#include
主函数:
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Widget::readFarme);
connect(ui->comboBox_9, static_cast(&QComboBox::currentIndexChanged), this, &Widget::jiankongProcess);
readFarme函数:
void Widget::readFarme()
{
cap.read(src_image);
QImage imag = MatImageToQt(src_image);
ui->labelImageYuanshi1->setPixmap(QPixmap::fromImage(imag));
}
jiankongProcess函数:
void Widget::jiankongProcess(int index){
index = ui->comboBox_9->currentIndex();
switch (index) {
case -1: //默认状态
break;
case 0: //菜单
{
QMessageBox::about(this,"实时监控","请选择您要进行的相机处理!");
break;
}
case 1: //打开相机
{
cap.open(0);
timer->start(33);
break;
}
case 2: //暂停相机
{
if(timer->isActive() == false)
{
QMessageBox::about(this,"暂停相机","请先打开相机!");
break;
}
else
{
timer->stop();
cap.release();
break;
}
}
case 3: //唤起相机
{
if(timer->isActive() == true)
{
QMessageBox::about(this,"唤起相机","相机正在运行!");
break;
}
else
{
cap.open(0);
timer->start(33);
break;
}
}
case 4: //关闭相机
{
timer->stop();
cap.release();
ui->labelImageYuanshi1->clear();
break;
}
default:
break;
}
}
MatImageToQt函数:
//Mat转成QImage
QImage Widget::MatImageToQt(const Mat &src)
{
//CV_8UC1 8位无符号的单通道---灰度图片
if(src.type() == CV_8UC1)
{
//使用给定的大小和格式构造图像
//QImage(int width, int height, Format format)
QImage qImage(src.cols,src.rows,QImage::Format_Indexed8);
//扩展颜色表的颜色数目
qImage.setColorCount(256);
//在给定的索引设置颜色
for(int i = 0; i < 256; i ++)
{
//得到一个黑白图
qImage.setColor(i,qRgb(i,i,i));
}
//复制输入图像,data数据段的首地址
uchar *pSrc = src.data;
for(int row = 0; row < src.rows; row ++)
{
//遍历像素指针
uchar *pDest = qImage.scanLine(row);
//从源src所指的内存地址的起始位置开始拷贝n个
//字节到目标dest所指的内存地址的起始位置中
memcmp(pDest,pSrc,src.cols);
//图像层像素地址
pSrc += src.step;
}
return qImage;
}
//为3通道的彩色图片
else if(src.type() == CV_8UC3)
{
//得到图像的的首地址
const uchar *pSrc = (const uchar*)src.data;
//以src构造图片
QImage qImage(pSrc,src.cols,src.rows,src.step,QImage::Format_RGB888);
//在不改变实际图像数据的条件下,交换红蓝通道
return qImage.rgbSwapped();
}
//四通道图片,带Alpha通道的RGB彩色图像
else if(src.type() == CV_8UC4)
{
const uchar *pSrc = (const uchar*)src.data;
QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_ARGB32);
//返回图像的子区域作为一个新图像
return qImage.copy();
}
else
{
return QImage();
}
}