Qt + OpenCV开发(二)——使用label显示图片并打包发布

系列文章:
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程序的当前文件。

  1. 新建一个文件夹,命名为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的位置,如下图,然后将该位置添加进系统环境变量就可以了。
在这里插入图片描述
打包后的文件夹:

在这里插入图片描述
将该文件夹整体打包给别人,他们就可以运行这个程序了。

后记: 打包给别人,别人运行后可能会出现找不到libopencv_world450.dll,libgomp-1.dll等错误,这就要自己在自己电脑上找到对应库然后拷贝给对方,放在打包文件下就可以运行了。 (libgomp-1.dll在yourPath\Qt_5.15.2\Tools\mingw810_64\bin下可以找到)

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)

猜你喜欢

转载自blog.csdn.net/weixin_44456692/article/details/110387505