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

2023-11-19

一般创建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

#include "Fist_Qt_OpenCV.h"
#include <QtWidgets/QApplication>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Fist_Qt_OpenCV w;
    w.show();
    return a.exec();
}

First_Qt_OpenCv.h

#pragma once

#include <QtWidgets/QMainWindow>
#include <QFileDialog>
#include <QDir>
#include <QFile>
#include <QMessageBox>
#include <QCloseEvent>
#include <QSettings>

#include<opencv2\opencv.hpp>

#include "ui_Fist_Qt_OpenCV.h"


class Fist_Qt_OpenCV : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::Fist_Qt_OpenCVClass *ui;
    void loadSettings();//加载设置,
    void saveSettings();//保存设置,程序运行关闭后,再次打开保留上次的状态,如单选框或复选框的状态

protected:
    void closeEvent(QCloseEvent* event); //覆盖原来的虚函数,用来关闭程序,进行提示

private slots:
    void on_inputPushButton_pressed();
    void on_outputPushButton_pressed();

};

First_Qt_OpenCv.cpp

#include "Fist_Qt_OpenCV.h"

Fist_Qt_OpenCV::Fist_Qt_OpenCV(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::Fist_Qt_OpenCVClass)
{
    ui->setupUi(this);
    loadSettings();
    connect(ui->inputPushButton, &QPushButton::pressed, this, &Fist_Qt_OpenCV::on_inputPushButton_pressed);
}

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

void Fist_Qt_OpenCV::on_inputPushButton_pressed()
{
    //QFileDialog用于选择计算机上的文件或文件夹,使用时需包含相应的头文件
    //QDir用于访问计算机上的文件夹,并获得有关文件夹路径的各种类型的信息,使用时需包含相应的头文件
    //
    QString fileName = QFileDialog::getOpenFileName(this, "open Input Image", QDir::currentPath(), "Images (*.jpg *.png *.bmp)");
    if (QFile::exists(fileName))
    {
        ui->inputLineEdit->setText(fileName);
    }
}

void Fist_Qt_OpenCV::on_outputPushButton_pressed()
{
    QString fileName = QFileDialog::getSaveFileName(this, "Select Output Image", QDir::currentPath(), "Images (*.jpg *.png *.bmp)");
    if (!fileName.isEmpty())
    {
        ui->outputLineEdit->setText(fileName);
        using namespace cv;
        Mat inpImg, outImg;
        inpImg = imread(ui->inputLineEdit->text().toStdString());//将Qt的Qstring转换为C++ std::string类
        if (ui->mediaBlurRaioButton->isChecked())
        {
            cv::medianBlur(inpImg, outImg, 5);
        }
        else if (ui->gaussianBlurRaioButton->isChecked())
        {
            cv::GaussianBlur(inpImg, outImg, Size(5,5),1.25);
        }
        imwrite(fileName.toStdString(), outImg);
        if (ui->displayImageCheckBox->isChecked())
        {
            imshow("Output Image", outImg);
        }

    }
}

void Fist_Qt_OpenCV::closeEvent(QCloseEvent* event)
{
    //QcloseEvent是众多Qt事件类(QEvent)中的一个
    //QMessageBox类可用来显示简单的图标、文本或信息
    int result = QMessageBox::warning(this, "Exit", "Are you sure you want to close this program?", QMessageBox::Yes, QMessageBox::No);
    if (result == QMessageBox::Yes)
    {
        saveSettings();
        event->accept();
    }
    else
    {
        event->ignore();
    }
}

void Fist_Qt_OpenCV::loadSettings()
{
    QSettings settings("Packt","Fist_Qt_OpenCV",this);
    ui->inputLineEdit->setText(settings.value("inputLineEdit", "").toString());
    ui->outputLineEdit->setText(settings.value("outputLineEdit", "").toString());
    ui->mediaBlurRaioButton->setChecked(settings.value("mediaBlurRadioButton",true).toBool());
    ui->gaussianBlurRaioButton->setChecked(settings.value("gaussianBlurRaioButton", false).toBool());
    ui->displayImageCheckBox->setChecked(settings.value("displayImageCheckBox", false).toBool());
}


void Fist_Qt_OpenCV::saveSettings()
{
    QSettings settings("Packt", "Hello_OpenCV_Qt", this);
    settings.setValue("inputLineEdit", ui->inputLineEdit->text());
    settings.setValue("outputLineEdit", ui->outputLineEdit->text());
    settings.setValue("mediaBlurRadioButton", ui->mediaBlurRaioButton->isChecked());
    settings.setValue("gaussianBlurRaioButton", ui->gaussianBlurRaioButton->isChecked());
    settings.setValue("displayImageCheckBox", ui->displayImageCheckBox->isChecked());
}

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

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

运行示例:

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

原图:

 高斯模糊后的图片:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Visual studio 2019中创建Qt+OpenCv项目 的相关文章

随机推荐

  • 最全的交叉编译Makefile讲解

    最近正在搞交叉编译 参考很多博客 学习了一下Makefile的编写 记录一下Makefile内代码是什么意思 代码如下 简单的hello ko的makefile ifneq KERNELRELEASE obj m hello o else
  • [CUDA] 快速入门CUDA(1)-基本了解和HelloWorld

    CUDA基础 文章目录 CUDA基础 1 CUDA简介 2 GPU和CPU架构的不同之处 3 查看GPU硬件信息 4 需要建立的基本概念 5 总结 1 CUDA简介 CUDA的全程是Computer Unified Device Archi
  • 树莓派4B(buster)的源更换为北外(清华)国内源

    树莓派4B buster 的源更换为北外 清华 国内源 1 登陆到树莓派 ssh pi your raspi IP 2 备份源文件 sudo cp etc apt sources list etc apt sources list bak
  • GoogLeNet论文详解

    GoogLeNet 1 Introduction 得益于深度学习的优势和更强大的卷积神经网络的出现 图像分类和目标检测的准确率发生了令人意想不到的进步 在2014年的ILSVRC比赛中 GoogLeNet取得了第一名的成绩 所用模型参数不足
  • 详解如何修改Linux文件权限

    参考 详解如何修改Linux文件权限 Linux文件权限详解 在Linux系统中 可以使用chmod命令来修改文件的权限 该命令用于更改文件或目录的读取 r 写入 w 和执行 x 权限 以下是一些详细的说明和示例 使用数字表示权限 r 读取
  • Golang教程:(十六)结构体

    原文 https golangbot com structs 欢迎来到Golang系列教程的第十六篇 什么是结构体 结构体 struct 是用户自定义的类型 它代表若干字段的集合 有些时候将多个数据看做一个整体要比单独使用这些数据更有意义
  • element el-table render-header自定义复选框

    项目中需要对列表数据进行批量处理 表头增加复选框 并关联列表数据 el table提供解决方法 实现多选非常简单 手动添加一个el table column 设type属性为selection即可 尝试后在我的项目中不适用 于是找到另一种r
  • Redis缓存与数据库双写一致性解决方案

    目录 1 冤孽的诞生 1 1 需求起因 1 2 策略之争 2 标准解决方案 2 1 延时双删策略 2 2 异步更新缓存 基于订阅binlog的同步机制 3 基于binlog订阅实现步骤 3 1 准备材料 3 2 代码实现 1 冤孽的诞生 1
  • python两个二维数组加法_python中利用numpy.array()实现俩个数值列表的对应相加方法...

    python中利用numpy array 实现俩个数值列表的对应相加方法 小编想把用python将列表 1 1 1 1 1 1 1 1 1 1 和 列表 2 2 2 2 2 2 2 2 2 2 对应相加成 3 3 3 3 3 3 3 3 3
  • [嵌入式linux]PCIe 热拔插(rescan)

    linux下可通过 sys bus pci devices 0000 bus number device number function number 目录下的节点进行热拔插操作 板子上电前PCIe插槽有一块NVME的固态硬盘 0 1985
  • SDIO接口协议(MMC SD WIFI GPS 以太网)

    一文搞懂SDIO 曼巴精神传承人的博客 CSDN博客 sdio SDIO协议 觅食小鱼的博客 CSDN博客 sdio协议 传统的SD存储卡只有一排引脚 包括一个3 3V电源VDD 用于默认速度
  • 使用ReactiveCocoa实现iOS平台响应式编程

    使用ReactiveCocoa实现iOS平台响应式编程 TIGER IOS 10 使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前 先要介绍一下FRP Fun
  • linux arm mmu基础

    ARM MMU页表框架 先上一张arm mmu的页表结构的通用框图 以下的论述都由该图来逐渐展开 以上是arm的页表框图的典型结构 即是二级页表结构 其中第一级页表 L1 是由虚拟地址的高12bit bits 31 20 组成 所以第一级页
  • 常用的IDEA插件

    IDEA是程序员用的最多的开发工具 很多程序员想把它打造成一站式开发工具 于是安装了各种各样的插件 通过插件在IDEA中完成各种操作 无需安装其他软件 确实很方便 今天给大家分享下我平时常用的IDEA插件 个个是精品 Key Promote
  • 今天我花一个通宵的时间安装Windows11系统居然失败,忍不住哭了!

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 我们就不要废话了 直接上主题吧 Windows11 系统安装 提示此电脑无法运行完美
  • ospfv2详解

    文章目录 OSPFV2 技术背景 OSPF基本信息 OSPF 如何完成收敛 SPF计算 DR与BDR DR与BDR的选举 泛洪机制 影响OSPF邻接关系连理原因 1 状态 2 报文 参数 3 物理故障 lsa优先cost及防止环路 ospf
  • 通过doi可以检索到文献_经验丨我如何获得英文文献

    前阵子有师妹问我如何找英文文献 那这周就来分享分享我的经验 希望能有所帮助 那我们开始吧 本期推送目标 查找并下载目标英文文献 其实这里包含两个部分 第一个是找到想要的英文文献 第二个才是下载 如果已知目标文献信息 仅仅想要下载可以直接在往
  • C++——浅拷贝、深拷贝、写时拷贝详解

    C 浅拷贝 深拷贝 写时拷贝详解 浅拷贝与深拷贝 解决浅拷贝的问题 引用计数 写时拷贝 浅拷贝与深拷贝 用String类模拟用 将 0 拷贝进去 调用系统默认的拷贝构造函数 结果就是内容相同 地址相同 说明这个方法是浅拷贝方法 浅拷贝方法带
  • Java代码判断当前操作系统是Windows或Linux或MacOS

    package com magic system public class SystemUtils 判断操作系统是否是 Windows return true 操作系统是 Windows false 其它操作系统 public static
  • 在Visual studio 2019中创建Qt+OpenCv项目

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