欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

「ORB_SLAM2源码解读」

程序员文章站 2024-03-24 23:44:46
...

「ORB_SLAM2源码解读」Frame.cc的mCurrentFrame

for(int i=0; i<mCurrentFrame.N; i++){// 清除观测不到的地图点 Clean VO matches
   MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];
       if(pMP)
           if(pMP->Observations()<1){
               mCurrentFrame.mvbOutlier[i] = false;
               mCurrentFrame.mvpMapPoints[i]=static_cast<MapPoint*>(NULL);
   }
}



// 被观测到的相机数目,单目+1,双目或RGB-D则+2
int MapPoint::Observations(){
    unique_lock<mutex> lock(mMutexFeatures);
    return nObs;
}

// 给地图点添加观测 记录哪些KeyFrame的那个特征点能观测到该地图点,并增加观测的相机数目nObs,单目+1,双目或者rgbd+2,这个函数是建立关键帧共视关系的核心函数,能共同观测到某些地图点的关键帧是共视关键帧
void MapPoint::AddObservation(KeyFrame* pKF, size_t idx){
    unique_lock<mutex> lock(mMutexFeatures);
    if(mObservations.count(pKF))// mObservations:观测到该MapPoint的关键帧KF和该MapPoint在KF中的索引如果已经添加过观测返回,Map是一种关联容器,它按照特定顺序存储由键值Key和映射值Value组合而成的元素。使用count返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。使用find,返回的是被查找元素的位置,没有则返回map.end()。Map通常是基于二叉搜索树实现的。
        return;
    mObservations[pKF]=idx;// 如果没有添加过观测,记录下能观测到该MapPoint的KF和该MapPoint在KF中的索引
    if(pKF->mvuRight[idx]>=0)
        nObs+=2;// 双目或者rgbd
    else
        nObs++;// 单目
}


std::map<KeyFrame*,size_t> mObservations;// Keyframes observing the point and associated index in keyframe 观测到该MapPoint的KF和该MapPoint在KF中的索引