用CMake和MINGW编译OPENCV4.5.4

前言

相信网络上有不少此类的文章,但尝试过的人,肯定在编译过程中遇到种种err,耗时耗力也不一定能成功编译过。本文通过64 位的 MinGW 在 Windows 下编译 OpenCV 生成 64位的 dll的流程,优化各项配置,顺利通过了编译。32位的方法类似。
4.5.5的版本里没有加入人脸识别算法的代码,因此需要把对应opencv_contrib_4.5.5的额外模块复制到源码文件夹内,一起编译。

这里先把我已经编译好可用的opencv-4.5.5文件分享给大家,包含contrib,但不支持OpenGL,因为编译时选择WITH_OpenGL报错,尚未解决。
https://download.csdn.net/download/weixin_42842157/75820505

OpenCV 的 MSVC 版及 MinGW 版

下载的 OpenCV 文件夹会有:

  • build (已编译好的MSVC库)
  • sources (源码)

MSVC 版
使用 MSVC 的话,直接在build/x64/vc16(vc后面的数字不同的版本会有变化,选择最新的即可)
里面就有了,配置好路径就可以使用。

MinGW 版
OpenCV 没有为我们编译好 MinGW 版,所以我们只能自己编译,下面就是介绍 MinGW 版的编译流程。

安装及配置 Qt、MinGW、CMake

安装
CMake 自行安装,或者使用Qt安装目录下的CMake(C:\Qt\Tools\CMake_64\bin)。Qt 和 MinGW 可以直接使用qt-opensource-windows-xxx的安装包安装,注意选择安装的组件(components)的时候勾选 MinGW。(该文以Qt 5.15.2、mingw810为例)

配置 Qt、MinGW
安装好后打开 QtCreator,在工具-选项-构建和运行-构建套件,选中Desktop Qt 5.15.2 MinGW 64bit,设为默认,OK。

添加到环境变量
将mingw的路径添加到环境变量 Path中,如 C:\Qt\Tools\mingw810_64\bin

使环境变量生效
打开命令提示符 CMD,运行 set PATH=C:,更改当前窗口任务的环境变量,关闭这个 CMD。
再次打开另一个 CMD,运行 echo %PATH%,显示最新的环境变量,会发现刚刚添加的 MinGW 环境变量已经生效。

使用 CMake 生成 OpenCV 的 Makefile

编译前的准备
修改opencv源代码文件夹中的CMakeLists.txt文件,添加如下代码:

if(MINGW)
  # Work around 'too many sections' error with MINGW/GCC
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj")
endif()

【不修改可能会出现以下问题】
编译 opencv/sources/modules/core/perf/opencl/perf_arithm.cpp 时候出错,错误原因是too many sections,file too big,原因是 build 过程中生成的.obj文件是COFF(Common Object File Format)格式,而COFF文件的header里有两位是表示number of sections的,不能超过32766,而这里汇编生成的obj的section超过了这个值,所以直接报错提示file too big

编译器配置
打开 cmake-gui,根据自己的实际路径设置源码和生成路径:

Where is the source code: D:/OpenCV_4.5.5/sources
Where to build the binaries: D:/OpenCV_4.5.5/opencv-build
点击 Configure,设置编译器

  • Specify the generator for this project: MinGW Makefiles
  • Specify native compilers
  • Next
  • Compilers C: C:\Qt\Tools\mingw810_64\bin\gcc.exe
  • Compilers C++: C:\Qt\Tools\mingw810_64\bin\g++.exe
  • Finish
    编译配置:

勾选 WITH_QT
不勾选 WITH_OPENGL
勾选 ENABLE_CXX11
不勾选ENABLE_PRECOMPILED_HEADERS
设置Qt5_DIR为C:\Qt\5.15.2\mingw81_64\lib\cmake\Qt5
设置 QT_QMAKE_EXECUTABLE 为 C:\Qt\5.15.2\mingw81_64\bin\qmake.exe
点击 Configure
再次配置:

不勾选 WITH_IPP
设置 CMAKE_BUILD_TYPE 为Release
设置 OPENCV_VS_VERSIONINFO_SKIP为bool型,并选中
设置 CMARK_INSTALL_PREFIX为D:/OpenCV/X64mingw455/install //默认c盘路径需要管理员权限,install时可能报错,建议修改至D盘路径
【以上配置项一般会自动生成,修改value即可;如果没有生成,可点击“Add Entry”新建】
点击 Configure,点击 Generate 生成 Makefile
在这里插入图片描述

编译 OpenCV

打开终端进行编译:(-j 是使用 8 个线程进行编译,请根据你的计算机配置合理设置线程数)

D:
cd D:\OpenCV\X64mingw455
mingw32-make -j 8

该过程时间比较长,和计算机性能有关系。其中“-j 8”指的是采用8线程同时编译,但在有些情况下会导致编译错误而终止,这种情况下建议进行单线程编译。

编译完成后显示100%,在终端中运行以下指令,完成安装。

mingw32-make install
一切正常完成后,我们所需要的include、bin和lib文件分别在以下路径,拷贝使用即可。
include: D:\OpenCV\X64mingw455\install\include
bin: D:\OpenCV\X64mingw455\install\x64\mingw\bin
lib: D:\OpenCV\X64mingw455\install\x64\mingw\lib

添加 OpenCV 编译的库到环境变量

为系统变量 Path 添加 D:\OpenCV\X64mingw455\install\x64\mingw\bin

新建 OpenCV 的 Qt 项目

如果cmake配置时CMAKE_BUILD_TYPE 选择了release,那么编译出来的就是 release 库,只能在Qt的 release 模式下使用。

在 .pro 文件里面添加:

win32 {
INCLUDEPATH += D:\OpenCV\X64mingw455\install\include
LIBS += D:\OpenCV\X64mingw455\install\x64\mingw\bin\libopencv_*.dll
}

如果我们还编译生成了 debug库,那么程序中便可通过以下方式,实现自动调用对应的库:

win32 {
	INCLUDEPATH += D:\OpenCV\X64mingw455\install\include
	CONFIG(debug, debug|release): {
		LIBS += D:\OpenCV\X64mingw455\install\x64\mingw\bin\libopencv_*d.dll
	} 
	else:CONFIG(release, debug|release): {
		LIBS += -LD:\OpenCV\X64mingw455\install\x64\mingw\bin \
    	-llibopencv_core455 \
    	-llibopencv_highgui455 \
    	-llibopencv_imgcodecs455 \
    	-llibopencv_imgproc455 \
    	-llibopencv_features2d455 \
    	-llibopencv_calib3d455
	}
}

然后在 MainWindow 中增加如下包含:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

大功告成,开始coding吧。

可能的错误解决方法

1.错误:modules\core\CMakeFiles\opencv_core.dir\build.make:1506: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj
将CMake中的 OPENCV_ENABLE_ALLOCATOR_STATS 不打勾。
2. 错误:bash [modules\videoio\CMakeFiles\opencv_videoio.dir\build.make:194: modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_dshow.cpp.obj] Error 1 [CMakeFiles\Makefile2:3112: modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2

将sources\cmake文件夹下的"OpenCVCompilerOptions.cmake"文件打开,注释掉如下语句即可。

add_extra_compiler_option(-Werror=non-virtual-dtor)

3.ippicv无法下载
离线下载所需的文件,如ippicv_2020_win_intel64_20191018_general.zip,修改OpenCV\sourcecode\opencv-4.5.4\3rdparty\ippicv文件夹中的ippicv.cmake,将其中的下载url链接修改为本地文件的路径url。注意:格式为"file:///D:/OpenCV/sourcecode/selfdownload/"

4.其他文件下载失败
可离线下载相应文件到所需的文件夹下,存储路径可查看D:\OpenCV\X64mingw455下的CMakeDownloadLog.txt文件。以下链接中我把我编译过程中报错后离线下载的文件打包共享一下。
https://download.csdn.net/download/weixin_42842157/69388183

5.“cannot find -lRunTmChk”

[ 19%] Linking CXX shared library ..\..\bin\libopencv_core454.dll
C:/Qt/Tools/mingw810_64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lRunTmChk
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1902: bin/libopencv_core455.dll] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:3750: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
mingw32-make: *** [Makefile:165: all] Error 2

不打勾 OPENCV_ENABLE_ALLOCATOR_STATS
不打勾 WITH_IPP

参考:

[1] https://blog.huihut.com/2017/12/03/CompiledOpenCVRunInQt/
[2] https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值