关键帧数据库经过预先训练好的词典,维护一个向量std::vector<list<KeyFrame*> > mvInvertedFile; 该向量中mvInvertedFile[i]表示包含了第i个WordId的全部关键帧;数据库
咱们须要知道关键帧对应的vBowVec向量是一个map:spa
std::map<WordId, WordValue> // WordId以及单词值,WordId是惟一的,和一个特征绑定
KeyFrameDatabase::KeyFrameDatabase (const ORBVocabulary &voc): mpVoc(&voc) { mvInvertedFile.resize(voc.size()); // number of words }
该类的主要做用是在回环检测和重定位中,根据词袋模型的特征匹配度,找到闭环候选帧和重定位候选帧,二者之间的区别在于,须要参考关键帧去寻找闭环候选帧,而重定位则参考普通帧。code
主要步骤是:blog
1. 找出与当前帧pKF有公共单词的全部关键帧pKFi,不包括与当前帧相连的关键帧;class
2. 统计全部闭环候选帧中与pKF具备共同单词最多的单词数,只考虑共有单词数大于0.8*maxCommonWords以及匹配得分大于给定的minScore的关键帧,存入lScoreAndMatch;map
3. 对于第二步中筛选出来的pKFi,每个都要抽取出自身的共视(共享地图点最多的前10帧)关键帧分为一组,计算该组总体得分(与pKF比较的),记为bestAccScore;地图
全部组得分大于0.75*bestAccScore的,均看成闭环候选帧。统计
若想改变闭环检测候选帧的参数,根据场景鉴定闭环的阈值,能够在这里修改参数。数据