目录
1.函数作用
将跟踪线程的数据拷贝到绘图线程(图像、特征点、地图、跟踪状态)
2.code
void FrameDrawer::Update(Tracking *pTracker) { unique_lock<mutex> lock(mMutex); //拷贝跟踪线程的图像 pTracker->mImGray.copyTo(mIm); //拷贝跟踪线程的特征点 mvCurrentKeys=pTracker->mCurrentFrame.mvKeys; N = mvCurrentKeys.size(); mvbVO = vector<bool>(N,false); mvbMap = vector<bool>(N,false); mbOnlyTracking = pTracker->mbOnlyTracking; //如果上一帧的时候,追踪器没有进行初始化 if(pTracker->mLastProcessedState==Tracking::NOT_INITIALIZED) { //那么就要获取初始化帧的特征点和匹配信息 mvIniKeys=pTracker->mInitialFrame.mvKeys; mvIniMatches=pTracker->mvIniMatches; } //如果上一帧是在正常跟踪 else if(pTracker->mLastProcessedState==Tracking::OK) { //获取当前帧地图点的信息 for(int i=0;i<N;i++) { MapPoint* pMP = pTracker->mCurrentFrame.mvpMapPoints[i]; if(pMP) { if(!pTracker->mCurrentFrame.mvbOutlier[i]) { //该mappoints可以被多帧观测到,则为有效的地图点 if(pMP->Observations()>0) mvbMap[i]=true; else //否则表示这个特征点是在当前帧中第一次提取得到的点 mvbVO[i]=true; } } } } //更新追踪线程的跟踪状态 mState=static_cast<int>(pTracker->mLastProcessedState); }
3.函数解析
先来看一下该函数的几个变量的解释,这样方便我们理解:
1.cv::Mat mIm; 当前绘制的图像
2.cv::Mat mImGray 调用该函数的图像
3.Tracking *pTracker 跟踪线程的指针
4.vector<cv::KeyPoint> mvCurrentKeys; 当前帧的特征点
5.vector<bool> mvbMap, mvbVO; 当前帧中的特征点是否在地图中的标记
;当前帧的特征点在地图中是否出现;后者是表示地图中没有出现,但是在当前帧中是第一次被观测得到的点6.mLastProcessedState 上一帧时的SLAM系统的状态
7.vector<cv::KeyPoint> mvIniKeys; 参考帧中的特征点
8.vector<int> mvIniMatches; 当前帧特征点和参考帧特征点的匹配关系
9.mState 当前帧的SLAM系统状态
10.Frame mInitialFrame 初始化过程中的参考帧
我们首先将追踪线程的调用帧的图像传给mIm,拷贝跟踪线程当前帧的特征点到mvCurrentKeys中。
如果上一帧中追踪器没有进行初始化,那么就要获取初始化帧的特征点和匹配信息。
(可能是几种情况:①是初始化第一帧②是初始化的第二帧且当前帧初始化成功③是初始化的第二帧且当前帧初始化失败④跟踪失败)
如果上一帧是在正常跟踪那么获取当前帧地图点的信息,判断当前地图点若可以被多帧观测到,则为有效的地图点,置它的mvbMap向量为true,否则这个特征点是在当前帧中第一次提取得到的点,置mvbVO为true,然后调用其他函数绘制地图点。
最后用上一帧的跟踪状态更新追踪线程的跟踪状态。