当前位置: 首页 > news >正文

ORB_SLAM2中的字典DBow

参考: https://www.jianshu.com/p/cfcdf12a3bb6 (创建DBow离线词典用于ORB SLAM2)

https://github.com/dorian3d?tab=overview&from=2018-12-01&to=2018-12-31(DBOW作者的github)

 

前言

无论是DBow2,还是DBow3,它们创建的字典文件的都是.yml格式,不能直接应用于ORB SLAM2。文件如下:

vocabulary:
   k: 10  #词典树的分枝因子,即kmeas的K族
   L: 5   #树的深度
   scoringType: 0  #相似度
   weightingType: 0   #权重
   nodes: #节点,以下分别是节点id,父节点id,权重
      - { nodeId:1, parentId:0, weight:0.,  
          descriptor:"63 127 236 133 254 19 222 248 83 238 156 239 73 108 215 135 127 229 247 231 237 243 237 206 62 95 239 183 111 255 122 213 " }
      - { nodeId:2, parentId:0, weight:0.,
    ...
    words:
      - { wordId:0, nodeId:23 }
      - { wordId:1, nodeId:31 }
    ...

 

ORB SLAM2中的ORBvoc.txt

SLAM中字典文件是作者他们用巨大的图片库生成的,对室内,户外都有很好的效果,有时候自己生成的字典,效果没它好,格式如下

10 6  0 0 #表示上面的k,L,s,w
0 0 252 188 188 242 169 109 85 143 187 191 164 25 222 255 72 27 129 215 237 16 58 111 219 51 219 211 85 127 192 112 134 34  0
...
# 0表示节点的父节点;0表示是否是叶节点,是的话为1,否则为0;252-34表示orb特征;最后一位是权重

修改DBow2

因为ORB SLAM2用的是DBow2,还是直接改DBow2,让它支持生成如ORBvoc.txt的文件。
之前找了好多资料,都没有很好的实现,如https://github.com/jonas-/myStuff,我总是编译不成功。但在这上面看到一个函数saveToTextFile,它就是生成txt文件的函数。
DBow2中是没有的,但我看了ORB SLAM中DBow2,发现是有的,是作者加的。其实这样的还有很多,比如ORB SLAM2中ORB特征提取,不是直接用Opencv的,但大体相似,只做了少许改动。

template<class TDescriptor, class F>
void TemplatedVocabulary<TDescriptor,F>::saveToTextFile(const std::string &filename) const
{
    fstream f;
    f.open(filename.c_str(),ios_base::out);
    f << m_k << " " << m_L << " " << " " << m_scoring << " " << m_weighting << endl;

    for(size_t i=1; i<m_nodes.size();i++)
    {
        const Node& node = m_nodes[i];
        f << node.parent << " ";
        if(node.isLeaf())
            f << 1 << " ";
        else
            f << 0 << " ";
        f << F::toString(node.descriptor) << " " << (double)node.weight << endl;
    }
    f.close();
}

 把上面的代码放到TemplatedVocabulary.h中,前面加声明,还有using namespace std;,然后在demo.cpp中调用此函数,重新编译一下,OK。
也可以直接用现成的代码:https://github.com/itswcg/DBow

 

相关文章:

  • 黑客与画家:一
  • 黑客与画家:二
  • 黑客与画家:三
  • jQuery之父:每天写代码
  • 一个机器学习博士生的忠告
  • 喂,你是在学习还是在逃避?
  • 工作中四种重要的能力------谈谈工作两年后的一点思考
  • 像外行一样思考,像专家一样实践
  • 认识SCI、EI、ISTP、IEEE等和算法论文
  • 反演
  • BP神经网络入门
  • 模块涉及摄像头 文件系统 LCD
  • Latex 用法
  • KD树
  • opencv3计算机视觉:python实现
  • 2017 年终总结 —— 在路上
  • 78. Subsets
  • Brief introduction of how to 'Call, Apply and Bind'
  • IOS评论框不贴底(ios12新bug)
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Material Design
  • Rancher-k8s加速安装文档
  • ReactNativeweexDeviceOne对比
  • Redux 中间件分析
  • Web Storage相关
  • windows-nginx-https-本地配置
  • windows下使用nginx调试简介
  • 安装python包到指定虚拟环境
  • 理解在java “”i=i++;”所发生的事情
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 使用 QuickBI 搭建酷炫可视化分析
  • 温故知新之javascript面向对象
  • 用Python写一份独特的元宵节祝福
  • 怎么将电脑中的声音录制成WAV格式
  • 最近的计划
  • ​【已解决】npm install​卡主不动的情况
  • #微信小程序(布局、渲染层基础知识)
  • (2)nginx 安装、启停
  • (39)STM32——FLASH闪存
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (转)Oracle存储过程编写经验和优化措施
  • ***测试-HTTP方法
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .aanva
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Core与存储过程(一)
  • .net 程序发生了一个不可捕获的异常
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 依赖注入和配置系统
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net连接MySQL的方法
  • @javax.ws.rs Webservice注解
  • @TableLogic注解说明,以及对增删改查的影响
  • @Valid和@NotNull字段校验使用
  • [2544]最短路 (两种算法)(HDU)