tracking线程

Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧,将这些关键帧送给localmapping线程
在这里插入图片描述

1. 基本流程

首先从主线程system中的GrabImageMonocular()函数开始,进行图像的预处理和Frame的构造,Frame构造完成后真正进入Tracking。
在这里插入图片描述

↓↓↓主要看下面这张图↓↓↓
在这里插入图片描述
↑↑↑主要看上面这张图↑↑↑

2. 各部分详解

Tracking构造函数

Tracking线程在构造时主要是读取了一些参数,包括:

  1. 相机参数:
    相机内参矩阵、
    畸变校正矩阵、
    双目摄像头基线、
    相机的帧数、
    颜色通道、
    深度相机深度与距离的转化因子
  2. ORB特征提取相关参数:
    每一帧提取的特征点数、
    图像建立金字塔时的变化尺度、
    尺度金字塔的层数、
    提取fast特征点的默认阈值、
    提取fast特征点的最小阈值(如果默认阈值提取不出足够fast特征点,则使用最小阈值)

具体代码如下

Tracking::Tracking(System *pSys, ORBVocabulary* pVoc, FrameDrawer *pFrameDrawer, MapDrawer *pMapDrawer, Map *pMap, KeyFrameDatabase* pKFDB, const string &strSettingPath, const int sensor):
    mState(NO_IMAGES_YET), mSensor(sensor), mbOnlyTracking(false), mbVO(false), mpORBVocabulary(pVoc),
    mpKeyFrameDB(pKFDB), mpInitializer(static_cast<Initializer*>(NULL)), mpSystem(pSys), mpViewer(NULL),
    mpFrameDrawer(pFrameDrawer), mpMapDrawer(pMapDrawer), mpMap(pMap), mnLastRelocFrameId(0)
{
    //读取相机内参数据
    // Load camera parameters from settings file
    cv::FileStorage fSettings(strSettingPath, cv::FileStorage::READ);//opencv的FileStorage类,用于实现数据的存取等操作
    float fx = fSettings["Camera.fx"];
    float fy = fSettings["Camera.fy"];
    float cx = fSettings["Camera.cx"];
    float cy = fSettings["Camera.cy"];

    //生成相机内参矩阵
    //     |fx  0   cx|
    // K = |0   fy  cy|
    //     |0   0   1 |
    cv::Mat K = cv::Mat::eye(3,3,CV_32F);
    K.at<float>(0,0) = fx;
    K.at<float>(1,1) = fy;
    K.at<float>(0,2) = cx;
    K.at<float>(1,2) = cy;
    K.copyTo(mK);//把临时变量K中的数据copy到tracking类的成员变量中

    // 图像畸变矫正系数(畸变部分可以参考十四讲的5.1.2)
    // 通常只有鱼眼相机才进行校正,mono_kitti中并没有进行校正
    // [k1 k2 p1 p2 k3]
    cv::Mat DistCoef(4,1,CV_32F);
    DistCoef.at<float>(0) = fSettings["Camera.k1"];
    DistCoef.at<float>(1) = fSettings["Camera.k2"];
    DistCoef.at<float>(2) = fSettings["Camera.p1"];
    DistCoef.at<float>(
版权声明:本文为cndeveloper原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cndeveloper/p/14328592.html