29局部建图线程两级局部关键帧地图点融合

ORBSLAM2


29局部建图线程两级局部关键帧地图点融合


代码

void LocalMapping::SearchInNeighbors()
{
    // Retrieve neighbor keyframes
    int nn = 10;
    if(mbMonocular)
        nn=20;
    const vector<KeyFrame*> vpNeighKFs = mpCurrentKeyFrame->GetBestCovisibilityKeyFrames(nn);//取出共视关系前nn的关键帧,一级关键帧
    vector<KeyFrame*> vpTargetKFs;
    for(vector<KeyFrame*>::const_iterator vit=vpNeighKFs.begin(), vend=vpNeighKFs.end(); vit!=vend; vit++)//遍历相邻关键帧
    {
        KeyFrame* pKFi = *vit;//取出这个关键帧
        if(pKFi->isBad() || pKFi->mnFuseTargetForKF == mpCurrentKeyFrame->mnId)//bad或者已经将进行了融合操作
            continue;//继续
        vpTargetKFs.push_back(pKFi);//将相邻关键帧存入vpTargetKFS中
        pKFi->mnFuseTargetForKF = mpCurrentKeyFrame->mnId;//然后将相邻关键帧中的mnFuseTargetForKF设置成当前关键帧的ID,标记融合

        // Extend to some second neighbors
        const vector<KeyFrame*> vpSecondNeighKFs = pKFi->GetBestCovisibilityKeyFrames(5);//取出相邻关键帧的前5帧相邻关键帧
        for(vector<KeyFrame*>::const_iterator vit2=vpSecondNeighKFs.begin(), vend2=vpSecondNeighKFs.end(); vit2!=vend2; vit2++)//遍历这5帧二级关键帧
        {
            KeyFrame* pKFi2 = *vit2;//取出二级关键帧
            if(pKFi2->isBad() || pKFi2->mnFuseTargetForKF==mpCurrentKeyFrame->mnId || pKFi2->mnId==mpCurrentKeyFrame->mnId)//如果是bad或者二级关键帧已经融合过了或者在这个二级关键帧就是他自己本身
                continue;
            vpTargetKFs.push_back(pKFi2);//不然将其存入VPTargetKFS,这里面存的是当前关键帧的一级与二级关键帧
        }
    }

	//将一二级相邻关键帧取出存储好后,下面开始进行融合,分为正向融合与反向融合
    // Search matches by projection from current KF in target KFs
    ORBmatcher matcher;
    vector<MapPoint*> vpMapPointMatches = mpCurrentKeyFrame->GetMapPointMatches();//得到当前关键帧的地图点匹配关系
    for(vector<KeyFrame*>::iterator vit=vpTargetKFs.begin(), vend=vpTargetKFs.end(); vit!=vend; vit++)//开始遍历一二级关键帧
    {
        KeyFrame* pKFi = *vit;//取出一二级关键帧

        matcher.Fuse(pKFi,vpMapPointMatches);//开始融合,正向
    }

    // Search matches by projection from target KFs in current KF,反向融合
    vector<MapPoint*> vpFuseCandidates;
    vpFuseCandidates.reserve(vpTargetKFs.size()*vpMapPointMatches.size());

    for(vector<KeyFrame*>::iterator vitKF=vpTargetKFs.begin(), vendKF=vpTargetKFs.end(); vitKF!=vendKF; vitKF++)//遍历一二级关键帧
    {
        KeyFrame* pKFi = *vitKF;//取出

        vector<MapPoint*> vpMapPointsKFi = pKFi->GetMapPointMatches();//获得地图点

        for(vector<MapPoint*>::iterator vitMP=vpMapPointsKFi.begin(), vendMP=vpMapPointsKFi.end(); vitMP!=vendMP; vitMP++)//遍历地图点
        {
            MapPoint* pMP = *vitMP;//取出地图点
            if(!pMP)
                continue;
            if(pMP->isBad() || pMP->mnFuseCandidateForKF == mpCurrentKeyFrame->mnId)
                continue;
            pMP->mnFuseCandidateForKF = mpCurrentKeyFrame->mnId;
            vpFuseCandidates.push_back(pMP);
        }
    }

    matcher.Fuse(mpCurrentKeyFrame,vpFuseCandidates);


    // Update points
    vpMapPointMatches = mpCurrentKeyFrame->GetMapPointMatches();
    for(size_t i=0, iend=vpMapPointMatches.size(); i<iend; i++)
    {
        MapPoint* pMP=vpMapPointMatches[i];
        if(pMP)
        {
            if(!pMP->isBad())
            {
                pMP->ComputeDistinctiveDescriptors();
                pMP->UpdateNormalAndDepth();
            }
        }
    }

    // Update connections in covisibility graph
    mpCurrentKeyFrame->UpdateConnections();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值