系列文章:
QT + Opencv开发(一)——环境配置
文章目录
功能
实现打开文件、读取图像数据、滑动条控制二值化、canny、高斯模糊参数并显示处理后的图片的功能。
功能实现
搭建界面
首先搭建好界面
代码
最关键的代码在mainwindow.cpp中,如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/opencv.hpp"
#include "QFileDialog"
#include "QtDebug"
cv::Mat _src;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 选取文件
connect(ui->btn_openFile,&QPushButton::clicked,[=](){
//点击选取文件按钮,弹出文件对话框
QString path = QFileDialog::getOpenFileName(this,"打开文件","E:/Pictures/");
//将路径放入到lineEdit中
ui->show_filePath->setText(path);
_src = cv::imread(path.toStdString());
if(_src.empty())
{
qDebug() << "could not load the image...";
return;
}
cv::Mat src = _src.clone();
cv::cvtColor(src, src, cv::COLOR_BGR2RGB);
QImage img = QImage(src.data, src.cols, src.rows, src.step, QImage::Format_RGB888);
// int w = img.width();
// int h = img.height();
// if(w > 800 || h > 800)
// {
// double rate = 888.0 / std::max(w, h);
// int nw = static_cast<int>(rate * w);
// int nh = static_cast<int>(rate * h);
// img = img.scaled(QSize(nw, nh), Qt::KeepAspectRatio);
// }
QPixmap mp;
mp = mp.fromImage(img);
ui->label_src->setPixmap(mp);
ui->label_src->setAlignment(Qt::AlignCenter);
src.release();
});
// canny提取边缘
connect(ui->btn_canny,&QPushButton::clicked,[=](){
cv::Mat src = _src.clone();
if(src.empty())
{
qDebug() << "could not load the image...";
return;;
}
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
cv::Mat edge;
ui->text_cannyLowValue->setText(QString::number(ui->slider_cannyLowValue->value()));
ui->text_cannyHighValue->setText(QString::number(ui->slider_cannyHighValue->value()));
cv::Canny(src, edge, ui->slider_cannyLowValue->value(), ui->slider_cannyHighValue->value());
QImage img = QImage(edge.data, edge.cols, edge.rows, edge.step, QImage::Format_Grayscale8);
QPixmap mp;
mp = mp.fromImage(img);
ui->label_canny->setPixmap(mp);
ui->label_canny->setAlignment(Qt::AlignCenter);
src.release();
});
// 二值化
connect(ui->btn_binary,&QPushButton::clicked,[=](){
cv::Mat src = _src.clone();
if(src.empty())
{
qDebug() << "could not load the image...";
return;
}
cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);
cv::Mat bin;
ui->text_binaryValue->setText(QString::number(ui->slider_binaryValue->value()));
cv::threshold(src, bin, ui->slider_binaryValue->value(), 255, cv::THRESH_BINARY);
QImage img = QImage(bin.data, bin.cols, bin.rows, bin.step, QImage::Format_Grayscale8);
QPixmap mp;
mp = mp.fromImage(img);
ui->label_binary->setPixmap(mp);
ui->label_binary->setAlignment(Qt::AlignCenter);
src.release();
});
//高斯模糊
connect(ui->btn_gauss, &QPushButton::clicked,[=](){
cv::Mat pic = _src.clone();
if(pic.empty())
{
qDebug()<<"could not load image ...";
return;
}
cv::Mat gauss_img;
int Ksize =2 * ui->slider_gaussKernalSize->value() + 1;
ui->text_gaussKernalSize->setText(QString::number(Ksize));
cv::GaussianBlur(pic, gauss_img, cv::Size(Ksize, Ksize), 1, 1);
QImage img = QImage(gauss_img.data, gauss_img.cols, gauss_img.rows, gauss_img.step, QImage::Format_BGR888);
QPixmap mp;
mp = mp.fromImage(img);
ui->label_draw->setPixmap(mp);
ui->label_draw->setAlignment(Qt::AlignCenter);
pic.release();
});
}
MainWindow::~MainWindow()
{
delete ui;
_src.release();
}
功能展示
打包
windeployqt
windeployqt是QT5自带的打包工具,它可以找到程序(exe)用到的所有库文件,并且都拷贝到exe程序的当前文件。
- 新建一个文件夹,命名为my_release,把上面run之后生成的exe文件复制进去。
2. 以管理员身份打开命令提示符,进入当前文件夹
cd /d E:\workSpace\qt_workspace\build-opencv_startDemo-Desktop_Qt_5_15_2_MinGW_64_bit-Release\my_release
注意路径写自己的路径,我这里只是演示。
3. 利用windeployqt进行打包
输入:
windeployqt opencv_startDemo.exe
格式为:windeployqt 你想打包的程序名
需要注意的是,要保证windeployqt .exe已经在环境变量里边,否则这一步会出错,如果出错,可以找到windeployqt .exe的位置,如下图,然后将该位置添加进系统环境变量就可以了。
打包后的文件夹:
将该文件夹整体打包给别人,他们就可以运行这个程序了。
HM NIS Edit + NSIS
在上一步的基础上,还可以使用第三方打包工具HM NIS Edit进一步进行打包,生成带向导的安装程序Setup.exe
HM NIS Edit下载:http://hmne.sourceforge.net/
NSIS:https://nsis.sourceforge.io/Download
把这两个安装之后,需要打开HM NIS Edit配置一下NSIS的编译器否则新建向导脚本的时候是没有语言选项的。
打包教程:
参考:https://www.cnblogs.com/yply/p/12001813.html
前面的按照教程里边来,需要注意的只有一步:
打包完成后就得到了带向导的安装程序Setup.exe
将该安装程序发给别人后,别人可以 使用自定义安装路径等操作(就和我们平时下载的安装包一样)。
其他打包工具:
Engima Virtual Box 下载链接:http://enigmaprotector.com/en/downloads.html
使用教程:https://blog.csdn.net/kangshuaibing/article/details/84951619
大家可以尝试一下。
打包常见错误
Qt软件打包后报错“无法定位程序输入点_ZN10QArrayData10deallocateEPs_jj于动态链接库… .exe上。
这是因为构建项目时使用的编译工具和打包软件时使用的编译工具不一样所导致的。
解决办法:打包的时候选择相应的编译工具就可以了。
参考:https://blog.csdn.net/weijifen000/article/details/102537640
相关知识
- int 转Qstring:
Qstring::number(int value)