N_QT

QT with OpenCV

OpenCV 官方发布 默认是使用MSVC编译的库, QT如果是使用mingw编译器是无法使用的. 要想使用,必须本地使用 mingw编译Opencv的源码

这里使用 cmake 用QT使用的mingw32位编译器, 本地编译OpenCV的源码

-cmake CMake是一个跨平台的安装(编译)工具, 可以用简单的语句来描述所有平台的安装(编译过程);

CMake 可以编译源代码, 制作程序库, 产生适配器(wrapper), 还可以用任意的顺序建构执行档; CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里), 因此可以很容易从同一个源代码目录树中建构出多个二进档; CMake 也支持静态与动态程式库的建构;

cmake 官页

-OpenCV

这个安装好后 ./build 官方编译好后供各种第三方使用的库. 有java,python… 当然还有c++基于MSVC编译的.. ./sources 是它的源码

OpenCV github 发布页 OpenCV官方发布页 OpenCV官方文档页

OpenCV4 源码编译记录

使用cmake 编译OpenCV 的过程记录, 麻烦的一批

运行cmake的 cmake-gui.exe

where is the source code 选择 opencv的源代码文件夹即./sources where to build the binaries 选择 编译后的输出二进制文件夹(随便建一个吧)

主界面 configure 按钮

  1. 先规定本地编译器

选择 specify native compilers 单选框 finsh

参考qt的编译器配置d:\Qt\Qt5.12.3\Tools\mingw730_32\bin\g++.exe 其中 c 文件名是gcc.exe, c++ 的文件名是 g++.exe, 还一个不管

  1. specify the generator for this project

选择 MinGW Makefiles

finsh

  1. 搜索 CMAKE_MAKE_PROGRAM

填入mingw32-make.exe 的地址,在mingw编译器的bin目录

  1. CMAKE_BUILD_TYPE

填入Release, 即生成发布版

  1. 最后Configure

报错: 缺少libwinpthread-1.dll, 搜了一下在mingw编译器的bin目录, 把编译器的路径加到环境变量D:\Qt\Qt5.12.3\Tools\mingw730_32\bin

5.1 再Configure

还报错: 什么opencv_ffmpeg.dll下载失败…

又**是gfw问题, 调全局. 再来

finally ok !

大概输出如下:

General configuration for OpenCV 4.1.0 =====================================
  Version control:              unknown
 
  Platform:
    Timestamp:                  2019-06-01T15:54:48Z
    Host:                       Windows 10.0.14393 AMD64
    CMake:                      3.14.5
    CMake generator:            MinGW Makefiles
    CMake build tool:           D:/Qt/Qt5.12.3/Tools/mingw730_32/bin/mingw32-make.exe
    Configuration:              Releas
 
  CPU/HW features:
    Baseline:                   SSE SSE2
      requested:                SSE2
    Dispatched code generation: SSE4_1 SSE4_2 FP16 AVX
      requested:                SSE4_1 SSE4_2 AVX FP16
      SSE4_1 (16 files):        + SSE3 SSSE3 SSE4_1
      SSE4_2 (2 files):         + SSE3 SSSE3 SSE4_1 POPCNT SSE4_2
      FP16 (1 files):           + SSE3 SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
      AVX (5 files):            + SSE3 SSSE3 SSE4_1 POPCNT SSE4_2 AVX
 
 .....
 
  OpenCV modules:
    To be built:                calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo stitching ts video videoio
    Disabled:                   world
    Disabled by dependency:     -
    Unavailable:                java js python2 python3
    Applications:               tests perf_tests apps
    Documentation:              NO
    Non-free algorithms:        NO
 
  Windows RT support:           NO
 
  GUI: 
    Win32 UI:                   YES
    VTK support:                NO
 
....
 
  Trace:                        YES (built-in)
 
  Other third-party libraries:
    Lapack:                     NO
    Eigen:                      NO
    Custom HAL:                 NO
    Protobuf:                   build (3.5.1)
 
  OpenCL:                       YES (NVD3D11)
    Include path:               D:/opencv410/sources/3rdparty/include/opencl/1.2
    Link libraries:             Dynamic load
 
  Python (for build):           NO
 
  Java:                         
    ant:                        NO
    JNI:                        C:/Program Files/Java/jdk1.8.0_161/include C:/Program Files/Java/jdk1.8.0_161/include/win32 C:/Program Files/Java/jdk1.8.0_161/include
    Java wrappers:              NO
    Java tests:                 NO
 
  Install to:                   D:/opencv410/ck_build/install
-----------------------------------------------------------------
 
Configuring done

预防一下

CMakeDownloadLog.txt 文件记录有下载

很显然下载后放.cache下对应的地方, 然后改其名字为MD值+’-‘+下载的文件名; 比如opencv_ffmpeg.dll这个文件下载后凡在.cache下的ffmpeg下, 然后改名为b8120c07962d591e2e9071a1bf566fd0-opencv_ffmpeg.dll替换原来0KB的那个文件; 参考

  1. 执行mingw32-make

cd 到刚刚输出目录,执行mingw32-make(在mingw编译器的bin目录,上面加到环境变量里面了)

报错: Makefile 文件没找到

最后原因还是上面opencv_ffmpeg.dll下载失败的问题, 手动下载替换之.

再执行mingw32-make

漫漫长夜…

最后

[100%] Building CXX object modules/CMakeFiles/ade.dir/__/3rdparty/ade/ade-0.1.1d/sources/ade/source/topological_sort.cpp.obj
[100%] Linking CXX static library ..\lib\libade.a
[100%] Built target ade

最最后 执行: mingw32-make istall

报错: mingw32-make:*** No rule to make target 'istall'. Stop.

再链接一遍执行mingw32-make

再再执行: mingw32-make istall

没有生成 dll? 回到Configuring, 勾选 WITH_OPENGL .. 再走一遍

漫漫长夜…

另使用mingw32-make -j 8 可以8线程编译

Scanning dependencies of target opencv_version
[100%] Building CXX object apps/version/CMakeFiles/opencv_version.dir/opencv_version.cpp.obj
[100%] Linking CXX executable ..\..\bin\opencv_version.exe
[100%`] Built target opencv_version

完成后再重复执行mingw32-make mingw32-make istall

啊~~, 编译后的库文件

D:\opencv410\ck_build\install\x86\mingw\lib 库文件夹下的库, 分为发布版本和调试版本(带d) 和D:\opencv410\ck_build\install\x86\mingw\bin 目录是运行库(DLL)

[使用mingw530_32编译openCV3.4.1源码, 搭建Qt5.9.3的openCV开发环境]https://blog.csdn.net/qq21497936/article/details/79641510 [OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行]https://blog.csdn.net/huihut/article/details/78701814 OpenCV使用CMake和MinGW-w64的编译安装

错误: error: 'D3D11_TEXTURE2D_DESC' was not declared in this scope

不勾选 WITH_OPENCL_D3D11_NV 即可

测试

类似ffmpeg.. 右键项目 Add Library External Library next

平台只选windows Library file 随便选择一个lib, 真** 只能单个添加 (后面的手动编辑.pro文件 添加) Include path 即头文件(D:/opencv410/ck_build/install/include)

最后再手动改,把其他库加进来

win32: LIBS += -LD:/opencv410/ck_build/install/x86/mingw/lib/ \
-llibopencv_core410.dll \
-llibopencv_calib3d410.dll \
-llibopencv_dnn410.dll \
-llibopencv_features2d410.dll \
-llibopencv_flann410.dll \
-llibopencv_gapi410.dll \
-llibopencv_highgui410.dll \
-llibopencv_imgcodecs410.dll \
-llibopencv_imgproc410.dll \
-llibopencv_ml410.dll \
-llibopencv_objdetect410.dll \
-llibopencv_photo410.dll \
-llibopencv_stitching410.dll \
-llibopencv_video410.dll \
-llibopencv_videoio410.dll \
 
INCLUDEPATH += D:/opencv410/ck_build/install/include
DEPENDPATH += D:/opencv410/ck_build/install/include

-测试代码

using namespace cv;
int main(int argc, char *argv[])
{
    Mat image;
    image = imread("f:/test/test.jpg");
    imshow("opencv_win", image);
    waitKey(0);
//    QCoreApplication a(argc, argv);
//    return a.exec();
    return 0;
}
 

运行报错, 因为没有运行库, 把D:\opencv410\ck_build\install\x86\mingw\bin目录的所有dll复制到qt编译输出目录 注意, 源码mingw编译的lib库, 和QT项目使用的mingw 版本要一至?

漫漫长征路…

图