qt+opencv调用笔记本摄像头

  1. pro文件改写:
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;
  1. cpp文件:
    头文件:
#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();
    }
}

你可能感兴趣的:(qt+opencv调用笔记本摄像头)