前言
跟踪线程中插入关键帧相对宽松,主要是提高跟踪的成功率,它能保证在纹理不足、大旋转、快速运动等情况下也能有较好的跟踪。但这些关键帧全都传入到局部建图线程中会使局部BA进行的非常慢,因此需要剔除一些冗余度高的一些关键帧。
冗余度的衡量标准:
90%以上的地图点被其他至少三个以上的关键帧观测到。这意味着有一些关键帧看到的地图点几乎都一样,这时候删除一些关键帧也不影响。
1.函数声明
void LocalMapping::KeyFrameCulling()
2.函数定义
步骤:
1.调用GetVectorCovisibleKeyFrames函数根据共视图提取当前关键帧的所有共视关键帧,便于后续进行剔除。
// Check redundant keyframes (only local keyframes)
// A keyframe is considered redundant if the 90% of the MapPoints it sees, are seen
// in at least other 3 keyframes (in the same or finer scale)
// We only consider close stereo points
// 该函数里变量层层深入,这里列一下:
// mpCurrentKeyFrame:当前关键帧,本程序就是判断它是否需要删除
// pKF: mpCurrentKeyFrame的某一个共视关键帧
// vpMapPoints:pKF对应的所有地图点
// pMP:vpMapPoints中的某个地图点
// observations:所有能观测到pMP的关键帧
// pKFi:observations中的某个关键帧
// scaleLeveli:pKFi的金字塔尺度
// scaleLevel:pKF的金字塔尺度
// Step 1:根据共视图提取当前关键帧的所有共视关键帧
vector<KeyFrame*> vpLocalKeyFrames = mpCurrentKeyFrame->GetVectorCovisibleKeyFrames();
2.遍历提取的所有共视关键帧,调用GetMapPointMatches函数获取每一关键帧的地图点。
// 对所有的共视关键帧进行遍历
for(vector<KeyFrame*>::iterator vit=vpLocalKeyFrames.begin(), vend=vpLocalKeyFrames.end(); vit!=vend; vit++)
{
KeyFrame* pKF = *vit;
// 第1个关键帧不能删除,跳过
if(pKF->mnId==0)
continue;
// Step 2:提取每个共视关键