部分转自博客链接.
一. DetectLoop() (检测回环):
LoopClosing.cc中DetectLoop()函数
(1)首先从队列中取出一个关键帧,判断:如果距离上次闭环没多久(小于10帧),或者map中关键帧总共还没有10帧.如果是的话,则不进行闭环检测。在数据库里把当前关键帧加上就好了.
if(mpCurrentKF->mnId<mLastLoopKFid+10)
{
mpKeyFrameDB->add(mpCurrentKF);
}
否则就开始回环检测,遍历所有的共视关键帧计算所有共视关键帧的得分。步骤如下:
(2)mpKeyFrameDB->DetectLoopCandidates(mpCurrentKF, minScore)这个函数就是用于选择出候选关键帧的,具体操作(包括了第3 步骤):将与当前帧相连的局部关键帧剔除然后遍历所有关键帧,找出与当前关键帧具有相同单词的关键帧,然后统计所有闭环候选帧中与当前关键帧具有共同单词最多的单词数,将最多单词的80%设置为阈值,然后找出所有单词数超过阈值,且相似度检测大于相邻关键帧最低分数的关键帧。
在这之前的工作:
第一小步:检测与当前帧相连的局部关键帧.保存在vector<KeyFrame*> vpConnectedKeyFrames里面.(为了找出阈值minScore)(vpConnectedKeyFrames = mpCurrentKF->GetVectorCovisibleKeyFrames();)这里跟后面不太一样
第二小步:计算当前帧与相邻帧局部关键帧的分数找出最低值存在float minScore里面.
第三步:跳转DetectLoopCandidates(mpCurrentKF, minScore)函数,其中mpCurrentKF是当前帧
(3)