一、创建项目&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