• 在Visual studio 2019中创建Qt+OpenCv项目


    一般创建Qt项目,都会第一时间想到Qt creator,这个IDE确实好用,可自由选择编译器(mingw或Visual studio),但要同时结合OpenCv框架,整个配置过程太繁琐了,好像需要用到Cmake工具。综合考虑了一下,在Visual Studio中创建Qt+OpenCv项目要简单一些。

    项目开始之前需要需要在Visual studio中配置好Qt和OpenCv的开发环境,不会的看这两篇:

    Visual Studio 2019中使用Qt,步骤详解_Xx_Studying的博客-CSDN博客_vs2019 使用qt

    VS2019中配置OpenCv4.5.5,保姆级教程_Xx_Studying的博客-CSDN博客_vs2019配置opencv

    环境搭建好之后,即可编写Qt+OpenCv项目了。

    (注意:在VS中创建的Qt项目,生成的是ui对象,不是ui指针,用的不习惯可以自己改成ui指针,同时要注意new和delete,另外项目树中也没有Pro文件)

    该项目来源《OpenVCv3和Qt5计算机视觉应用开发》

    本人的基本环境:Windows11、Opencv4.5.5、visual studio2019.

    1、创建空项目

    双击打开vs2019 

    新建项目

     随后直接下一步进行创建。

    空项目完成之后,双击ui文件,进行界面绘制:

    这时候呢们的按键颜色会和我不同, 不要着急,选中按钮控件右击,点击改变样式表:

    添加几行代码即可 ,下面的绿色按钮同理,不过背景颜色改为:background-color:#99ff99;

     然后对各个控件进行重新命名,如下

     改完之后附上详细代码吧:

    main.cpp

    1. #include "Fist_Qt_OpenCV.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Fist_Qt_OpenCV w;
    7. w.show();
    8. return a.exec();
    9. }

    First_Qt_OpenCv.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include "ui_Fist_Qt_OpenCV.h"
    11. class Fist_Qt_OpenCV : public QMainWindow
    12. {
    13. Q_OBJECT
    14. public:
    15. Fist_Qt_OpenCV(QWidget *parent = nullptr);
    16. ~Fist_Qt_OpenCV();
    17. private:
    18. Ui::Fist_Qt_OpenCVClass *ui;
    19. void loadSettings();//加载设置,
    20. void saveSettings();//保存设置,程序运行关闭后,再次打开保留上次的状态,如单选框或复选框的状态
    21. protected:
    22. void closeEvent(QCloseEvent* event); //覆盖原来的虚函数,用来关闭程序,进行提示
    23. private slots:
    24. void on_inputPushButton_pressed();
    25. void on_outputPushButton_pressed();
    26. };

    First_Qt_OpenCv.cpp

    1. #include "Fist_Qt_OpenCV.h"
    2. Fist_Qt_OpenCV::Fist_Qt_OpenCV(QWidget *parent)
    3. : QMainWindow(parent),ui(new Ui::Fist_Qt_OpenCVClass)
    4. {
    5. ui->setupUi(this);
    6. loadSettings();
    7. connect(ui->inputPushButton, &QPushButton::pressed, this, &Fist_Qt_OpenCV::on_inputPushButton_pressed);
    8. }
    9. Fist_Qt_OpenCV::~Fist_Qt_OpenCV()
    10. {
    11. delete ui;
    12. }
    13. void Fist_Qt_OpenCV::on_inputPushButton_pressed()
    14. {
    15. //QFileDialog用于选择计算机上的文件或文件夹,使用时需包含相应的头文件
    16. //QDir用于访问计算机上的文件夹,并获得有关文件夹路径的各种类型的信息,使用时需包含相应的头文件
    17. //
    18. QString fileName = QFileDialog::getOpenFileName(this, "open Input Image", QDir::currentPath(), "Images (*.jpg *.png *.bmp)");
    19. if (QFile::exists(fileName))
    20. {
    21. ui->inputLineEdit->setText(fileName);
    22. }
    23. }
    24. void Fist_Qt_OpenCV::on_outputPushButton_pressed()
    25. {
    26. QString fileName = QFileDialog::getSaveFileName(this, "Select Output Image", QDir::currentPath(), "Images (*.jpg *.png *.bmp)");
    27. if (!fileName.isEmpty())
    28. {
    29. ui->outputLineEdit->setText(fileName);
    30. using namespace cv;
    31. Mat inpImg, outImg;
    32. inpImg = imread(ui->inputLineEdit->text().toStdString());//将Qt的Qstring转换为C++ std::string类
    33. if (ui->mediaBlurRaioButton->isChecked())
    34. {
    35. cv::medianBlur(inpImg, outImg, 5);
    36. }
    37. else if (ui->gaussianBlurRaioButton->isChecked())
    38. {
    39. cv::GaussianBlur(inpImg, outImg, Size(5,5),1.25);
    40. }
    41. imwrite(fileName.toStdString(), outImg);
    42. if (ui->displayImageCheckBox->isChecked())
    43. {
    44. imshow("Output Image", outImg);
    45. }
    46. }
    47. }
    48. void Fist_Qt_OpenCV::closeEvent(QCloseEvent* event)
    49. {
    50. //QcloseEvent是众多Qt事件类(QEvent)中的一个
    51. //QMessageBox类可用来显示简单的图标、文本或信息
    52. int result = QMessageBox::warning(this, "Exit", "Are you sure you want to close this program?", QMessageBox::Yes, QMessageBox::No);
    53. if (result == QMessageBox::Yes)
    54. {
    55. saveSettings();
    56. event->accept();
    57. }
    58. else
    59. {
    60. event->ignore();
    61. }
    62. }
    63. void Fist_Qt_OpenCV::loadSettings()
    64. {
    65. QSettings settings("Packt","Fist_Qt_OpenCV",this);
    66. ui->inputLineEdit->setText(settings.value("inputLineEdit", "").toString());
    67. ui->outputLineEdit->setText(settings.value("outputLineEdit", "").toString());
    68. ui->mediaBlurRaioButton->setChecked(settings.value("mediaBlurRadioButton",true).toBool());
    69. ui->gaussianBlurRaioButton->setChecked(settings.value("gaussianBlurRaioButton", false).toBool());
    70. ui->displayImageCheckBox->setChecked(settings.value("displayImageCheckBox", false).toBool());
    71. }
    72. void Fist_Qt_OpenCV::saveSettings()
    73. {
    74. QSettings settings("Packt", "Hello_OpenCV_Qt", this);
    75. settings.setValue("inputLineEdit", ui->inputLineEdit->text());
    76. settings.setValue("outputLineEdit", ui->outputLineEdit->text());
    77. settings.setValue("mediaBlurRadioButton", ui->mediaBlurRaioButton->isChecked());
    78. settings.setValue("gaussianBlurRaioButton", ui->gaussianBlurRaioButton->isChecked());
    79. settings.setValue("displayImageCheckBox", ui->displayImageCheckBox->isChecked());
    80. }

    这是小项目的主要代码,再次强调,在VS中创建的Qt项目,生成的是ui对象,不是ui指针,我自己改成ui指针。具体细节看我代码,一般的地方都有注释,关于一些类,可以参考Qt和OpenCv手册。

    最后,这个小项目是选择文件路径下的一副图片,然后是选择对图像进行中值模糊处理或高斯模糊处理,并将处理后的图像存于指定路径下。

    运行示例:

     按回车,在指定路径下已经生成了高斯模糊后的图片;

    原图:

     高斯模糊后的图片:

     小白的学习摸索之路,欢迎讨论指正。

  • 相关阅读:
    【计算机视觉40例】案例20:K均值聚类实现艺术画
    [RSA议题分析] eBPF Warfare - Detecting Kernel & eBPF Rootkits with Tracee
    什么?MySQL 8.0 会同时修改两个ib_logfilesN 文件?
    安全开发之碰撞检测与伤害计算逻辑
    BHQ-1 amine,1308657-79-5,BHQ染料通过FRET和静态猝灭的组合工作
    产品工作流| 需求讲解
    WIN10操作系统解决磁盘文件只读属性问题
    工程伦理--7.2 可持续发展概念的定义与内涵
    文件系统XFS与EXF4的区别
    VSCode配置 C/C++ 环境
  • 原文地址:https://blog.csdn.net/Xx_Studying/article/details/126048712