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