OpenCV+MinGW+Qt环境搭建:从源码编译到集成完整指南
发布时间:2026/9/1 3:02:30 作者:尧图编辑部 阅读量:1,286

简介这是面向Windows 10 64位环境下使用MinGW编译器开发OpenCVQt应用的预编译资源包解决开发者自行编译OpenCV 3.2.0并集成Qt 5.9.6时配置繁琐、容易出错的问题。资源包共245个文件包含145个hpp头文件、57个h头文件、17个dll动态库、16个a导入库、5个exe可执行文件以及cmake配置和说明文档压缩包大小仅10.61MB整体结构紧凑可直接引用到Qt项目中。已有239人学习下载。包内提供OpenCV 3.2.0完整开发所需的核心模块如core、imgproc、highgui、features2d等并已开启WITH_QT支持适合需要快速搭建OpenCVQt图形界面图像处理应用的中高级C开发者也适合希望避开源码编译流程、直接获取可用依赖库的Qt项目使用者。通过该资源包可在Qt Creator中直接链接库文件专注于图像处理与界面逻辑开发节省环境配置时间。 最近在 Windows 10 上做图像处理工具界面选了 Qt 5.9.6开发环境是 Qt 自带的 MinGW 工具链。结果打开 OpenCV 官网一看官方预编译包只给了 MSVC 版本下载下来链接测试直接报一堆 undefined reference。折腾了两天踩了不少坑终于把 OpenCV 3.2.0 用 MinGW 编译通过并且成功接入了 Qt 5.9.6qmake 工程里直接调 imread、imshow 和 Mat 转 QImage 都没问题。这篇就把我实际走通的完整流程记录下来包括版本选型、CMake 配置参数、编译命令、Qt 集成验证和问题排查给同样需要“OpenCV MinGW Qt 5.9.6 Win10”组合的兄弟一个可以直接抄作业的方案。需要说明的是这个流程针对的是 32 位构建也就是 Qt 5.9.6 mingw53_32 默认使用的位数日常图像算法开发和中小型工具完全够用。1. 为什么非要自己编译 OpenCV先弄清楚 MSVC 和 MinGW 那点事1.1 官方预编译包为什么不直接能用OpenCV 官网 Release 页面下载的 Windows 包绝大多数是基于 MSVC 编译器构建的版本上对应 Visual Studio 2015 或 2017。MSVC 和 MinGW 虽然是两套不同的 C 编译器但它们编译出来的二进制文件在二进制接口层面是不兼容的。C 接口可能勉强能用C 接口一链接就炸典型表现就是 undefined reference to cv::imread 这类错误。这背后的原因主要有三块第一MSVC 和 GCC/MinGW 的 C ABI应用二进制接口设计不一样类布局、异常处理、RTTI 命名规则都有差异第二两者依赖的运行库不同MSVC 依赖 msvcp140.dllMinGW 依赖 libstdc-6.dll 和 libgcc_s_seh-1.dll第三链接器的导入库格式也不同MSVC 用 .libMinGW 用 .dll.a。就算你用工具强行链接运行时多半也会在程序启动阶段崩溃或直接报缺 DLL。1.2 什么时候才需要自定义编译如果你的 Qt 是 MSVC 版本那直接用官方 OpenCV 包就行不需要看这篇文章。但如果你和我一样用的是 Qt 5.9.6 的 MinGW 分支安装时选中了 mingw53_32 这个组件那官方包就是废的必须要源码编译。另外还有几种情况也建议自定义编译需要把 contrib 模块编进去比如 SIFT、SURF 这些基础版没有的算法需要定制某些模块的开关需要结合特定硬件指令集做优化。至于热词里提到的“cuda opencv”那是另一个话题CUDA 版本的 OpenCV 通常必须用 MSVC 编译因为 NVIDIA 官方工具链根本不支持 MinGW想用 CUDA 加速就直接放弃 MinGW换 MSVC Qt 的组合吧。2. 环境准备与版本选型这一步错了后面全是坑2.1 工具链清单我实际使用的完整工具链如下组件版本备注操作系统Windows 10 21H2 x6432 位构建可以在 64 位系统上运行Qt5.9.6安装时必须勾选 MinGW 组件mingw53_32MinGW5.3.0Qt 5.9.6 安装包自带路径在 Qt 目录的 Tools/mingw530_32 下CMake3.12.4建议 3.10~3.15 之间太新容易出兼容问题OpenCV3.2.0OpenCV 3.x 系列中很稳的版本构建工具mingw32-makeQt 自带的 MinGW 工具链里就有使用 Qt 5.9.6 自带的 MinGW 5.3.0可以避免另一个经典坑MinGW 版本不匹配。Qt 库在编译时用了特定版本的 MinGW如果你换了一个完全不同的 MinGW比如 MinGW-w64 8.1在链接 Qt 库时可能会出现奇妙的不兼容问题。Qt 5.9.6 官方安装包里的 MinGW 虽然老但它是和 Qt 库配对好的一整套用最稳。CMake 版本也要注意OpenCV 3.2.0 是 2016 年底的版本对 CMake 的最低要求是 3.5但我在实测中发现 CMake 3.20 以上版本解析 OpenCV 3.2.0 的配置文件会出现一些弃用警告甚至个别变量识别异常所以选 3.12 左右最省心。CMake 可以直接从官网下 Windows installer安装时记得勾选“Add CMake to system PATH”。2.2 三个路径原则必须提前知道源码解压、安装目录、CMake 构建目录这三条路径建议全部用纯英文且不要有空格。原因很实际OpenCV 的构建脚本在解析路径时对空格处理并不完善尤其是某些 CMake 模块在拼接库路径时会把 “C:/Program Files” 拆开导致链接器找不到文件。我一开始把 OpenCV 源码解压到 D:/Program Files/opencv3.2结果 CMake 配置阶段直接报路径解析错误后来挪到 D:/libs/opencv-3.2.0 才正常。构建目录也不建议放在源码目录内部而是单独建一个 build 文件夹这样方便反复清理重来。源码目录保持干净之后如果换了 CMake 版本或改了配置选项直接删掉 build 重新生成就行不用重新解压源码。2.3 Qt 安装时的隐藏坑Qt 5.9.6 安装器默认可能只装 MSVC 版本如果你在安装界面只勾了 Qt 5.9.6 这个选项千万别以为自带 MinGW 工具链就在了。需要展开 Qt 5.9.6 的细节列表把 “MinGW 5.3.0 32-bit” 这一项勾上同时在 Tools 分类下把 “MinGW 5.3.0” 这个工具链也勾上。如果这两个都装了才算是完整的 Qt MinGW 环境否则后面 CMake 配置阶段就找不到编译器了。3. CMake 配置把 Qt 接入 OpenCV 构建的核心选项一次讲清3.1 首次配置命令假设我已经解压好 OpenCV 3.2.0 源码到 D:/libs/opencv-3.2.0并且创建了构建目录 D:/libs/opencv-build那么配置命令如下。注意这是 cmd 下的写法如果用的是 PowerShell换行符是反引号而不是 ^cd D:/libs/opencv-build cmake -G MinGW Makefiles -DCMAKE_BUILD_TYPERelease ^ -DCMAKE_PREFIX_PATHC:/Qt/Qt5.9.6/5.9.6/mingw53_32 ^ -DCMAKE_MAKE_PROGRAMC:/Qt/Qt5.9.6/Tools/mingw530_32/bin/mingw32-make.exe ^ -DWITH_QTON ^ -DWITH_MSMFOFF ^ -DWITH_IPPOFF ^ -DWITH_OPENGLON ^ -DBUILD_opencv_pythonOFF ^ -DBUILD_opencv_worldON ^ -DCMAKE_INSTALL_PREFIXD:/libs/opencv32这里最关键的三行是-G 指定生成 MinGW Makefiles 格式、CMAKE_PREFIX_PATH 指向 Qt 的 MinGW 构建目录、CMAKE_MAKE_PROGRAM 指名 mingw32-make 的详细路径。前两个决定了 CMake 能不能找到 Qt5第三个决定了后续 make 能否调用正确的编译器和构建器。3.2 核心选项的取舍逻辑配置阶段会打印大量的检查信息大多数人直接忽略但有几个关键选项值得重点理解选项值理由WITH_QTONOpenCV 的 highgui 模块支持 Qt 后端这样 cv::imshow 的窗口能在 Qt 程序里正常显示另外 Mat 转换 QImage 时也依赖 Qt 支持被启用CMAKE_PREFIX_PATHQt 安装目录告诉 CMake Qt5 在哪里否则会报找不到 Qt5Core 等模块WITH_MSMFOFFMedia Foundation 是 Windows 的采集模块OpenCV 3.2.0 里它和 MinGW 的链接器有严重冲突不关掉编译一定报错WITH_IPPOFFIntel IPP 只提供 MSVC 版二进制库MinGW 环境下必须关闭BUILD_opencv_worldON把 OpenCV 所有模块合并成一个 opencv_world320.dll部署时只需要拷贝一个 DLL省去管几十个模块 DLL 的麻烦BUILD_opencv_pythonOFF不搞 Python 绑定专心 C 接口关掉能节省大量编译时间还有不少选项是默认值不需要动。如果之后想减少体积可以再关掉 BUILD_EXAMPLES 和 BUILD_TESTS但我建议第一次编译时保留 examples 也没关系编译时间多十几分钟后面跑官方示例验证环境很方便。3.3 配置完成后一定要做的三件事第一滚到 CMake 输出窗口搜 Qt 相关的提示看到 “Qt5Core: found” 或者 “Found Qt5” 这样的行才能确认 Qt 检测成功。第二检查 BUILD_WORLD 是否真的是 ON有些版本会在配置中途自动把 world 关掉需要二次确认。第三看安装路径对不对CMAKE_INSTALL_PREFIX 这行输出是否指向你心仪的位置。如果这一步没做检查直接闷头编译编了半小时之后才发现在做一个不带 Qt 后端的版本那时候再去改配置重新编译浪费时间不说还特别打击耐心。4. 编译与安装实际的构建过程体验4.1 并行编译参数怎么选配置没有报错之后直接在 opencv-build 目录下执行mingw32-make -j8-j 后面跟的是并行任务数不是一个随便填的数字。我这里用 8是因为当时那台机器是 i7-6700四核八线程开 8 个任务刚好。如果机器是双核四线程建议用 -j4如果是新的 8 核 16 线程机器可以大胆开到 -j16。开小了编译慢开太大会导致内存耗尽尤其是同时编译十几个 C 文件时每个文件可能占几百 MB 内存。OpenCV 3.2.0 全量编译在我的机器上大概花了 40 分钟开了 world 和 examples。3.2.0 的代码量在 CV 系列里并不算大但如果机器配置一般建议把 BUILD_EXAMPLES 也关掉能省差不多 10 分钟。编译期间不要后台跑大型软件不然内存吃紧会拖慢整个构建。4.2 安装到自定义目录编译完成后执行mingw32-make install这一步本质是把头文件、库文件、DLL 文件按照规范目录结构拷贝到 CMAKE_INSTALL_PREFIX 指定的 D:/libs/opencv32。等我执行完D:/libs/opencv32 下面会有 include、lib、bin 三个子目录include/opencv2所有头文件写代码时用 #include opencv2/opencv.hpp 引用lib/libopencv_world320.dll.a导入库链接阶段需要Qt 项目的 LIBS 里引用的就是这个bin/opencv_world320.dll动态库运行阶段需要程序启动时系统会去 PATH 里找它4.3 验证生成产物完整性的一个小技巧检查安装是否完整最直观的方法是把 bin 目录里的 DLL 文件列表打开看一眼如果只有一个 opencv_world320.dll说明 world 选项生效了。如果没有 world会有 opencv_core320.dll、opencv_imgproc320.dll、opencv_highgui320.dll 等等十几个文件那样也行但后续项目里 LIBS 要写一长串部署时更容易漏拷。另外可以用这个命令验证 DLL 是否依赖 Qt 库objdump -p D:/libs/opencv32/bin/opencv_world320.dll | grep DLL Name如果输出里能看到 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll 这几项说明 OpenCV 的 Qt 支持确实被编进去了。这一步花半分钟等于给前面的配置工作做了个一次性的验收。5. Qt Creator 集成验证从写代码到跑起来5.1 新建工程并配置 .pro 文件在 Qt Creator 里新建一个 Qt Widgets Application然后在 .pro 文件里加入INCLUDEPATH D:/libs/opencv32/include LIBS -LD:/libs/opencv32/lib -lopencv_world320注意 LIBS 的写法-L 后面接库目录-l 后面接库名不需要写前缀 lib 和后缀 .dll.a。这一步经常有人写错写成 libopencv_world320.dll.a那链接器是找不到的。如果之后要启用更多模块只需要把 -lopencv_world320 替换成 -lopencv_core320 这种但用 world 模式的话一行就够省心。5.2 用 OpenCV 读图并在 Qt 界面显示一个最小可用的验证程序读取本机图片然后在 QLabel 中显示。这里关键的是 Mat 转 QImage 的格式转换#include QApplication #include QLabel #include QPixmap #include opencv2/opencv.hpp int main(int argc, char *argv[]) { QApplication app(argc, argv); cv::Mat src cv::imread(D:/test.jpg); if (src.empty()) { return -1; } cv::cvtColor(src, src, cv::COLOR_BGR2RGB); QImage img((const uchar*)src.data, src.cols, src.rows, src.step, QImage::Format_RGB888); QLabel label; label.setPixmap(QPixmap::fromImage(img)); label.resize(img.size()); label.show(); return app.exec(); }这里要特别提醒一个细节cvtColor 这一步不能漏。OpenCV 的 imread 默认读进来的是 BGR 三通道排列而 QImage 的 Format_RGB888 期望的是 RGB 排列直接转会导致图片里红蓝颜色对调。这也是图像处理工具箱里最容易犯的错误之一。另一个细节QImage 只是共享了 Mat 的像素缓冲区没有拷贝所以 Mat 对象的生命周期必须比 QImage 长。在这个例子里src 定义在 main 函数中生命周期覆盖整个程序运行没问题。但如果把 QImage 存到类成员里而 Mat 已经销毁了就会出现悬空指针图像显示花屏甚至程序崩溃。5.3 运行时的 DLL 部署两种方式编译完成后直接运行很可能会遇到两个经典错误找不到 opencv_world320.dll或者找不到 libgcc_s_seh-1.dll、libstdc-6.dll。解决办法有两种。第一种把 OpenCV 的 bin 目录和 Qt 的 bin 目录加入系统 PATH。在 Windows 设置里编辑环境变量把 D:/libs/opencv32/bin 和 C:/Qt/Qt5.9.6/5.9.6/mingw53_32/bin 都加进去重启 Qt Creator程序就能直接跑。需要注意 Qt Creator 在启动时会继承系统 PATH改了环境变量之后必须重启 Qt Creator 才生效。第二种把所有用到的 DLL 拷贝到 exe 所在目录。这种方式适合最终发布软件时使用依赖全部打包到 exe 旁边用户不需要额外配置环境变量。但要小心拷贝完整列表opencv_world320.dll、libgcc_s_seh-1.dll、libstdc-6.dll、libwinpthread-1.dll以及 Qt 相关的 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll。6. 问题排查与避坑速查表这一路折腾下来我整理了一份高频问题表按出现频率排的现象原因解决办法CMake 找不到 Qt5Core没设 CMAKE_PREFIX_PATH或路径指错了重新配置加入 -DCMAKE_PREFIX_PATHC:/Qt/Qt5.9.6/5.9.6/mingw53_32编译到某个文件报 MSMF 相关错误WITH_MSMF 没关关闭 WITH_MSMF删 build 目录重来链接时报 cannot find -lopencv_world320安装目录不对或库名写错检查 lib 目录下到底有没有 libopencv_world320.dll.a确认 LIBS 的 -l 参数运行时报缺 opencv_world320.dll可执行目录或 PATH 里没有 bin把 D:/libs/opencv32/bin 加入 PATH 或直接拷贝 DLL运行时提示 Qt platform plugin 错误缺少 platforms 目录或 qwindows.dll 不在在 exe 目录下创建 platforms 文件夹把 Qt 安装目录下的 plugins/platforms 拷贝过来图片颜色红蓝对调Mat 是 BGRQImage 需要 RGB转 Format_RGB888 之前先执行 cv::cvtColor 到 RGB6.1 一个排查思路永远先查 CMakeCache.txt如果配置阶段某个选项设了但没生效别急着重装删目录先去 build 目录下打开 CMakeCache.txt直接搜索你关心的变量名。比如搜 WITH_QT看是不是 ON搜 CMAKE_PREFIX_PATH看指向哪里。这个文件就是 CMake 配置生成的“配置文件系统里写死的答案”大部分配置问题都能在里面找到原因。6.2 老机器的编译提速技巧如果你的机器配置比较旧编译时间是一个很大的消耗。我实测了一个有效技巧把 BUILD_EXAMPLES 关掉把 BUILD_TESTS 关掉再把 BUILD_opencv_apps 关掉编译时间能缩短三分之一。这些模块对功能没影响只是减少了示例程序和测试程序的构建量。另外检查一下磁盘空间OpenCV 3.2.0 在编译过程中产生的对象文件加起来可能超过 3 GB预留足够空间别让磁盘写满导致编译中途失败。6.3 关于 OpenCV 3.2.0 的中文路径问题这个版本对中文路径的支持不够好imread 如果传入中文目录经常读不到图片返回空的 Mat。解决办法有两个一是把图片路径临时改成英文或拼音二是用文件读取加 imdecode 的方式先从 QFile 读字节流再用 cv::imdecode 解码成 Mat。对于 Qt 项目来说推荐第二种因为 QFileDialog 拿到的路径本身就可能是中文的用 imdecode 才能一劳永逸地解决。我最后再分享一个自己用着很顺的流程把整套 CMake 配置命令保存成一个 bat 脚本放到源码目录旁边以后升级 OpenCV 小版本或者换台新电脑直接改一改源码路径和版本号双击执行就能重新配置不用每次翻命令行历史。编译完成后把 D:/libs/opencv32 整个目录备份一份配合 Windows 的目录映射功能在别的机器上直接引用这个目录也能顺利开发省掉了重复编译的等待时间。这个组合虽然老但胜在稳定踩过坑之后你会觉得用它做图像处理基础研究真的踏实。 p a hrefhttps://download.csdn.net/download/othink1/11128383 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p