QT + OpenCV 使用摄像头

一、创建项目&UI

开发方式:使用UI设计布局;转到槽
拖拽组件:类与布局
在这里插入图片描述

二、函数定义与演示

.pro文件添加包含目录与库目录

INCLUDEPATH += E:\opencv3\opencv\sources\build\install\include\
               E:\opencv3\opencv\sources\build\install\include\opencv2\
               E:\opencv3\opencv\sources\build\install\include\opencv

LIBS += -L E:\opencv3\opencv\sources\build\install\x64\mingw\lib\libopencv_*.a

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QFileDialog>
#include <QFile>
#include <opencv2/opencv.hpp>
#include <QMainWindow>
#include <QTimer>
#include <QImage>
#include <QPixmap>

QPixmap Mat2Image(cv::Mat src);

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void readFrame(); //自定义信号处理函数

    //以下函数为Ui生成
    void on_pushButton_openImage_clicked();

    void on_pushButton_openCamera_clicked();

    void on_pushButton_closeCamera_clicked();

    void on_pushButton_isAlg_clicked();

    void on_pushButton_photoes_clicked();

private:
    Ui::MainWindow *ui;
    QTimer *timer;
    QImage *img;
    cv::VideoCapture *videocapture;
    cv::Mat MatFrame;
    bool isAlgo;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


cv::Mat src;
cv::Mat gray;
cv::Mat tmp;
cv::Mat dst;


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);

    timer = new QTimer(this);
    img = new QImage();
    connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));
    isAlgo = false;
}

MainWindow::~MainWindow()
{
    
    
    delete ui;
}


void MainWindow::readFrame()
{
    
    
    videocapture->read(MatFrame);
    if(isAlgo){
    
    
        cv::cvtColor(MatFrame,gray,cv::COLOR_BGR2GRAY);
        cv::Canny(gray,dst,30,30*2);
    }else {
    
    
        dst = MatFrame.clone();
    }
    QPixmap qpixmap = Mat2Image(dst);
    ui->label->setPixmap(qpixmap);
}


void MainWindow::on_pushButton_openImage_clicked()
{
    
    
    QString filename = QFileDialog::getOpenFileName(this,"打开图像","","Image file(*.png *.jpg *.jpeg *.bmp)");
    if(!QFile::exists(filename)){
    
    
        return;
    }
    ui->statusbar->showMessage(filename);
    cv::Mat src = cv::imread(filename.toLatin1().data());
    if(src.empty()){
    
    
        ui->statusbar->showMessage("图像不存在!");
        return;
    }
    cv::Mat temp;
    if(src.channels()==4)
        cv::cvtColor(src,temp,cv::COLOR_BGRA2RGB);
    else if (src.channels()==3)
        cv::cvtColor(src,temp,cv::COLOR_BGR2RGB);
    else
        cv::cvtColor(src,temp,cv::COLOR_GRAY2RGB);
    QImage img = QImage((uchar*)temp.data,temp.cols,temp.rows,temp.step, QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(img));
    ui->label->resize(ui->label->pixmap()->size());
    filename.clear();
}

void MainWindow::on_pushButton_openCamera_clicked()
{
    
    
    videocapture = new cv::VideoCapture(0);
    timer->start(33);
}


QPixmap Mat2Image(cv::Mat src)
{
    
    
    QImage img;
    if(src.channels() ==3){
    
    
        cv::cvtColor(src,tmp,cv::COLOR_BGR2RGB);
        img = QImage((uchar*)tmp.data,tmp.cols,tmp.rows,tmp.step,QImage::Format_RGB888);
    }else {
    
    
        img = QImage((uchar*)src.data,src.cols,src.rows,src.step,QImage::Format_Grayscale8);
    }
    QPixmap qimg = QPixmap::fromImage(img);
    return qimg;
}

void MainWindow::on_pushButton_closeCamera_clicked()
{
    
    
    timer->stop();
    videocapture->release();
}

void MainWindow::on_pushButton_photoes_clicked()
{
    
    
    QPixmap qpixmap = Mat2Image(dst);
    ui->label_2->setPixmap(qpixmap);
}

void MainWindow::on_pushButton_isAlg_clicked()
{
    
    
    isAlgo = isAlgo==true?false:true;
}



演示效果:
在这里插入图片描述
拓展阅读:
https://blog.csdn.net/sinat_35845281/article/details/94204074
https://blog.csdn.net/xiaolong1126626497/article/details/105295367

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/123051455