这个类内容较少,有两个重要功能,一是计算在回环检测时计算候选关键帧集合,二是在重定位时计算候选关键帧
变量:
std::vector<list<KeyFrame*> > mvInvertedFile
是一个向量,里面存放的是一个个单词,每个单词对应一个list链表,每个链表里存放的是拥有该单词的关键帧。
关键函数:
vector<KeyFrame*> KeyFrameDatabase::DetectLoopCandidates(KeyFrame* pKF, float minScore)
层层筛选,最终得到候选闭环关键帧:
步骤一:计算当前帧的共视关键帧得分,取出所有得分中最低的得分mincore。
步骤二:找出与当前关键帧具有共同单词的但不共视的关键帧,计算与当前关键帧共有的最多单词数,mincommons=0.8maxcommonwords。
步骤三:筛选出共有单词数大于mincommons且得分大于mincore的关键帧。组成候选帧集合
步骤四:对每一个候选帧,计算和它相连的10个最佳关键帧(权重最高的10个),对每一个计算与当前帧的相似得分,把这些得分求和作为这一组的总分数(这里面其实是11个分数的和),并记录该组中得分最高的帧。
步骤五:找出所有组中得分最高的一组bestAccScore,取阀值minScoreToRetain=0.75bestAccScore.
步骤六:找出符合阀值的组,将组中的最高分帧作为候选闭环帧。
vector<KeyFrame*> KeyFrameDatabase::DetectRelocalizationCandidates(Frame *F)
重定位候选帧的筛选策略和闭环帧筛选类似:
步骤一:找出与当前帧共享单词的所有帧,找出最高共享单词数maxcommonwords,计算阀值mincommons=0.8maxcommonwords。
步骤二:找出大于阀值的关键帧,计算他们与当前帧的相似得分。(注意:这里就没有mincore这个阀值约束了 。。。 PS:个人理解,完整的图还没有形成,所有局部共识关键帧得分没有什么太大意义,而且运动模型失效,说明局部关键帧并不能和当前关键帧很好的匹配,所以这个分数作为阀值参考意义不打。)
步骤三:对每一个候选帧,选出和它相连的10个最佳关键帧,对每一个计算与当前帧的相似得分,把这些得分求和作为这一组的总分数(这里面其实是11个分数的和),并记录该组中得分最高的帧。
步骤四:找出所有组中得分最高的一组bestAccScore,取阀值minScoreToRetain=0.75bestAccScore。
步骤五:找出符合阀值的组,将组中的最高分帧作为候选重定位帧。