由于需要使用Opencv中的Aruco码进行位姿估计,而Aruco的功能在opencv-contrib模块中。而直接在官网下载的编译好的Opencv(即含有build文件夹)不包含contrib模块,因此如果想使用contrib模块,必须使用源码再次进行编译安装。此外,如果之前已经安装了opencv,想追加安装contrib模块,也是这种操作,因为cintrib必须和opencv一起编译,并不能单独编译使用。
我在经历了多次失败后成功从源码编译安装了Opencv+contrib,在此做一个记录。主要的参考是B站两个Up主的视频( 参考视频1 参考视频2 ),在此表示感谢。
参考
此处我使用的是vs2017,下载时的选项如下(图片使用的是网图,其中安装的是vs2019):
参考
opencv下载
下载地址:https://opencv.org/releases/
这里到官网下载exe文件和Source文件均可,exe文件双击后会解压文件到某个位置,解压后的文件内容如下:
opencv_contrib下载
下载地址:https://github.com/opencv/opencv_contrib/releases
解压opencv_contrib压缩包到opencv目录下
务必注意:Opencv的版本和contrib的版本必须要一致!
参考视频1 参考视频2 参考博客1
OpenCV4.5.1/new_build/CMakeDownloadLog.txt
文件,查看报错信息进入到CMakeDownloadLog.txt文件中所指示的文件存储位置可以发现,很多文件都的大小都是0Kb,可见文件并没有完整下载下来,因此报了上面的错误。在这里我们先解决4个文件下载失败的问题,分别是
以上三个文件都是可以下载的,根据CMakeDownloadLog.txt文件中的网址,用浏览器输入网址把这三个文件下载下来,然后复制到指定的位置,再将文件名改为“md5校验码-文件名”的形式即可。
如果这个文件在Cmake中也没有下载成功的话,输入网址进去会发现它不能下载,而是直接显示文件的内容。直接把网页中显示的文件内容复制,然后到文件的存储位置用记事本打开文件,粘贴进去即可。
剩下的 .i
文件
看cmake的报错可以发现,还剩下xfeatures2d/boostdesc
文件夹下的文件下载失败,如图所示:
还有xfeatures2d/vgg
文件夹下的文件下载失败,如图所示:
同样,这些文件和ffmpeg_version.cmake文件一样,输入网址进去也不能下载,网页会显示文件内容,如图所示。此时直接将网页内容复制然后粘贴到文件中去,或者右键另存为txt下载即可。
但是经过我的测试,把这些.i文件按照上面那4个文件的做法,复制到指定位置并且重命名后,再进入到Cmake中编译,还是会下载文件,并且这些重命名后的文件全部又变成了0Kb。原因不明,所以这里先不更改复制这些文件到指定位置。
正确的操作是:输入这些文件的网址,然后右键另存为,这些文件在后面会使用到,文件名会自动生成,不必更改。
如下图,是我得到的所有.i文件:
CMake Warning at cmake/OpenCVDetectPython.cmake:81 (message):
CMake's 'find_host_package(PythonInterp 2.7)' found wrong Python version:
PYTHON_EXECUTABLE=C:/Users/xx/AppData/Local/Programs/Python/Python38/python.exe
PYTHON_VERSION_STRING=3.8.2
Consider providing the 'PYTHON2_EXECUTABLE' variable via CMake command line
or environment variables
........
报错的内容如上,大致的意思就是cmakelists中用到了python2.7,而这个python2.7是使用一个叫PYTHON_EXECUTABLE
的环境变量指向的,但是因为没定义这个环境变量,它直接指向了默认的python版本,也就是python3的版本。所以解决的办法就是把添加这个环境变量,并将其内容更改为python2.7的可执行文件。如图所示。具体操作见: 参考
经过以上步骤之后,除了.i文件的下载问题未解决之外,其他的问题已经都解决了。这时候再次点击config,应该会发现输出的报错中只剩.i文件下载失败的错误了。这里不管他,直接点击generate生成工程。
参考
注意:倘若直接编译的话,会产生如下3.1、3.2和3.3的错误。因为编译的时间非常长,所以这里就未雨绸缪,先根据原因消除错误再进行编译。
问题:编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件。
解决:添加.i文件到指定目录。将在上一节中下载的.i文件,全部复制到E:\OpenCV4.5.1\opencv_contrib-4.5.1\modules\xfeatures2d\src
路径下即可。如图所示:
如果不进行这一步的操作的话,最后编译工程会产生如下错误,可以看到其中就有提示找不到.i文件。
问题:
fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录
#include "features2d/test/test_detectors_regression.impl.hpp
解决:头文件include地址不对,解决方法如下:
将sources/modules/features2d/test/
文件下的以下5个文件:
(注意:该目录下有6个.hpp文件,只拷贝下面五个就可以,不需要拷贝test_precomp.hpp
文件)
test_descriptors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_detectors_regression.impl.hpp
test_invariance_utils.hpp
拷贝到opencv_contrib-4.1.0/modules/xfeatures2d/test/
文件下。
同时,将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_features2d.cpp
文件里的
#include "features2d/test/test_detectors_regression.impl.hpp"
#include "features2d/test/test_descriptors_regression.impl.hpp"
改成:
#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"
将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp
文件里的
#include "features2d/test/test_detectors_invariance.impl.hpp"
#include "features2d/test/test_descriptors_invariance.impl.hpp"
改成:
#include "test_detectors_invariance.impl.hpp"
#include "test_descriptors_invariance.impl.hpp"
参考
问题:编译OpenCV提示LNK1104 无法打开文件“python37_d.lib”,其实原因就是缺少了python的debug版本库文件,因为一般在安装python的时候都是没安装debug模式。
解决:在解决这个问题之前,请先确保你安装了python的debug版本,如果没有,可以修改已经安装的python,如下图所示勾选最后一项,然后install
然后,解决方法很简单,给如下图所示的项目添加python37_d.lib所在的路径即可。
以下这两个操作必不可少!
1、将python37_d.lib所在文件夹的路径添加到库目录里面
2、然后在附加依赖项中添加python37_d.lib,就是刚才找不到的这个库文件的名字。然后保存即可
添加环境变量
新建空项目,并添加测试源文件
此时添加源文件后,会发现报错找不到头文件等等,这是因为还没有配置项目属性。
配置项目属性
显示属性管理器
为Debug模式新建属性表
编辑属性表
添加include路径、library路径
添加链接器链接的lib路径
找到上一步添加的库目录的路径,即E:\OpenCV4.5.1\new_build\install\x64\vc15\lib
,由于我们之前生成了debug和release两种类型的库,所以可以发现该路径下的库分为release用的*.lib库和debug用的 *d.lib库。由于我们现在配置的是debug模式下的属性表,所以需要提取所有的 *d.lib文件。
在该目录下新建一个getDebugLibName.txt文件,内容改为
DIR *d.lib /B >debugLibName.txt
意思就是提取当前目录下的所有文件名以d.lib结尾的文件,然后将文件名输出到debugLibName.txt文件中。
保存后将getDebugLibName.txt文件重命名为getDebugLibName.bat文件,即编程windows下的批处理文件。然后双击这个文件运行,就会得到一个debugLibName.txt文件。
复制该文件里的所有内容,添加到链接器的input里面,然后保存属性表即可。
运行项目,发现报错找不到d.dll文件
这里是因为我们之前添加的Opencv的系统环境变量还没生效,需要重启电脑让环境变量生效。此时重启即可。
再次运行测试项目
注意把测试下项目改成Debug下的x64模式,然后点击运行。
项目成功运行,把生成的Aruco码显示了出来,说明Opencv和contrib模块都是正常的。 大功告成!
在上面添加链接器的库文件的时候,有很多库文件,我是使用了一个批处理文件得到了这些文件的名称,然后复制到了属性表中,这样操作比较麻烦。
使用cmake进行编译的时候,有一个BUILD_opencv_world
选项,如下图所示。
如果选择了这个选项,那么最后使用vs编译生成.lib库文件的时候就会生成一个总的opencv_world451d.lib
文件,如下图所示。
但是,我之前勾选了这个选项,在使用vs编译的时候,会产生很多错误,提示找不到opencv_world451d.lib
文件。而不勾选这个选项就不会报错,所以上面的做法中我没有勾选。由于最后这两种情况的使用效果是一样的,并且编译一次太耗时间,因此我就没再测试。
链接:https://pan.baidu.com/s/1ImP_ut0T45eiaaayNbkwpQ 提取码:mn5m
链接: https://pan.baidu.com/s/1aQvsrYty6vjCYPd-HrxLUQ 提取码:o13u
链接:https://pan.baidu.com/s/1bL5d25TH-SxENieST6MEFg 提取码:h0s6