CMake和Mingw编译OpenCV用于Qt开发

1 篇文章 0 订阅

环境配置

操作系统:Windows 10
CMake: 3.19.8
Opencv: 4.5.2
Qt: 5.12.11
Mingw: mingw730-64(Qt5.12自带)
Python2: Python2.7
Python3: Python3.6
软件安装的教程可以在网上查找,各工具安装完成之后,注意将mingw的路径, python相关变量设置到环境变量PATH中,我设置的相关环境变量如下:
在这里插入图片描述
在这里插入图片描述
PYTHON2_EXECUTABLE C:\Python27\python.exe
OPENCV_PYTHON3_VERSION 3.6

解压缩opencv的源码包,如果需要extra模块,也需下载解压opencv_contrib源码。
OpenCV源码下载地址:https://codeload.github.com/opencv/opencv/zip/4.5.2
OpenCV_contrib源码下载地址:https://codeload.github.com/opencv/opencv_contrib/zip/refs/tags/4.5.2

CMake配置及生成makefile

  1. 设置目录
    打开CMake,设置源码及编译目录;
    在这里插入图片描述
  2. 配置准备
    点击左下角的Configure按钮,初次配置编译opencv;
    在这里插入图片描述
    C及C++编译器,选择mingw730_64目录下对应的gcc/g++编译器:
    在这里插入图片描述
  3. 第一次配置设置
    初次调整配置,我们编译出的OpenCV库要给QT调用,对配置做一下调整
  • 勾选 WITH_QT
  • 勾选 WITH_OPENGL
  • 勾选 OPENCV_PYTHON3_VERSION
  • 不勾选 WITH_IPP
  • 配置 OPENCV_EXTRA_MODULES_PATH所在的目录
    在这里插入图片描述
  1. 第一次配置结果及第二次配置调整
    注意到,其中一条对Python27的 ImportError: No module named numpy.distuitils。感觉缺少依赖包有可能会对以后的编译产生比较大的影响,在python27下安装numpy;注意因为环境变量中设置了python36,所以对python27安装包,需要指定python27的pip才能安装到python27的包,不能直接使用pip install;
    在这里插入图片描述
    另外也出现了很多: CMake Warning at cmake/OpenCVDownload.cmake:xxx (message): xxx: Download failed: xxx;“SSL connect error” For details please refer to the download log file: xxxx/CMakeDownloadLog.txt 之类无法下载相应模块的错误。
    在这里插入图片描述
    其原因是网络连接问题,这里需要电脑能够连接到外网;当然也可以到网盘下载相应的文件放到cache文件夹下,但缺少的模块太多,一个一个下载太耗时,我就选择了简单的翻墙。
    初次配置了WITH_QT之后,此时需要再次配置QT相关的参数:
    在这里插入图片描述
    另外也有一些其它没有找到的项,例如BLAS,LAPACK,JNI,但查了一下,都是我不用的模块,就没有去修复这些;在调整完3之后,找比较给力的翻墙软件,抓紧进行第二次Configure。

  2. 第二次配置结果及第三次调整
    在这里插入图片描述
    出现CONFIGURATION IS NOT SUPPORTED的警告,查看相应的文件,发现是python路径可能有问题,但是看了一下,感觉python的相关路径都还算正常。而且这个问题只是个警告,setupvars并没有太大用。直接取消勾选OPENCV_GENERATE_SETUPVARS选项。再次配置。
    在这里插入图片描述

  3. 第三次配置及生成结果
    第三次配置输出均未显示异常,再Generate生成Makefile文件。
    在这里插入图片描述

  4. 编译输出
    进入之前设置的build目录,打开终端进行编译和安装。

mingw32-make -j 8
mingw32-make install

初次编译的时候,在highgui模块的window.cpp相关部分会报错:undefined reference to cvSetPropVsync_W32(char const*, bool) 和 undefined reference to cvGetPropVsync_W32(char const*, bool)。这个是OpenCV 4.5.2版本的一个BUG,已经在4.5.3版本中修复。如果不想更新到4.5.3,则可以手动修改如下:

// 修改cvSetWindowProperty函数的cv::WND_PROP_VYSNC分支
CV_IMPL void cvSetWindowProperty(const char* name, int prop_id, double prop_value)
{
	// ......
    case cv::WND_PROP_VSYNC:
       #if defined (HAVE_QT)
           // nothing
       #elif defined (HAVE_WIN32UI)
           cvSetPropVsync_W32(name, (prop_value != 0));
       #else
           // not implemented yet for other toolkits
       #endif
	// ......
}
// 修改cvGetWindowProperty函数的cv::WND_PROP_VYSNC分支
CV_IMPL double cvGetWindowProperty(const char* name, int prop_id)
{
	// ......
    case cv::WND_PROP_VSYNC:
       #if defined (HAVE_QT)
           return -1;
       #elif defined (HAVE_WIN32UI)
           return cvGetPropVsync_W32(name);
       #else
           return -1;
       #endif
   break;
	// ......
}

同样在OpenCV4.5.2中的wechat_qrcode模块中,也存在着一些问题,在编译过程中会出现“undefined reference to __imp_getACP Scanning dependencies of target opencv datasets” 的错误。可以通过修改wechat_qrcode的zxing.hpp文件的定义来解决,具体解决方案如下:

  • 第30行修改为:#if defined(ANDROID_API) || defined(_MSC_VER) || defined(MINGW32) || defined(MINGW64)
  • 删除第54~62行。
    该BUG也在4.5.3之后版本中修复了。
  1. 编译输出
    编译完成之后,可以在release/bin目录中看到输出的dll文件,以用于Qt程序的调用。
    在这里插入图片描述
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

年少时的棉花糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值