前言
这一部分用于投影的地图点是局部地图点中不属于当前帧的地图点,且这些地图点要在当前帧的视野范围内。
1.函数声明
void Tracking::SearchLocalPoints()
2.函数定义
1.遍历当前帧的地图点,将这些地图点从局部地图点中进行去除。
for(vector<MapPoint*>::iterator vit=mCurrentFrame.mvpMapPoints.begin(), vend=mCurrentFrame.mvpMapPoints.end(); vit!=vend; vit++){MapPoint* pMP = *vit;if(pMP){if(pMP->isBad()){*vit = static_cast<MapPoint*>(NULL);}else{// 更新能观测到该点的帧数加1(被当前帧观测了)pMP->IncreaseVisible();// 标记该点被当前帧观测到pMP->mnLastFrameSeen = mCurrentFrame.mnId;// 标记该点在后面搜索匹配时不被投影,因为已经有匹配了pMP->mbTrackInView = false;}}
2.判断当前局部地图点中除去当前帧的地图点外的地图点是否在当前帧的视野范围内。
调用isInFrustum()函数用于排除不在当前帧视野范围的地图点。
ORB-SLAM2源码学习:Frame.cc: Frame::isInFrustum 判断地图点是否在当前帧的视野范围内
// 准备进行投影匹配的点的数目int nToMatch=0;// Project points in frame and check its visibilityfor(vector<MapPoint*>::iterator vit=mvpLocalMapPoints.begin(), vend=mvpLocalMapPoints.end(); vit!=vend; vit++){MapPoint* pMP = *vit;// 已经被当前帧观测到的地图点肯定在视野范围内,跳过if(pMP->mnLastFrameSeen == mCurrentFrame.mnId)continue;// 跳过坏点if(pMP->isBad())continue;// Project (this fills MapPoint variables for matching)// 判断地图点是否在在当前帧视野内if(mCurrentFrame.isInFrustum(pMP,0.5)){// 观测到该点的帧数加1pMP->IncreaseVisible();// 只有在视野范围内的地图点才参与之后的投影匹配nToMatch++;}
3.经过筛选的地图点用于投影匹配,增加更多的匹配关系。
ORB-SLAM2源码学习:ORBmatcher.cc:ORBmatcher::SearchByProjection通过地图点投影进行特征匹配
if(nToMatch>0){ORBmatcher matcher(0.8);int th = 1;if(mSensor==System::RGBD) //RGBD相机输入的时候,搜索的阈值会变得稍微大一些th=3;// If the camera has been relocalised recently, perform a coarser search// 如果不久前进行过重定位,那么进行一个更加宽泛的搜索,阈值需要增大if(mCurrentFrame.mnId<mnLastRelocFrameId+2)th=5;// 投影匹配得到更多的匹配关系matcher.SearchByProjection(mCurrentFrame,mvpLocalMapPoints,th);}
结束语
以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。