本人 Qt 已经使用了5年多, 这期间完全没有写过任何涉及图像处理相关领域的程序, 但前些天看到谷歌的一个去水印的算法, 一拍大腿, 打算装个 OpenCV 之后实现一下.

我现在同时使用着 MSVC17 和 MinGW 编译环境, 在 MSVC 下, 只需要打开工程后勾选 WITH_QT 构建选项, 构建步骤选择 install 即可正常编译. 而 MinGW 环境则需要多做一部分工作, 网上的教程大多不能编译通过, 故在此记录搭建过程, 方便大家参考.


下载

下载 OpenCV 源码包(待会要自己用 MinGW 编译), 若使用 msvc2014 可直接下载 Win pack.

opencv

根据自己系统的位数选择下载 CMake , 不推荐下载 Zip 包, 安装程序可以自动配置环境变量, 方便之后的操作.

cmake

安装

OpenCV 下载的是源代码包, 故不需要安装, 找个自己喜欢的地儿解压即可. 我解压到了 D:/Program/opencv-3.3.0/src/ 目录下.

CMake 的安装也不用特别说明, 为以后配置方便, 建议在安装时选择加入 PATH.

cmakeinstall

准备

因众所周知的原因, 在天朝某些网络资源是无法访问的, 而构建编译过程中可能会从某些被屏蔽的服务器下载依赖和包. 为了避免出现奇奇怪怪的错误, 构建编译过程需稳定连接至"国际互联网".

确保 MinGW 的路径已经添加至环境变量. 添加环境变量的方法不在赘述.

readypath

打开源码包, 编辑 ./opencv-3.3.0/src/modules/videoio/src/cap_dshow.cpp , 找到 #include "DShow.h" (第111行左右), 在其上方添加一行 #define NO_DSHOW_STRSAFE . 保存退出.

edit

配置

以管理员身份运行 CMake.

confignew

选择之前所解压的 OpenCV 的源码包和构建完成所输出的文件路径.

confignew2

点击 Configure, 弹出对话框, 选择 MinGW MakefilesSpecify native compilers , 点击 Next 下一步.

confignew3

选择 gcc.exeg++.exe 的路径, 一般这两个文件位于 Qt 安装目录下的 /Tools/mingw530_32/bin 内. 点击 Finish 完成配置.

confignew4

弹出错误, 不用担心, 点 OK 即可.

confignew5

选中 Advanced 复选框, 搜索 CMAKE_MAKE_PROGRAM 双击 Value 改为 mingw32-make.exe 的路径, 和 gcc.exe & g++.exe 一样, 默认在 Qt 安装目录下的 ./Tools/mingw530_32/bin 内.

confignew6

点击 Configure 看到 Configuring done 就应该是没问题了.

confugnew7

搜索 WITH_QT 选中复选框.

configwithQt

再搜索 ENABLE_PRECOMPILED_HEADERS 反选复选框.

configheaders

点击 Configure 后, 出现若干关于 Qt 的错误选项, 将 Value 修改为正确的路径(一般位于 Qt 安装目录下的 /5.9.1/mingw53_32/lib/cmake/ 内)

Qtdir

再次点击 Configure , 出现 Configuring done 后无红色条目, 就可以点击 Generate 生成了. 出现 Generating done 表示生成成功, 可以关掉 CMake 了.

generate

编译

打开生成文件的目录, 键入快捷键 Alt+D, 输入 cmd 回车, 输入 mingw32-make 回车, 进行编译.

make

大概等待 30 分钟, 编译完成, 键入 mingw32-make 进行安装.

makeinstall

很快安装完成.

使用

添加环境变量, 将编译好的库添加到环境变量. 路径一般是你编译构建目录下的 ./install/x86/mingw/bin 目录.

binpath

新建 Qt 工程, 在 Qt 的 .pro 工程文件最下面添加下面的内容. 注意要把我的路径改成你的:

INCLUDEPATH += D:\Program\opencv-3.3.0\bin\mingw\install\include

LIBS += D:\Program\opencv-3.3.0\bin\mingw\bin\libopencv_core330.dll
LIBS += D:\Program\opencv-3.3.0\bin\mingw\bin\libopencv_highgui330.dll
LIBS += D:\Program\opencv-3.3.0\bin\mingw\bin\libopencv_imgcodecs330.dll
LIBS += D:\Program\opencv-3.3.0\bin\mingw\bin\libopencv_imgproc330.dll
LIBS += D:\Program\opencv-3.3.0\bin\mingw\bin\libopencv_features2d330.dll
LIBS += D:\Program\opencv-3.3.0\bin\mingw\bin\libopencv_calib3d330.dll

在主程序中调用头文件:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

调用显示一张图片, 注意路径改成你自己的图片路径:

cv::Mat image = cv::imread("d://1.jpg", 1);
cv::namedWindow("My Image");
cv::imshow("My Image", image);

编译运行, 成功!

finish