ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qt配置OpenCV保姆级教程:从环境搭建到图像显示

Qt配置OpenCV保姆级教程:从环境搭建到图像显示 很多人把Qt和OpenCV配在一起是想快速做一个带界面的图像处理小工具。思路没问题但真正动手的时候光一个版本匹配问题就能劝退一半人。我见过不少朋友卡在“OpenCV下载好了、Qt也装完了但在.pro里一写路径就报错”这一步折腾一晚上也没跑通。这活儿真不难难点在于你没搞清楚编译器、库文件、运行环境这三者的关系。这篇保姆级教程我按自己多次实操验证过的流程从环境准备一直讲到能跑出第一个图像显示窗口争取让第一次接触Qt配置OpenCV的人也能一步步复现。1. 环境的整体设计与版本选型1.1 为什么Qt配置OpenCV总出问题很多人以为配置OpenCV就是把下载好的文件夹放到一个地方然后在Qt里写两行路径就行。但有这种想法的人大概率会在编译阶段被狠狠教育一顿。核心问题在于OpenCV是一堆编译好的二进制库文件而Qt Creator本身并不直接使用库它调用的是底层的编译器来链接这些库。如果你用的是MinGW编译器那OpenCV就必须是用MinGW编译出来的库如果你用的是MSVC编译器那OpenCV就得是MSVC版本的库。这两者的二进制格式不同接口约定也不同硬混在一起结果就是满屏的undefined reference。另外还有一个隐藏坑官方OpenCV下载页面里Windows版的预编译包只给了MSVC版本vc15、vc16没有MinGW版。所以很多用Qt自带MinGW套件的人直接下载官方openv包配置链接时报错非常正常。1.2 3套推荐的配置组合配置之前先想清楚用什么编译器这会直接决定后面的OpenCV怎么处理。组合编译器OpenCV获取方式适用场景Qt 5.14.2/5.15.2 MinGW 64-bitQt安装器自带MinGW 8.1.0用CMake自行编译OpenCV源码免费、开源、最适合新手Qt 5.15.2 MSVC 2019单独安装VS Build Tools或VS直接用官方OpenCV预编译包需要配合其他MSVC项目使用Qt 6.5 CMake自选编译器官方包或自编译均可新项目愿意折腾CMake我最推荐的是第一套组合Qt 5.14.2 MinGW 64位编译OpenCV 4.5.5或4.8.0。原因很直接这个版本资料最多遇到问题百度一下基本都能找到答案踩坑成本低。等流程走通了再换别的版本也不迟。2. 安装Qt并确保编译环境可用2.1 Qt安装时的组件选择如果你是第一次装Qt最容易犯的错就是嫌安装包太大只勾了Qt Creator这个IDE不勾编译器组件。结果打开Qt Creator一看构建套件那一栏全是红色感叹号根本没有可用的编译器项目一步都跑不起来。正确的做法是在安装器里先选好Qt版本比如5.14.2或5.15.2然后在右侧勾选组件时务必勾上MinGW 8.1.0 64-bit或对应的编译器工具链。这个组件会一起把编译器和调试器装好不需要额外单独下载。对于接下来要玩OpenCV的人我还建议顺手勾上Sources源码组件。虽然源码看起来占地方但后面CMake编译OpenCV时不需要用到Qt源码主要是调试时方便跟踪而且有些第三方库需要知道Qt的源码路径。空间够就勾上免得以后用时找不到。2.2 验证Qt Creator的构建套件安装完成后打开Qt Creator进入“工具”-“选项”-“Kits”检查一下列表里是否有一个名字类似“Desktop Qt 5.14.2 MinGW 64-bit”的套件并且状态栏没有黄色警告。如果有警告常见原因是编译器路径没识别到。点开套件在“编译器”一栏手动指定MinGW的g.exe路径。Qt安装目录下的MinGW编译器一般位于类似D:\Qt\Tools\mingw810_64\bin\g.exe的位置手动补上就可以了。这一步一定不要跳过。我见过太多人直接新建项目编译时报错“No suitable kits found”最后查了半天发现是编译器没配置好。环境基础不打牢后面全是连锁反应。2.3 用空项目确认编译链路通不通搭建正式环境之前先花两分钟验证一下Qt本身能不能正常编译。新建一个“Qt Widgets Application”项目默认生成的代码直接点左下角的绿色运行按钮。如果编译顺利弹出一个空白窗口说明Qt Creator、编译器、调试器这条链路是通的可以进入下一步。如果这一步都失败就别急着配OpenCV先把Qt的环境问题解决掉。这里最常见的问题是安装机器上多个版本Qt冲突或者路径有中文字符。Qt整个工具链对中文路径非常不友好安装目录和项目路径都尽量用纯英文能少很多麻烦。3. 获取与编译OpenCV3.1 官方预编译包和源码自编译怎么选OpenCV官网的Release页面提供了两个东西一个是源码压缩包一个是Windows预编译exe文件。预编译包解压后里面是一个opencv文件夹主要使用build目录下的内容。但你要注意看子目录名称x64/vc15对应Visual Studio 2017x64/vc16对应Visual Studio 2019这些都是MSVC工具链的产物。官方明确没有提供MinGW版本。所以判断很简单如果你用的是MSVC构建套件直接下载预编译包省时省力如果你用的是MinGW套件很多免费教程用这个就必须自己用CMake编译源码。3.2 MinGW版OpenCV的CMake编译步骤自己编译OpenCV听起来吓人实际上就是点几个按钮和敲两条命令的事。我整理一下完整的步骤。第一步安装CMake。到CMake官网下载Windows安装包安装时勾选“Add CMake to system PATH for all users”这样命令行里能直接用cmake命令。第二步把OpenCV源码解压到一个纯英文路径比如D:/opencv_src。然后新建一个空目录作为构建目录比如D:/opencv_build。第三步打开cmake-gui图形界面在“Where is the source code”那一栏填D:/opencv_src在“Where to build the binaries”那一栏填D:/opencv_build点击“Configure”。第四步是最关键的第一次Configure之后CMake会让你选生成器。这里必须选择“MinGW Makefiles”同时指定编译器路径为Qt工具链自带的gcc和g。位置通常在D:\Qt\Tools\mingw810_64\bin把gcc.exe和g.exe分别填进去。第五步等第一次配置完成后在搜索框里找到几个关键选项。BUILD_opencv_world建议勾上这样最终只会生成一个统一的库文件链接时非常省事。BUILD_TESTS和BUILD_PERF_TESTS建议取消不跑测试的话能省一个多小时的编译时间。BUILD_EXAMPLES也取消除非你想编译官方示例。第六步点击“Generate”生成Makefile。第七步在构建目录下打开命令行依次执行mingw32-make -j4这个命令会编译整个OpenCV耗时取决于你的CPU核心数和内存。8核以上的机器大概二十分钟到一个小时性能弱一点的机器可能要更久。编译完成后再执行mingw32-make install执行完D:/opencv_build/install目录就是最终成果里面有include头文件目录和x64/mingw/lib库文件目录。3.3 编译OpenCV时的几个关键选项配置OpenCV源码时有一些选项一眼看上去不知道是干什么的但会直接影响后续使用。BUILD_SHARED_LIBS控制生成动态库还是静态库。动态库dll下载和运行方便但部署时需要带着dll一起走静态库会把OpenCV代码直接编译进你的exe文件大但省心。新手建议用默认动态库方便灵活调整。WITH_OPENGL、WITH_QT这些是可选GUI相关选项如果你只要图像处理算法不搞实时可视化窗口保持默认即可。WITH_CUDA在没有独立显卡和CUDA环境的情况下务必保持关闭否则后续报错不断。还有一个小技巧如果编译到一半报错找不到某个依赖项不要死磕先去确认选项是否关闭。比如WITH_MSMF在部分MinGW环境下会有问题如果报错就取消它再重新Configure。4. 在Qt项目中正式配置OpenCV4.1 qmake的.pro配置写法新建一个Qt Widgets Application项目后打开项目里的.pro文件把OpenCV路径配置进去。这里以我自己编译安装到D:/opencv_build/install为例QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets TARGET OpenCVTest TEMPLATE app CONFIG c11 # OpenCV头文件路径 OPENCV_PATH D:/opencv_build/install INCLUDEPATH $${OPENCV_PATH}/include # OpenCV库文件路径 LIBS -L$${OPENCV_PATH}/x64/mingw/lib \ -lopencv_world455请注意libopencv_world455.dll.a这个名字里面455是OpenCV的版本号比如4.5.5对应4554.8.0对应480。如果你编译时勾选的是BUILD_opencv_world链接时只需要写-lopencv_world455。如果没有合并world库那么就要按模块逐个链接比如-lopencv_core455、-lopencv_imgproc455、-lopencv_highgui455麻烦好几倍。写.pro文件时路径分隔符统一用正斜杠反斜杠在qmake里容易被解析成转义字符这是新手很容易忽略的点。另外路径不要带空格和中文否则编译时会出现各种诡异问题。4.2 CMakeLists.txt配置方式如果你更喜欢CMake风格或者是Qt6项目配置方式稍有不同。新建项目时选择“C”-“C Application”然后自己写CMakeLists.txtcmake_minimum_required(VERSION 3.16) project(OpenCVTest) set(CMAKE_CXX_STANDARD 11) # 指定OpenCVConfig.cmake所在路径 set(OpenCV_DIR D:/opencv_build/install) find_package(OpenCV REQUIRED) add_executable(OpenCVTest main.cpp) target_link_libraries(OpenCVTest ${OpenCV_LIBS})find_package的工作机制是搜索指定路径下的OpenCVConfig.cmake文件读取里面记录的版本、头文件目录、库文件路径等信息。如果CMake报错找不到OpenCV先手动确认D:/opencv_build/install下是否存在OpenCVConfig.cmake或OpenCVConfig.cmake文件。顺便提醒一句如果API库配置没问题但编译报错可以检查一下target_link_libraries那一行确保放在add_executable之后这个顺序CMake管得很严。4.3 让程序运行时能找到OpenCV的dll很多人编译一切正常但一运行就弹出“缺少opencv_world455.dll”的错误框这是因为程序运行时需要去加载dll而系统找不到它。解决办法通常有三种手动复制dll到exe同目录把OpenCV的bin路径加到系统环境变量PATH在.pro里加一条构建后自动拷贝DLL的命令。我推荐第一种最直观也最省心。编译生成的exe一般在项目的构建目录下比如build-OpenCVTest-Desktop_Qt_5_14_2_MinGW_64bit-Debug子目录。把D:/opencv_build/install/x64/mingw/bin/opencv_world455.dll复制到exe旁边重新运行程序就不应该再报dll错误了。如果你要调试不光要复制dll还要保证Qt自带的Qt5Core.dll等也被Qt Creator自动定位到。这一点Qt Creator通常会自动处理但最终发布时还是建议用windeployqt工具统一收集所有所需的Qt运行库。5. 写一个图像显示程序验证配置5.1 用QLabel显示cv::Mat图像配置完成后光看编译通过还不算成功需要跑一个真正调用OpenCV功能并显示在Qt界面上的程序。下面这个例子演示了怎么把OpenCV读出来的图像转换成Qt能直接显示的QPixmap。#include QApplication #include QLabel #include QPixmap #include QImage #include opencv2/opencv.hpp int main(int argc, char *argv[]) { QApplication app(argc, argv); cv::Mat img cv::imread(D:/test.jpg); if (img.empty()) { return -1; } // OpenCV默认使用BGR顺序Qt显示需要RGB cv::Mat rgb; cv::cvtColor(img, rgb, cv::COLOR_BGR2RGB); QImage qimg(rgb.data, rgb.cols, rgb.rows, static_castint(rgb.step), QImage::Format_RGB888); QLabel label; label.setPixmap(QPixmap::fromImage(qimg)); label.resize(qimg.size()); label.show(); return app.exec(); }代码里有一个很容易踩的坑cv::imread的路径不能有中文否则OpenCV可能返回空图像代码会提前退出。如果确实需要读取中文路径可以把QString用toLocal8Bit转成std::string再传进去但效果有限最稳妥的方式还是项目文件全部用英文路径。另外QImage(qimg)只是引用了rgb这块内存并没有拷贝。如果rgb在显示之前被释放程序大概率会花屏或崩溃因此要保证Mat的对象在窗口完成显示之前一直存活。5.2 再跑一个图像处理函数确认真实可用已经能显示图像说明基础的图像读取和界面交互都没问题。最后再验证一下OpenCV的核心图像处理能力比如用Canny边缘检测看看图像轮廓。在刚才代码的基础上把图像传给Canny再显示出来cv::Mat gray, edges; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::Canny(gray, edges, 50, 150); // edges是单通道灰度图 cv::Mat dst; cv::cvtColor(edges, dst, cv::COLOR_GRAY2BGR); // 再把dst按前面方式转成QImage显示输出了边缘图基本可以证明OpenCV的core、imgproc、highgui模块已经全部链接成功。到这一步Qt配置OpenCV这件事就算真正落地了。6. 高频问题与排查技巧实录6.1 “unknown module(s) in Qt: serialport”怎么解决我把这个放第一个说是因为它太典型了很多人配完环境往.pro里加了QT serialport编译就报Project ERROR: Unknown module(s) in QT: serialport。这个报错和OpenCV其实没关系问题出在Qt安装时没有安装Serial Port模块。Qt的很多功能模块串口、蓝牙、图表、数据可视化不是默认全装的你在安装器里只勾了基础组件它就没有这些模块的头文件和库文件。解决方式不是改.pro而是重新运行Qt安装器在“库组件”里勾选对应模块等待安装完成后再回来编译。所以装Qt时不要只盯着一个Qt版本勾选模块列带领的这一排同样重要。常见需要勾的模块有Serial Port、Charts、Data Visualization、3D模块这些都可能在其他项目里用到。6.2 编译错误排查速查表执行配置并保存我这里把实操过程中最容易遇到的编译问题列成一张速查表方便你对症处理。报错信息原因分析解决方法找不到opencv2/opencv.hppINCLUDEPATH路径写错或没写检查.pro或CMake里的include路径是否正确指向OpenCV的include目录undefined reference to cv::...库文件没有链接上确认LIBS路径和-l参数是否和实际库文件名一致注意MinGW是.dll.a后缀cannot find -lopencv_world455库文件不存在或名称不对到lib目录看一眼真实文件名核对版本号error: cannot open output file ...: Permission denied之前运行的exe没退出进程占用关闭正在运行的程序重新构建Project ERROR: Unknown module(s)Qt组件缺失重新运行安装器勾选对应模块这些编译错误有一个共同点报错位置往往不是真正的根源而是“链接触发”的问题。我已养成一个习惯报错后首先看完整日志从第一行红色信息看起而不是只看最下面那条。前面十几行往往已经告诉你真正的路径问题。6.3 几个容易忽略的底层细节我在多次教学实践中发现很多问题不是配置本身错而是细节没到位。第一kit选择。用Qt Creator打开项目后左下角有个电脑图标点击后可以选择构建套件。有人配置了半天OpenCV没生效最后发现项目用的是另一个套件根本没用到自己配的MinGW。构建套件务必和OpenCV库版本严格对应MinGW套件配MSVC库必挂。第二Debug和Release库混用。MSVC版本的OpenCV在lib目录里有opencv_world455d.libDebug和opencv_world455.libRelease两套名称里带d的是调试版不带的是发布版。如果你链接的是release库却用Debug模式编译运行轻则编译错重则运行时崩溃。MinGW版一般没有强制区分但也要注意别把多版本混在同一系统里。第三程序能编译但运行就闪退。这通常不是代码逻辑问题而是启动时缺少dll或运行环境不对。运行闪退时先看Qt Creator底部“应用程序输出”面板如果有“The program has unexpectedly finished”并且后面跟着一串dll加载失败就是dll问题。第四路径设置问题。把OpenCV的bin目录加入系统PATH时一定要注销或重启系统才能生效仅仅重开Qt Creator是不够的。我遇到过不少人改了PATH后忘了重启一直以为自己写错了白折腾半天。写在后面的一点经验Qt配置OpenCV这件事说白了三步编译器匹配、库链接正确、运行环境完整。每一步都有对应的问题和报错别怕报错报错反而是线索最明确的时候。我最后再分享一个小习惯每次配完环境我会把OpenCV的安装目录、Qt版本、构建套件这三个信息写在一个文本文件里放到项目根目录。因为换电脑或者过两个月再来看这个项目环境早就记不清了有个备注能省下重新排查的一大堆时间。如果你按这篇文章走通了下一步可以试着在Qt里加入滑块控制Canny阈值、用OpenCV做人脸检测或者接上摄像头做实时图像采集这些方向都能把配置好的环境发挥出价值。环境这种事配一次通一次跑通之后你会发现Qt加OpenCV的组合做图像处理工具真的太顺手了。
返回列表