如何在Qt中使用OpenCV(MinGW)
文章目录
一、简介
最近,使用到了 OpenCV
,需要集成在 Qt
中。看了大多数文章都写得很不错,教大家怎么编译、集成、使用…
而作者本身由于懒得做这些繁琐的操作,同时又不想重新装一个 MSVC
编译环境,就想着能否使用 MinGW
编译运行 OpenCV
。这类文章偏少,因此经过我的摸索,有了这篇博客,希望能给各位读者带来启发。
实际上
MSVC
环境比MinGW
要好,不过这个看个人习惯吧。作者是由于懒得装,凑合用一下…
另外,本文适合于对 OpenCV
及 Qt
有一定基础了解的朋友,可能会涉及一些 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
的导入及使用。
-
在
.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
的文件夹,把include
和x64
文件夹复制到里面,然后采用如下所示的写法进行导入:INCLUDEPATH += $$PWD/opencv/include LIBS += -L$$PWD/opencv/x64/mingw/bin/ -llibopencv_core452
其实就是路径不一样罢了,这个看个人喜好。
这里需要注意的是,
libopencv_core452.dll
是OpenCv
最基础的模块,后续我们要使用别的功能可以继续添加。所有.dll
都在你解压后的OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\
中,好奇的朋友可以自行查看。我这里为了后续测试方便,直接一步到位,加入我所需要的
.dll
,如下所示: -
在
.h
文件中加入opencv.hpp
文件夹:直接写入:
#include "opencv2/opencv.hpp"
当然,如果你后面不想写
cv::
这样的,可以再加入:using namespace cv;
我这里就不加了。
-
在
.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); }
-
运行即可,显示效果如下所示:
后续解释为什么图片不是显示在
MainWindow
中。
至此,如果能够正常显示图片即证明配置成功。如无法正常显示,检查一下是否导入了 .dll
。
四、Qt 打包
在上一步的基础上,对软件进行打包(具体打包步骤我这里就不赘述了,可以自行百度)。打包完成后仍然需要将我们所使用到的 .dll
复制到 .exe
目录中,否则软件无法运行!!!
如上图所示,四个 .dll
和我们 .pro
文件中导入的相同。点击运行后效果与之前一致,这里就不再赘述了。
五、一些问题
5.1 如何知道哪个dll 是我需要的
其实,这也很简单。去官方文档查找你要使用的函数,例如我要用到 imread
这个函数,我可以去查文档,发现:
其需要 imgcodecs.hpp
文件,这个时候再去找对应的 .dll
即可,如下所示:
这个时候在 .pro
文件中进行添加即可。
5.2 如何在MainWindows中显示图片
在之前我们的测试中,使用 imshow
显示图片,这是调用 OpenCV
的 gui
进行显示,那么我们要如何在 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中显示照片的问题。
本文中的代码后续会逐步开源,欢迎关注,敬请期待!!!
欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。
-
个人优快云账号:刘梓谦_-优快云博客
-
GitHub:Jiahao-Liu29 (github.com)