ORBSLAM中的DBoW2关键代码注释

本文详细解析ORBSLAM中DBoW2库的关键代码,介绍了如何从ORBvoc.txt构建词袋模型的词典,并通过遍历词典节点进行描述子匹配,实现回环检测。通过比较描述子相似度,累加节点权重,确定帧间的回环关系。
摘要由CSDN通过智能技术生成

ORBSLAM中的DBoW2关键代码注释


在阅读ORBSLAM源码时对DBoW2中代码顺手做的注释,怕以后会忘记,在这里记录一下,注释有不当之处,望各位大神看到后多多指点。部分注释参考的 路游侠的文章,理论参考高翔的《视觉SLAM十四讲》第12章的内容。这里找回环的方法是图像与图像直接比较,VINS-Mono中采用的方法是 图像与数据库的比较

ORBSLAM的main.cpp文件中有这么一句代码

ORB_SLAM::ORBVocabulary Vocabulary;
bool bVocLoad = Vocabulary.loadFromTextFile(strVocFile);

ORBVocabulary这个类定义在include文件夹下的ORBVocabulary.h文件中,loadFromTextFile()函数在DBoW2中的TemplatedVocabulary.h文件中,

template<class TDescriptor, class F>
bool TemplatedVocabulary<TDescriptor,F>::loadFromTextFile(const std::string &filename)
{
   
    ifstream f;
    f.open(filename.c_str());// 打开ORBvoc.txt文件
	
    if(f.eof())
	return false;

    m_words.clear();//叶子清空
    m_nodes.clear();//节点清空

    string s;
    getline(f,s);// 读取文件的第一行
    stringstream ss;
    ss << s;
    ss >> m_k;// 聚类的最大类数(一个节点的最大子节点数)
    ss >> m_L;// 树的深度
    int n1, n2;
    ss >> n1;
    ss >> n2;

    if(m_k<0 || m_k>20 || m_L<1 || m_L>10 || n1<0 || n1>5 || n2<0 || n2>3)
    {
   
        std::cerr << "Vocabulary loading failure: This is not a correct text file!" << endl;
	return false;
    }
    
    m_scoring = (ScoringType)n1;//评分标准设定
    m_weighting = (WeightingType)n2;//权重计算标准设定
    createScoringObject();//根据m_scoring选择m_scoring_object

    // nodes
	// nodes 节点数的计算其实就是一个等比数列,这里计算的是它可容纳的极限值
    int expected_nodes =
    (int)((pow((double)m_k, (double)m_L + 1) - 1)/(m_k - 1));
    m_nodes.reserve(expected_nodes);

	// 单词数,这里计算的是它可容纳的极限值
    m_words.reserve(pow((double)m_k, (double)m_L + 1));

    m_nodes.resize(1);
    m_nodes[0].id = 0; //根节点
    while(!f.eof())// 读取文件的第二行到最后一行,行号减一就是节点ID
    {
   
        string snode;
        getline(f,snode);// 读取一行字符
        stringstream ssnode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值