CMake和minGW-64 编译安装 OpenCV3.4.11以供 Qt 使用
minGW 64 bit 编译 OpenCV 3.4.11 ,记录了详细的下载、编译、安装以及问题解决的步骤与思路。
编译环境:
首先说明我的操作系统版本与本文中编译的OpenCV版本等:
Windows10 64bit
OpenCV 3.4.11
OpenCV Contrib 3.4.11 (可选,用到FREAK、Surf和Sift算法需要编译)
QT5.14.0 with MinGW5.14.1 64bit
CMake 3.17.0
编译前的准备–下载
下载OpenCV
在 Github 中下载 OpenCV ,选择 3.4.11版本。
若使用 MSVC 版的,可直接下载 上图那个 vc14_vc15 .exe 那个,安装好后为openCV配置环境变量直接就能用了。而 OpenCV 没有编译好的 MinGW 版, 所以需要下载源码进行编译。
- MSVC,需要使用Visual C++(微软的VC编译器)作为编译器
- MinGW是指Minimalist GNU For Windows,是将GNU开发工具移植到Win32平台下的产物,是一套Windows上的GNU开发工具移植到Win32平台下的产物,是一套Windows上的GNU工具集,用其开发的程序不需要额外的第三方DLL支持就可以在Windows下运行。
OpenCV官网/GitHub下载的一般是支持的vc,所以对于MinGW版本的Qt需要自己下载源码重新编译
下载 OpenCV Contrib
在 Github 中下载 OpenCV Contrib 3.4.11 。
下载 CMake
下载 CMake 用于编译源码。
互联网上大多数开源框架和库,或者至少是那些想要保持IDE中性的开源框架和库(这意味着,使用任意一个集成开发环境配置并建立不依赖特定的集成开发环境就能够工作的一个项目),都使用CMake或类似的make系统。我猜想这也回答了某些问题,例如,我为什么需要CMake?为什么不能只给出库以及用它来做什么呢?或者其他类似的问题。这里,我们需要CMake以便能够使用源代码来配置和构建OpenCV。CMake是一个开源并跨平台的应用程序,可用于配置和构建开源项目(或者应用程序、库等等)。
下载后好记得安装,安装CMake时除了应该确保安装GUI版本之外,还可以选择添加到环境变量里。
安装 Qt
安装好 Qt ,关于 Qt 的下载 以及 详细的安装步骤 可以看我的这篇博文 Visual Studio 2019配置qt开发环境 。选择编译组件的时候选择了 mingw_32 、mingw_64 以及 msvc2017_64 ,你也可以按需选择,本文只需用到 mingw 64 。
MinGW 就不需要单独下载了,安装 Qt 的时候勾选上就好了。要手动下载的话可以在 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 下载最新版。
编译前的准备–解压
将下载好的 OpenCV 3.4.11 解压,解压到英文、无中文、无特殊字符、无空格的路径下,避免不必要的麻烦。
opencv_contrib-3.4.11 是可选的。
在学习图像识别中的特征点检测和匹配时,需要用到一些常用的算法如FREAK、Surf和Sift算法等,但从OpenCV3以后,这些常用的算法OpenCV的Release版本中并不存在,因为他们是存放在opencv_contrib目录下面的未稳定功能模块,所以如果我们想要使用这些功能,需要自己下载代码并且自行编译。
解压 opencv_contrib-3.4.11 ,我的如下图所示。
为 MinGW-w64 配置环境变量,在 Qt 的安装目录下找到 MinGW-w64 的路径。我的路径为 D:\20200213\ForDevelopment\Qt\Qt5.14.1\Tools\mingw730_64\bin
。
打开“环境变量”设置界面方法一,在“我的电脑”上右击鼠标,在弹出菜单中选择“属性”。
在“系统”界面选择“高级系统设置”,接着点击环境变量。
子系统变量 Path 中增加一个条目即可。
然后记得点三次确认。
CMake 构建
CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。
打开 CMake ,设置源代码路径 “Where is the source code folder”,编译目标文件的路径 “Where to build the binaries folder” 。在下图 ① 中选择源码路径,在 ② 中选择 编译结果路径,推荐在源码路径后加/build
,到时候会自动生成该目录。接着点击 ③ 左下角的【Configure】。
单击“Configure”按钮将启动配置过程。如果文件夹还不存在的话,可能会要求创建构建文件夹,需要通过单击“Yes”按钮来完成文件夹的创建。选择 YES 🏃🏻♂️
按下图所示选择编译器。
配置C和C++编译器路径,具体路径请根据自己电脑中QT的安装目录而定。注意选择 64 位的哦,我的目录下文件名为 mingw730_64 的为64位。
我的 gcc 的路径在
D:\20200213\ForDevelopment\Qt\Qt5.14.1\Tools\mingw730_64\bin\gcc.exe
g++ 路径在
D:\20200213\ForDevelopment\Qt\Qt5.14.1\Tools\mingw730_64\bin\c++.exe
点击 Finish ,等待一会。红红的报错是常有的事,记得善用搜索引擎查找解决方案。
勾选上 Grouped
会分组显示配置信息。接着打开 OPENCV 组。
找到 OPENCV_EXTRA_MODULES_PATH
项,填入opencv_contrib
目录下的modules
文件夹路径,我的为: E:/20200325/DevelopmentEnvironment/opencv_contrib-3.4.11/modules
,如下图所示。记得使用 /
而不是 \
不然报错,见后文常见错误。
展开 WITH 组。
勾选中“WITH_OPENGL”、“WITH_QT”,将“WITH_IPP”取消。并勾选 ENABLE_CXX11
然后再次点【Configure】
然后点击 左下角的【Configure】
然后继续修改Qt路径,要是你的没有安装过 Annoconda 一般不用改,我的安装过。
下面这里一定看清楚,红色部分的value值和你的安装位置对不对应。我笔记本里面有 Annoconda 里面也有cmake,所以我的默认是Annoconda 的位置,要手动改到 Qt 所在的位置。
然后点击 左下角的【Configure】,记得保持网络畅通。若还有红色,再一次configure,直到没有红色。
【Configure】一切顺利之后,执行 【Generate】。
很大可能性你会遇到编译错误,可参见后文的常见错误,若无法找到请 Google 错误日志,一般能找到解决方法。
在这个过程中,如果网络环境不好,很可能卡在opencv_ffmpeg.dll
和opencv_ffmpeg_64.dll
的下载中,建议更换好一点的网络环境,或者多等一会。
生成成功后需要去终端用命令行进行编译。
编译 OpenCV
打开终端,并且路径切换到上一步生成的路径,我的是:
E:\20200325\DevelopmentEnvironment\opencv3411\build
这里推荐的终端是 cmder ,很强大也很好用。当然也可以使用 cmd
或者 Powershell
等。下面的命令行中先切换到路径下,然后使用 mingw32-make -j 8
进行编译 ,其中 -j 8
表示8个多线程,以加速编译,可根据硬件条件适当增减。当然可以使用默认的 mingw32-make
进行编译。
1 | E: |
如果 mingw32-make -j 8
遇到错误,请看下文的 编译 OpenCV 常见错误,否则执行 mingw32-make install
,完成安装。
遇到更多的错误不要慌张,见本文的后半部分看看有没有相似的错误或日志。假若你没有遇到 5个 以上的错误,那么我觉得你肯定是一个很幸运的人 🍦
我所有的配置,贴出来:
mingw32-make 成功的界面 。 干杯 🍻
mingw32-make install 成功的界面 🍰
生成成功后看一下 build/bin
下面的动态库 ,熟悉的味道,各种 OpenCV 的动态库。
看一下 build/lib
目录
dll.a 其实是MinGW下的DLL文件的imp-lib (Import Library)。
.dll.a文件的最初用意其实是MinGW下的DLL文件的imp-lib (Import Library),即与VC下DLL文件附带了一个引入库.lib类似。在VC下编程,当要使用DLL文件时,在开发时必须要有.lib文件才能链接通过。.dll.a文件就是这样的作用。
但是,MinGW/Cygwin确提供了直接与.dll文件链接的作用,就是可以不需要imp-lib库文件,只要DLL文件存在,也可以链接成功。这样就导致.dll.a文件似乎不是那么有用了。在很多场合下,可以不需要.dll.a文件了。但是有几个例外情况,来自于RedHat的官方描述。(Reference)
原文链接:https://blog.csdn.net/tangketan/article/details/6997699
编译 OpenCV 常见错误
不明确的多线程错误
如果使用了多线程编译,导致错误,但是错误信息不明确,如:
1 | [ 82%] Built target opencv_ximgproc |
解决方法是使用单线程编译:
1 | mingw32-make |
以查看详细的错误提示,再根据具体情况解决。
vs_version.rc.obj 处错误 gcc: error: long: No such file or directory
错误日志:
1 | [ 29%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/merge.avx2.cpp.obj |
根据错误日志,可发现在 [modules\core\CMakeFiles\opencv_core.dir\build.make:1508:
处出现错误。
打开
E:\20200325\DevelopmentEnvironment\opencv3411\build\modules\core\CMakeFiles\opencv_core.dir\build.make
的第1508行发现一个很长的命令行
1 | cd /E E:\20200325\DevelopmentEnvironment\opencv3411\build\modules\core && D:\20200213\ForDevelopment\Qt\Qt5.14.1\Tools\mingw730_32\bin\windres.exe -O coff $(RC_DEFINES) $(RC_INCLUDES) $(RC_FLAGS) E:\20200325\DevelopmentEnvironment\opencv3411\build\modules\core\vs_version.rc CMakeFiles\opencv_core.dir\vs_version.rc.obj |
可猜测错误原因是未成功生成vs_version.rc.obj。
根据build.make中的错误行,需要修改编译命令,手动生成vs_version.rc.obj,并重新mingw32-make,解决方法是手动生成一下。
进入到 D:\Dev\OpenCV3411\opencv\sources\build\modules\core
路径下,然后在终端运行下面的一句命令行。
1 | D:\20200213\ForDevelopment\Qt\Qt5.14.1\Tools\mingw730_32\bin\windres.exe -O coff E:\20200325\DevelopmentEnvironment\opencv3411\build\modules\core\vs_version.rc CMakeFiles\opencv_core.dir\vs_version.rc.obj |
注意上面那句命令行省略了中间的$(RC_DEFINES) $(RC_INCLUDES) $(RC_FLAGS)
。要是没省略是执行不了的。
然后重新点击【Configure】和 【Generate】。
重新输入 mingw32-make
去编译,编译通过后 mingw32-make install
安装。
提示:一定要查看自己的 build.make
每个人的路径都是不一样的
出现上面这个原因还有可能是 windres.exe 的位数不同,看这个 👇🏻
mingw730_32\bin\windres.exe: preprocessing failed.
日志:
1 | [ 34%] Building RC object modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj |
报错中怎么会是 mingw730_32/bin/windres.exe 呢? 应该是64位的啊 ,因为我要编译64位的,那么就更改一下:
更改为 64 位的路径:
1 | D:/20200213/ForDevelopment/Qt/Qt5.14.1/Tools/mingw730_64/bin/windres.exe |
mingw32-make.exe
的路径也是32位,同样更改为64位。
重新【Configure】和 【Generate】。
重新输入 mingw32-make
去编译,编译通过后 mingw32-make install
安装。
Invalid escape sequence \2
1 | CMake Error at cmake/OpenCVModule.cmake:369 (_glob_locations): |
该错误的原因是使用的路径有有 \
,解决方法是使用/
或者\\
。请参见 stackoverflow 。
然后重新点击【Configure】。
fatal error: boostdesc_bgm.i: No such file or directory #include “boostdesc_bgm.i”
报错日志:
1 | [ 85%] Building CXX object modules/videostab/CMakeFiles/opencv_test_videostab.dir/test/test_main.cpp.obj |
原因是某些文件没有从github下载下来,解决方法就是手动下载放到对应的路径中。可以查看 build 文件夹下的日志文件 CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索 boostdesc_bgm.i 关键词 ,可以发现错误的原因是
发现文件下载失败了。
解决方法可以 在 github issue 中看到 fatal error: boostdesc_bgm.i: No such file or directory #1301
下载缺失的文件 放在 opencv_contrib/modules/xfeatures2d/src/ 路径下即可。
总共缺了以下几个文件,都需要拷贝:
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
各个文件的下载路径为:
opencv/opencv_3rdparty@34e4206
/boostdesc_lbgm.i (raw)
opencv/opencv_3rdparty@34e4206
/boostdesc_binboost_256.i (raw)
opencv/opencv_3rdparty@34e4206
/boostdesc_binboost_128.i (raw)
opencv/opencv_3rdparty@34e4206
/boostdesc_binboost_064.i (raw)
opencv/opencv_3rdparty@34e4206
/boostdesc_bgm_hd.i (raw) opencv/opencv_3rdparty@34e4206
/boostdesc_bgm_bi.i (raw) opencv/opencv_3rdparty@34e4206
/boostdesc_bgm.i (raw) opencv/opencv_3rdparty@fccf7cd
/vgg_generated_120.i (raw)
opencv/opencv_3rdparty@fccf7cd
/vgg_generated_64.i (raw) opencv/opencv_3rdparty@fccf7cd
/vgg_generated_48.i (raw)
opencv/opencv_3rdparty@fccf7cd
/vgg_generated_80.i (raw)
也可以在终端中一键下载 ,记得先进入对应的路径,然后输入 curl 后面那些命令行。😁
1 | cd E:/20200325/DevelopmentEnvironment/opencv3411/.cache/xfeatures2d |
下载好后在 CMake 中重新生成,然后继续编译。记得重新生成。
in the end, your opencv/.cache should look like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 .cache
│
└───xfeatures2d
├───boostdesc
│ 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
│ 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
│ 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
│ 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
│ 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
│ 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
│ e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
│
└───vgg
151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
https://github.com/opencv/opencv_contrib/issues/1301
其实下载失败一般是你的网络原因或者 hosts 的原因 ,我的就很正常,哈哈。自动下载。可以 更改hosts加速访问Github 试试看,不然可能很多 github release 的文件你应该也下载不了。
CMake Warning at cmake/OpenCVDownload.cmake:202 (message): FFMPEG: Download failed: 28;”Timeout was reached”
错误日志
1 | CMake Warning at cmake/OpenCVDownload.cmake:202 (message): |
或者
1 | FFMPEG: Download: opencv_videoio_ffmpeg_64.dll Try 1 failed CMake |
以上错误 的原因均是 opencv_videoio_ffmpeg.dll
和 opencv_videoio_ffmpeg_64.dll
下载失败导致。
查看 E:\20200325\DevelopmentEnvironment\opencv3411\.cache\ffmpeg
路径下的缓存,文件并未下载完成
建议换个网络环境(比如 科学上网),重新生成一下看看能不能下载成功。若还是不能的话只能手动下载了。
只需要下载对应的对应的 opencv_ffmpeg.dll 和 opencv_ffmpeg_64.dll即可,文件名前面的16进制前缀,为对应文件的md5值。
手动下载的方法 请看这几个链接:
https://github.com/opencv/opencv/issues/5546
https://stackoverflow.com/questions/32932915/opencv-3-0-0-configure-fails-ffmpeg-not-downloaded
https://github.com/opencv/opencv_3rdparty/tree/ffmpeg/master_20150703/ffmpeg
在 https://stackoverflow.com/questions/32932915/opencv-3-0-0-configure-fails-ffmpeg-not-downloaded 下载下图 中的两个文件
下载对应的 opencv_ffmpeg.dll 和 opencv_ffmpeg_64.dll即可,然后需要查看为对应文件的md5值。
windows下查看文件md5
1 certutil -hashfile 文件路径 MD5
我的 opencv_ffmpeg.dll 是 f081abd9d6ca7e425d340ce586f9c090
opencv_ffmpeg_64.dll 是 35fe6ccdda6d7a04e9056b0d73b98e76
拷贝下载好的文件放到
E:\20200325\DevelopmentEnvironment\opencv3411\.cache\ffmpeg
然后重命名为
1 | f081abd9d6ca7e425d340ce586f9c090-opencv_ffmpeg.dll |
不然编译的时候不一致又会重新下载了。
仅仅把下载的文件放在缓冲区中是不够的,因为自己下载的MD5有可能和源码中指定的MD5不一致,从而导致编译后,依旧无法下载指定是的文件,同样无法编译!所以修改源码中指定的MD5。
打开文件 opencv\sources\3rdparty\ffmpeg\ffmpeg.cmake
把如下两项对应的值,修改成以上文件的MD5,分别对应32位和64位的dll
ocv_update(FFMPEG_FILE_HASH_BIN32 “f081abd9d6ca7e425d340ce586f9c090”) | |
---|---|
ocv_update(FFMPEG_FILE_HASH_BIN64 “35fe6ccdda6d7a04e9056b0d73b98e76”) |
然后重新编译。
data: Download: face_landmark_model.dat
要是在生成中停留在下面这个界面比较久,是因为国内下载慢的原因。
所以可手动下载好,然后放到指定目录下。首先这个文件下载地址为 https://github.com/opencv/opencv_3rdparty/blob/contrib_face_alignment_20170818/face_landmark_model.dat,
手动下载好之后,找到
E:\20200325\DevelopmentEnvironment\opencv_contrib-3.4.11\modules\face\CMakeLists.txt
打开。 找到其中以https://raw”
开头的一串网址,如下图所示:
将其替换成本地文件路径,如下:
参考文献
How to setup Qt and openCV on Windows
Install OpenCV 4 on your Raspberry Pi4
fatal error: boostdesc_bgm.i: No such file or directory #1301
Windows 10 CMake | OPENCV_EXTRA_MODULES_PATH | Bug #11655
OpenCV 3.0.0 “configure” fails - ffmpeg download error #5546
OpenCV 3.0.0 “configure” fails, ffmpeg not downloaded
https://github.com/opencv/opencv_3rdparty/tree/ffmpeg/master_20150703/ffmpeg
https://github.com/opencv/opencv_3rdparty/tree/contrib_face_alignment_20170818
Windows 10使用Qt配置OpenCV时出现的一些编译错误小记
学习OpenCV3:MinGW编译OpenCV到vs_version.rc.obj处出错
Cmake error: Invalid escape sequence \U
Building OpenCV with MinGW (gcc 7.1.0 and cmake 3.9.0)-> windres.exe: unknown option – W