如何在Qt中使用OpenCV(MinGW)

如何在Qt中使用OpenCV(MinGW)


一、简介

最近,使用到了 OpenCV,需要集成在 Qt 中。看了大多数文章都写得很不错,教大家怎么编译、集成、使用…

而作者本身由于懒得做这些繁琐的操作,同时又不想重新装一个 MSVC 编译环境,就想着能否使用 MinGW 编译运行 OpenCV。这类文章偏少,因此经过我的摸索,有了这篇博客,希望能给各位读者带来启发。

实际上 MSVC 环境比 MinGW 要好,不过这个看个人习惯吧。作者是由于懒得装,凑合用一下…

另外,本文适合于对 OpenCVQt 有一定基础了解的朋友,可能会涉及一些 OpenCV 中的知识。

首先,我使用的环境如下所示:

  • Windows 10 x64
  • Qt 5.12.3

二、下载 OpenCV

由于这是一篇懒人专属教程,所以这里也不需要大家自行编译 OpenCV 了。我这里已经贴心地帮大家找好了下载链接:GitHub - huihut/OpenCV-MinGW-Build: MinGW 32bit and 64bit version of OpenCV compiled on Windows.

如上述链接点击无法跳转,可自行复制以下链接进行跳转:

  • https://github.com/huihut/OpenCV-MinGW-Build

这里万分感谢 GitHub 开源大佬,让我不用再自己进行痛苦的编译了…

链接进入后,README 中其实已经有部分下载链接,如下所示:

在这里插入图片描述

可以选择你喜欢的版本点击下载即可,也可以通过右侧的 Releases 页面进行下载。

在这里插入图片描述

如上图所示,我这里下载的是 OpenCV-4.5.2-x64 版本。下载完成后解压到你能找到的位置,我这里直接放在了 C 盘。解压之后文件夹中内容如下所示:

在这里插入图片描述

至此,我们已经完成了 OpenCV 的下载安装。完全无痛!好评!!!

不过,有利有弊,下载的只能使用 MinGW 64 进行编译。不过现在大多数电脑都是 64 位的,所以问题也不是很大,如果需要 32 位版本的,可能需要自己进行编译了…


三、在 Qt 中使用 OpenCV

首先,需要新建 Qt 工程,这里我新建了如下所示的工程:

在这里插入图片描述

编译方式为 MinGW 64

在这里插入图片描述

接下来将进行 OpenCV 的导入及使用。

  1. .pro 文件中导入 OpenCV

    在这里插入图片描述

    这里只能手动导入了,需要找到刚才下载解压好的 OpenCV 文件,把 include 文件夹的路径,以及 libopencv_core452.dll 的路径写入,如下所示:

    INCLUDEPATH += C:\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\include
    LIBS += -LC:\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\ -llibopencv_core452
    

    当然你也可以在你的工程目录下新建一个叫 opencv 的文件夹,把 includex64 文件夹复制到里面,然后采用如下所示的写法进行导入:

    INCLUDEPATH += $$PWD/opencv/include
    LIBS += -L$$PWD/opencv/x64/mingw/bin/ -llibopencv_core452
    

    其实就是路径不一样罢了,这个看个人喜好。

    这里需要注意的是,libopencv_core452.dllOpenCv 最基础的模块,后续我们要使用别的功能可以继续添加。所有 .dll 都在你解压后的 OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\ 中,好奇的朋友可以自行查看。

    我这里为了后续测试方便,直接一步到位,加入我所需要的 .dll,如下所示:

    在这里插入图片描述

  2. .h 文件中加入 opencv.hpp 文件夹:

    在这里插入图片描述

    直接写入:

    #include "opencv2/opencv.hpp"
    

    当然,如果你后面不想写 cv:: 这样的,可以再加入:

    using namespace cv;
    

    我这里就不加了。

  3. .cpp 中读取图片并显示:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // 图片路径,写入自己想显示的图片路径即可
        cv::Mat image = cv::imread("C:/Users/test/Desktop/down.jpeg");
    
        cv::imshow("test", image);
    }
    
  4. 运行即可,显示效果如下所示:

    在这里插入图片描述

    后续解释为什么图片不是显示在 MainWindow 中。

至此,如果能够正常显示图片即证明配置成功。如无法正常显示,检查一下是否导入了 .dll


四、Qt 打包

在上一步的基础上,对软件进行打包(具体打包步骤我这里就不赘述了,可以自行百度)。打包完成后仍然需要将我们所使用到的 .dll 复制到 .exe 目录中,否则软件无法运行!!!

在这里插入图片描述

如上图所示,四个 .dll 和我们 .pro 文件中导入的相同。点击运行后效果与之前一致,这里就不再赘述了。


五、一些问题

5.1 如何知道哪个dll 是我需要的

其实,这也很简单。去官方文档查找你要使用的函数,例如我要用到 imread 这个函数,我可以去查文档,发现:

在这里插入图片描述

其需要 imgcodecs.hpp 文件,这个时候再去找对应的 .dll 即可,如下所示:

在这里插入图片描述

这个时候在 .pro 文件中进行添加即可。

5.2 如何在MainWindows中显示图片

在之前我们的测试中,使用 imshow 显示图片,这是调用 OpenCVgui 进行显示,那么我们要如何在 Qt 中进行显示呢?

其实可以将图片转成 QPixmap 显示在 QLabel 中。这里我在 UI 中增加一个 Label 控件:

在这里插入图片描述

.cpp 中代码进行如下更改:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    cv::Mat image = cv::imread("C:/Users/liu.jiahao/Desktop/down.jpeg");

    cv::Mat out;
    cv::cvtColor(image, out, cv::COLOR_BGR2RGB);

    QImage img(out.data, out.cols, out.rows, out.cols*out.channels(), QImage::Format_RGB888);

    ui->label->setPixmap(QPixmap::fromImage(img.scaled(ui->label->size(), Qt::KeepAspectRatio)));

}

运行之后显示如下所示:

在这里插入图片描述

图片已经被正确显示在 QLabel 中。值得注意的是 cv::cvtColor 函数是必要的,OpenCV 读取图片是按照 B->G->R 的颜色格式进行读取的,直接显示会导致颜色异常,因此要转成 R->G->B 格式。


六、写在最后

本文介绍了 如何让Qt在MinGW环境下使用OpenCV,并提供了打包方法。以及解决了在Qt的UI中显示照片的问题

本文中的代码后续会逐步开源,欢迎关注,敬请期待!!!

欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值