c++学习【16】System.cc中的SLAM.TrackMonocular(im,tframe)

类对象mpTracker、mpLocalMapper、mpLoopCloser都是十分重要的,是整个系统最最核心的3个类对象

//输入为单目图像时的追踪器接口
cv::Mat System::TrackMonocular(const cv::Mat &im, const double &timestamp)
{
    /*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 &timestamp)
{
    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 创建也是十分重要的,其中做了很多追踪需要的预备工作,如图像金字塔、特征提取,关键点矫正、特征点均匀分布等操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值