KeyFrameDatabase类

这个类内容较少,有两个重要功能,一是计算在回环检测时计算候选关键帧集合,二是在重定位时计算候选关键帧

变量:

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.75
bestAccScore.
步骤六:找出符合阀值的组,将组中的最高分帧作为候选闭环帧。

vector<KeyFrame*> KeyFrameDatabase::DetectRelocalizationCandidates(Frame *F)

重定位候选帧的筛选策略和闭环帧筛选类似:
步骤一:找出与当前帧共享单词的所有帧,找出最高共享单词数maxcommonwords,计算阀值mincommons=0.8maxcommonwords。
步骤二:找出大于阀值的关键帧,计算他们与当前帧的相似得分。(注意:这里就没有mincore这个阀值约束了 。。。 PS:个人理解,完整的图还没有形成,所有局部共识关键帧得分没有什么太大意义,而且运动模型失效,说明局部关键帧并不能和当前关键帧很好的匹配,所以这个分数作为阀值参考意义不打。)
步骤三:对每一个候选帧,选出和它相连的10个最佳关键帧,对每一个计算与当前帧的相似得分,把这些得分求和作为这一组的总分数(这里面其实是11个分数的和),并记录该组中得分最高的帧。
步骤四:找出所有组中得分最高的一组bestAccScore,取阀值minScoreToRetain=0.75
bestAccScore。
步骤五:找出符合阀值的组,将组中的最高分帧作为候选重定位帧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值