Win10_Qt6_C++_YOLO推理 -(1)MingW-opencv编译
先上效果图:
因为是一个为了尝试跑通的demo,美观、功能都先忽略哈。
一、环境
库 | 版本 | 下载链接 | 备注 |
cmake | cmake-4.1.0-rc2-windows-x86_64.msi | https://cmake.org/download/ | |
make | x86_64-15.1.0-release-posix-seh-ucrt-rt_v12-rev0.7z | https://github.com/niXman/mingw-builds-binaries/releases | 各种版本可以deepseek问一下区别 |
OpenCV | Source code(tar.gz)4.12.0 | https://github.com/opencv/opencv/releases/tag/4.12.0 | 一定要下载opencv源码自己用mingw编译不能直接用install的vc16 |
Qt | qt-online-installer-windows-x64-4.10.0 | https://www.qt.io/download-qt-installer-oss | 安装的时候勾选“个人用户” |
环境变量:
其他依赖比如numpy,我直接用的conda环境中的python
如果需要用到其他库,比如OpenBLAS、Eigen、CUDA、cuDNN、Glog、Gflags、HDF5、OGRE、Boost、IPPICV IW、Caffe、ITT等,你需要提前编译好这些库,如果你缺少这些库,你必须在之后的CMake中禁用相关的选项(有些会被自动禁用)。相关依赖库在编译请自行百度。
二、OpenCV编译
问:为什么要自己编译opencv?
答:Qt需要的是MingW编译的库,但是官方提供的是MSVC(vc16)编译的。
vc16对应的是Visual Studio 2019,vc17对应Visual Studio 2022
关于Visual Studio编译可以参考这个博客:
YOLOv8 Windows c++推理_yolov8 win cpp-CSDN博客
这里重点要讲的是opencv编译,在这卡了一周,其他的只需要捣鼓一会就能搞通。
1.打开CMake-gui.exe
没有桌面图标的话,在安装目录CMake\bin下。
然后开始自动配置了,等绿条读完
会出现各种红色警告,先不用管。
2.配置
这是我最新编译成功的配置,可以直接抄,勾选完点Configure即可
可以直接在搜索框输入关键词,然后进行勾选,必要的几个默认没勾选的需要自己勾一下:
WITH_OPENGL、WITH_QT、WITH_ONNX、BUILD_opencv_highgui
如果带cuda,则把cuda项都勾上,关于cuda、cudnn见此链接:
opencv加载cuda不成功 opencv与cuda版本的匹配_mob64ca1402d47a的技术博客_51CTO博客
后面都是WITH就不在展示了,我都是默认的
3.make
打开D:\opencv-4.12.0\mingwbuild目录,空白处shift+鼠标右键 - 在此处打开PowerShell
输入make -j 8,这样就开始编译了,8指使用的cpu线程数,越多编译越快。
过程中只要没停,啥看不懂的警告都不用管,如果停了:
(1)就回第2步,把报错相关的那个东西勾去掉,重新生成配置再编译。
(2)如果报错的在D:\opencv\modules有对应文件夹(每个点进去都有CMakeLists.txt),可以尝试先进这个文件夹,单独编译生成这个模块试试(这个方法我没试过,待验证)
我在这里卡了好几天,耐心点多试几次,由于报错各种各样,这里也没法总结,遇到了评论区沟通吧。(有关download的,可能是网络原因,还有出现比较多的是highgui,但是我没做任何处理重复了几次又好了)
4.然后在你Qt项目的CMakeLists.txt中指定opencv路径即可
三、Qt编译报错处理
这里先记录两个主要报错点
1.onnx模型转换问题
报错关键词:ERROR during processing node with 2 inputs and 1 outputs
解决办法:Opencv和opset版本要对应,我跑通的版本是:Opencv4.12.0对应opset=17
from ultralytics import YOLOmodel = YOLO(r'yolov8n.pt')
model.export(format="onnx", simplify=True, dynamic=False, opset=17)
OpenCV 版本 | 支持的最高 opset | 关键算子支持 | 动态形状支持 |
---|---|---|---|
4.5.x | opset 11-12 | 基础卷积/池化/激活层 ✅ 部分不支持: Cast 、ConstantOfShape 、ArgMax ❌ 45 | 仅静态输入(需固定尺寸)❌ 5 |
4.6-4.7 | opset 13-14 | 新增 LayerNormalization 、GELU ✅部分支持 Split 、Clip 6 | 有限动态批次维度 ✅ |
4.8 | opset 15 | 支持 QLinearSoftmax 、ConvTranspose ✅INT8 量化模型兼容 6 | 动态批次/高度/宽度 ✅ |
4.9+ | opset 16-18 | 完整支持 Attention 、Einsum 、InstanceNorm ✅Transformer 模型实验性支持 8 | 全动态输入 ✅ |
2.无法定位程序输入点,...于动态链接库xxx上
报错关键词:无法定位程序输入点,...于动态链接库xxx上
解决办法:在D:\mingw64\bin文件夹(mingw安装路径)下有库文件libstdc++-6.dll复制到C:\Windows\System32下即可。