DBoW3安装踩坑含opencv匹配问题(SLAM十四讲)

学到slam十四讲第十一章,需要安装DBoW3库。

一直都在自己安装这些库,没用书中自带的,这样的话可以多踩一踩坑,多经历一些挫折。

结果坑一个个来。

安装DBoW3库之后却调用不了。这里暗含了与opencv的匹配问题。我从DBOW3的安装讲起。

1.DBoW3库的安装

安装很常规,这个库很类似ceres,不需要find_package,安装后会有.a或者.so文件生成。

安装过程:

git clone https://github.com/rmsalinas/DBow3.git

克隆后进入克隆的文件夹,在终端打开

mkdir build
cd build/
cmake ..
make
sudo make install

很常规,也很顺利。
但是使用时会出现两个问题。

问题一:不存在书中源码,CMakeLists.txt文件中,写着的

set( DBoW3_LIBS "/usr/local/lib/libDBoW3.a" )

也就是说/usr/local/lib/libDBoW3.a这个静态库文件不存在。但是观察到这个路径下有共享库,因此这个好解决,把其改为共享库:

set( DBoW3_LIBS "/usr/local/lib/libDBoW3.so" )

这个问题的原因可能是DBoW3版本迭代的问题。.a被淘汰了。

扫描二维码关注公众号,回复: 10307538 查看本文章

问题二:build一下通过了,但是执行的时候代码会报错:
在这里插入图片描述
即:error while loading shared libraries: libopencv_core3.so.3.3: cannot open shared object file: No such file or directory

这就有些许麻烦。但是仔细观看,它是需要加载一个opencv的共享库叫做: libopencv_core3.so.3.3,但是好像没有这个文件。看到3.3我恍然大悟。原来我之前装的是opencv3.2,但是最新版本的DBoW3需要opencv3.3。

因此,接下来,在与opencv3.2共存的情况下,安装opencv3.3

2.opencv3.3的安装并与opencv3.2共存

共存的手段很简单,只需要在cmake …的时候给一个安装路径即可。感兴趣的可以先看如何使得opencv3和opencv2共存,也就是我之前的一篇博客:https://blog.csdn.net/weixin_44684139/article/details/104837210
感兴趣的童鞋也可以看看opencv4的安装。和这里的流程差不多。

当然,没兴趣就不看了。直接看这里。

2.1 安装依赖库

之前安装过opencv的依赖库一般都装齐全了(个别不重要的不齐全也没事,不影响编译成功)。如果想知道opencv3.3需要哪些依赖库请自行百度。

2.2 编译安装

首先下载opencv3.3的包:
https://codeload.github.com/opencv/opencv/zip/3.3.0
提取,进入,终端打开

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.3 ..
make -j4
sudo make install

这里使用CMAKE_INSTALL_PREFIX=/usr/local/opencv3.3规定安装路径。以避免与之前的opencv版本(2/3)冲突

但是注意,在cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.3 …
中间会遇到一个包download很慢的情况:ippicv_2017u2_lnx_intel64_20170418.tgz

先ctrl+c退出安装。此时需要手动下载,下载链接:(自行百度,csdn下载就有)

下载后将ippicv_2017u2_lnx_intel64_20170418.tgz文件放在某个路径之下。如放在home/slambook2/ipp/下

然后进入之前提取的opencv-3.3.0/3rdparty/ippicv/ippicv.cmake文件的47行引号内部改为:“file:~/Downloads/” 改为自己放置ippicv_2019_lnx_intel64_general_20180723.tgz的路径,如之前所说的
"file:home/slambook2/ipp/"

然后重新cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.3 …
然后 make -j4 然后 sudo make install
最终安装成功,会发现usr/local/下会有opencv3.3的文件夹。

在这里插入图片描述

3.一锤定音

回到程序,重新build一下,执行以下。发现还是找不到3.3的库。

明明安装完了opencv3.3,并且在路径/usr/local/opencv3.3/lib也发现了这个/usr/local/opencv3.3/lib/libopencv_core.so.3.3文件,按理说可以了呀?

这时候,先更新数据索引试一下:

sudo updatedb

然后locate libopencv_core.so.3.3看看文件是否能被搜索到

但是这时候突然发现,当我们回头看程序一开始报错的时候是:
在这里插入图片描述
我们需要的是libopencv_core3.so.3.3 !!!!

这个和我们下载下来的文件/usr/local/opencv3.3/lib/libopencv_core.so.3.3差一个3。但是我估计只是版本迭代改变了名称,所以要保证在安全的条件下将其重命名。

过称为:
一、
先将/usr/local/opencv3.3/lib/libopencv_core.so.3.3拷贝到随便一个目录,如这里:

sudo cp -i /usr/local/opencv3.3/lib/libopencv_core.so.3.3 /home/mjy

这样就将libopencv_core.so.3.3文件拷贝到/home/mjy下了。

然后将其重命名为:libopencv_core3.so.3.3 (一定要注意多一个3)

二、
参考这篇文章进行配置
https://blog.csdn.net/philosophyatmath/article/details/47343121?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

即:
进入目录:/etc/ld.so.conf.d

创建:opencv.conf

添加:/home/mjy (之所以这么添加是因为libopencv_core3.so.3.3在其中)
在这里插入图片描述

执行:sudo ldconfig

在回去跑一下高博的代码,百分百成功。

4. 补充

有些童鞋之前装了ros,很幸运的是在ros中自带了opencv3.3,然后本来就有文件libopencv_core3.so.3.3存在于路径/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3
可以自己locate看一下其是否存在

那么直接用:
进入目录:/etc/ld.so.conf.d

创建:opencv.conf

添加:/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3

执行:sudo ldconfig

但是

这样做可能会失败(代码跑起来会出现一些异常结果),可能是因为ros自带的opencv3.3的动态库文件与直接编译安装的opencv3.3是不一样的。所以你还是老老实实用我重命名的办法。

5.最终补充dbow3的引用方式

# dbow3
# 是/usr/local/lib/libDBoW3.so而不是/usr/local/lib/libDBoW3.a
set( DBoW3_INCLUDE_DIRS "/usr/local/include" )
set( DBoW3_LIBS "/usr/local/lib/libDBoW3.so" )

add_executable( feature_training feature_training.cpp )
target_link_libraries( feature_training ${OpenCV_LIBS} ${DBoW3_LIBS} )
发布了103 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44684139/article/details/105172685