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的库文件,但“计算的值”中,却没有,继承而不计算,什么情况!这里提供两种解决方案:
- 比较蠢的做法,就是直接在上方文本框中,再填一次opencv库文件;
- 点击该对话框下方的复选框“从父级或项目默认设置继承”
第一种做法显然存在冗余,但第二种做法却有点令人害怕,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
- ORB-SLAM2在window下的配置 (4)
- ORB-SLAM2在window下的配置 (1)
- ORB-SLAM2在window下的配置 (2)
- ORB-SLAM2在window下的配置 (3)
- ORB-SLAM2在window下的配置 (5)
- ORB-SLAM2在window下的配置 (6)
- ORB-SLAM2在window下的配置 (7)[END]
- 在ROS indigo下运行ORB-SLAM2
- Ubuntu下Kintinuous+ElasticFusion+ORB-Slam2配置中的问题记录
- ubuntu 14.04.5下运行ORB-SLAM2的数据
- ROS_kinetic下ORB-SLAM2的安装和使用
- ORB-Slam2详解4 Tracking
- ORB-SLAM2
- ORB-SLAM2
- ros下orb-slam2 安装(一)
- ORB-SLAM2编译遇到的一些问题
- ORB-SLAM2运行自己的数据集
- ORB-SLAM2的LOCAL MAPPING代码阅读
- 面试题七 C/C++ 骑士营救公主 骑士只能向右或者向下移动,遇到陷阱就死了,求骑士营救公主的所有路线-程序员面试题
- Chapter01 流与文件(三) 文件操作
- MATLAB基本绘图操作
- SDRAM中的DQM
- intellij idea 快捷键大全
- ORB-SLAM2在window下的配置 (4)
- 查找数组中出现次数超过一次的数字
- oracle 忘记密码 ---如何修改密码
- 深度探索C++对象模型.pdf
- github踩坑之git命令收集与整理(windows)
- 自己的php常用功能
- 引用,const引用,指针
- 把排序数组转换为高度最小的二叉搜索树
- Windows Server 2008 安装powershell