ORB-SLAM2源码学习: LocalMapping.cc⑥: LocalMapping::KeyFrameCulling关键帧剔除

前言

跟踪线程中插入关键帧相对宽松,主要是提高跟踪的成功率,它能保证在纹理不足、大旋转、快速运动等情况下也能有较好的跟踪。但这些关键帧全都传入到局部建图线程中会使局部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:提取每个共视关键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值