类对象mpTracker、mpLocalMapper、mpLoopCloser都是十分重要的,是整个系统最最核心的3个类对象
//输入为单目图像时的追踪器接口
cv::Mat System::TrackMonocular(const cv::Mat &im, const double ×tamp)
{
/*1、判断传感器的类型是否为单目模式,如果不是,则表示设置错误,函数直接返回
2、上锁 模式锁(mMutexMode):
(1)如果目前需要激活定位模式,则请求停止局部建图,并且等待局部建图线程停止,设置为仅追踪模式。
(2)如果目前需要取消定位模式,则通知局部建图可以工作了,关闭仅追踪模式
3、上锁 复位锁(mMutexReset): 检查是否存在复位请求,如果有,则进行复位操作
4、核心部分: 根据输入的图像获得相机位姿态(其中包含了特征提取匹配,地图初始化,关键帧查询等操作)
5、进行数据更新,如追踪状态、当前帧的地图点、当前帧矫正之后的关键点等。*/
//4、获取相机位姿的估计结果
cv::Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);
unique_lock<mutex> lock2(mMutexState);
//5、
mTrackingState = mpTracker->mState;
mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;
mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;
return Tcw;
}
mpTracker的初始化
mpTracker = new Tracking(this, //
mpVocabulary, //字典
mpFrameDrawer, //帧绘制器
mpMapDrawer, //地图绘制器
mpMap, //地图
mpKeyFrameDatabase, //关键帧地图
strSettingsFile, //设置文件路径
mSensor); //传感器类型iomanip
cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double ×tamp)
{
mImGray = im;
// Step 1 :将彩色图像转为灰度图像
//若图片是3、4通道的,还需要转化成灰度图
// Step 2 :构造Frame
//判断该帧是不是初始化
mCurrentFrame = Frame(
mImGray,
timestamp,
mpORBextractorLeft, //正常运行的时的ORB特征点提取器,提取指定数目特征点
mpORBVocabulary,
mK,
mDistCoef,
mbf,
mThDepth);
// Step 3 :跟踪
Track();
//返回当前帧的位姿
return mCurrentFrame.mTcw.clone();
}
GrabImageMonocular 函数中,最核心的部分在于 Track() 函数。但是其上的 Frame 创建也是十分重要的,其中做了很多追踪需要的预备工作,如图像金字塔、特征提取,关键点矫正、特征点均匀分布等操作