当前位置: 首页 > news >正文

Win10_Qt6_C++_YOLO推理 -(1)MingW-opencv编译

先上效果图:

因为是一个为了尝试跑通的demo,美观、功能都先忽略哈。

一、环境

版本下载链接备注
cmakecmake-4.1.0-rc2-windows-x86_64.msihttps://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问一下区别
OpenCVSource code(tar.gz)4.12.0https://github.com/opencv/opencv/releases/tag/4.12.0一定要下载opencv源码自己用mingw编译不能直接用install的vc16
Qtqt-online-installer-windows-x64-4.10.0https://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.xopset 11-12基础卷积/池化/激活层 ✅
部分不支持:CastConstantOfShapeArgMax ❌ 45
仅静态输入(需固定尺寸)❌ 5
4.6-4.7opset 13-14新增 LayerNormalizationGELU ✅
部分支持 SplitClip 6
有限动态批次维度 ✅
4.8opset 15支持 QLinearSoftmaxConvTranspose ✅
INT8 量化模型兼容 6
动态批次/高度/宽度 ✅
4.9+opset 16-18完整支持 AttentionEinsumInstanceNorm ✅
Transformer 模型实验性支持 8
全动态输入 ✅

2.无法定位程序输入点,...于动态链接库xxx上

报错关键词:无法定位程序输入点,...于动态链接库xxx上

解决办法:在D:\mingw64\bin文件夹(mingw安装路径)下有库文件libstdc++-6.dll复制到C:\Windows\System32下即可。

http://www.lryc.cn/news/597614.html

相关文章:

  • Linux dd命令 数据备份、转换与磁盘操作的终极工具
  • LinkedList的模拟实现+LinkedList和ArrayList的区别
  • 低代码中的统计模型是什么?有什么作用?
  • 海外短剧系统全栈开发指南:从视频编解码到全球CDN架构实战
  • 什么是5G-A三防平板?有什么特点?哪些领域能用到?
  • SpringBoot 内嵌 Tomcat 的相关配置
  • 上网行为管理之身份认证实验
  • 纯CPU场景下C++的分布式模型训练框架设计思路
  • 18.设备虚拟化
  • LeetCode 407:接雨水 II
  • SQL 中 CASE WHEN 及 SELECT CASE WHEN 的用法
  • SparkSQL 聚合函数 MAX 对 NULL 值的处理
  • 基于多种机器学习的水质污染及安全预测分析系统的设计与实现【随机森林、XGBoost、LightGBM、SMOTE、贝叶斯优化】
  • 小白做投资测算,如何快速上手?
  • 网安-SQL注入-sqli-labs
  • OpenLayers 快速入门(七)矢量数据
  • Centos7.9多网卡绑定做链路聚合
  • 回顾 Palantir:八年之旅的反思
  • 《P4092 [HEOI2016/TJOI2016] 树》
  • 线段树学习笔记 - 练习题(1)
  • UniApp X 网络请求避坑指南:从 JS 到 UTS 的 JSON 数据处理全解析
  • Neo4j 框架 初步简单使用(基础增删改查)
  • OpenEuler系统架构下编译redis的RPM包
  • 【基于OpenCV的图像处理】图像预处理之图像色彩空间转换以及图像灰度化处理
  • 【web页面接入Apple/google/facebook三方登录】
  • SQL基础⑥ | 聚合函数
  • Java项目中定时任务三方工具和技术的深度应用指南
  • Kubernetes 日志收集
  • biji 1
  • 事务与索引:数据库核心机制详解