先上效果圖:
因為是一個為了嘗試跑通的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下即可。