ORB-SLAM2在window下的配置 (4)

来源:互联网 发布:人工智能产品开发论文 编辑:程序博客网 时间:2024/06/13 07:21

配置DBoW2


接下来谈一谈DBoW2的配置,难度稍微大一点点,它存在于ORB-SLAM2的源码中,其作者也说了,它跟g2o一样都被修改过了,所以我们还是直接用ORB-SLAM2自带的就好。不过DBoW2后面还发展出DBoW3、FBoW,以后有时间可以替换着看看,应该能提高一些速度。

ORB-SLAM2的源码地址是:https://github.com/raulmur/ORB_SLAM2

步骤基本跟(3)配置Pangolin的是一样的,详情可见[我的上一篇文章]。首先使用CMake,生成vs工程。不过这一次操作执行Configure的时候,你会发现报错了:
出错

说的是配置出错,换句话说,CMakeList.txt不能直接用了。观察中间编译选项的“OpenCV_DIR-NOTFOUND”和下边错误提示大概可以知道,DBoW2编译需要opencv库,而CMake找不着。

这个错误明显是依赖库的问题,在linux下,只要我们先配置好依赖库,使用cmake一般不会有这种错误,那是因为我们一般配置的时候,会使用make install的指令,将库配置到系统环境中去。但是对于window,我们很少会这么做。事实上,在linux下我觉得这样做也不太好,而应该像几篇文章以来的做法那样,为库专门弄一个地方放,而且要区分版本,环境配置到了用的时候再视情况设置。

但是现在Configure就需要opencv了,这该怎么办呢?其实也很简单,直接在CMakeList.txt中导致该错误的寻找opencv的指令删除就好了,具体是:

find_package(OpenCV 3.0 QUIET)if(NOT OpenCV_FOUND)   find_package(OpenCV 2.4.3 QUIET)   if(NOT OpenCV_FOUND)      message(FATAL_ERROR "OpenCV > 2.4.3 not found.")   endif()endif()

好了,现在继续往下走吧,你会发现错误都没有了。不过,不可能就这么把opencv扔掉呀。那是当然,因为终究在vs下编译还是需要它的,这个时候,我们在(2)配置的opencv属性表便起作用了。

现在,打开DBoW2的vs工程,将生成模式调为Release,在“属性管理器”中为DBoW2项目添加该模式的opencv属性表,点击编译。

然,出现了问题,在FORB.cpp报错:
错误 C1083 无法打开包括文件: “stdint-gcc.h”: No such file or directory. 显然这是gcc编译器的头文件,vs下没有,我们直接把这句话删掉就好了。

OK,现在再编译一遍,此时出现了“无法解析外部符号”的链接错误,仔细看出错信息,发现竟然是opencv的问题。奇怪,我们应该添加了opencv的属性表了呀,且编译都通过了。赶紧右键项目->属性->链接器->输入看看究竟:
链接出错

赫然看到,“继承的值”里边,存在着属性表中opencv的库文件,但“计算的值”中,却没有,继承而不计算,什么情况!这里提供两种解决方案:

  1. 比较蠢的做法,就是直接在上方文本框中,再填一次opencv库文件;
  2. 点击该对话框下方的复选框“从父级或项目默认设置继承”

第一种做法显然存在冗余,但第二种做法却有点令人害怕,CMake如此指示也许有它的深意?我们不得而知(其实就是我也不懂啦),老办法,出了问题再说吧。

我们编译一下看看,嗯,成功生成了……嗯?啥都没有?除了个小得可怜的dll?我马上反应过来,我们还没给DBoW2配置API宣言呢,如此一来,这个库也白生成了。

现在为该工程添加一个头文件DBoW2Exports.h,内容是:

#pragma once#ifdef DBOW2_EXPORTS#define DBOW2_API __declspec(dllexport)#else#define DBOW2_API __declspec(dllimport)#endif

咋用呢?我们需要为那些声明和实现分开的类宣言API导出,如:class A改成class DBOW2_API A. 具体需要修改的类有:

  • BowVector.h中的BowVector
  • FeatureVector.h中的FeatureVector
  • FORB.h中的FORB
  • Random.h中的Random和UnrepeatedRandomizer
  • ScoringObjects.h中的GeneralScoring以及下方几个由宏定义的类,你可以直接修改在那个宏上;
  • Timestamp.h中的Timestamp

现在已经能够成功编译链接并生成dll和lib了,我们新建一个vs工程,为其建立一个属性表,测试代码如下:

#include <DBoW2/BowVector.h>int main(){    DBoW2::BowVector bow;    return 0;}

你会发现我提供的测试代码总是这么短,其实我们只要能够测试到

  • 我们可以正确的include到库的头文件
  • 确保库会被使用到
  • 程序可以正常编译链接

就好了。运行的时候注意,你是动态链接的方式,还是静态链接的方式,如果是动态的,可以右键项目->调试->环境设置值:path=XXX/DBoW2/lib/;$(path);

注意,路径使用斜杠‘/’,结尾也要有一个。后边的$(path)是保证系统环境变量也可以被考虑进来,否则系统环境变量就都失效了。当然,要是“环境”这个选项什么都不填,系统环境变量还是能起作用的。

好的,按理来说,DBoW2已经没有什么问题了,我们马上进行下一步。


有漏写的内容,关于API铺设的,已经修改,2017/7/23

原创粉丝点击