自己用,后面看多少接着再补
ORB-SLAM2读代码 先只看 Tracking
单看 mono_tum.cc 中间各种文件打开及opencv调用的部分不说
mono_tum.cc 中
ORB_SLAM2::System
进System.cc构造
先初始化追踪线程,调用
new Tracking(this, //现在还不是很明白为什么这里还需要一个this指针 TODO
mpVocabulary, //字典
mpFrameDrawer, //帧绘制器
mpMapDrawer, //地图绘制器
mpMap, //地图
mpKeyFrameDatabase, //关键帧地图
strSettingsFile, //设置文件路径
mSensor); //传感器类型iomanip
进Tracking.cc 构造
先读取内参矩阵和畸变系数,再读取每帧提取的特征点个数、金字塔变化尺度、金字塔层数、fast点的提取阈值,再构造ORB特征提取器
new ORBextractor(
nFeatures, //参数的含义还是看上面的注释吧
fScaleFactor,
nLevels,
fIniThFAST,
fMinThFAST);
进ORBextractor.cc构造
先获取每层金字塔的缩放系数,然后计算每层金字塔特征点分配的个数
退到 mono_tum.cc 调用 SLAM.TrackMonocular(im,tframe);
进Sytem.cc 内 TrackMonocular
进 cv::Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);
进Tracking.cc GrabImageMonocular 里的
Frame(
mImGray,
timestamp,
mpIniORBextractor, //初始化ORB特征点提取器会提取2倍的指定特征点数目
mpORBVocabulary,
mK,
mDistCoef,
mbf,
mThDepth);
进 Frame.cc的构造
进 ExtractORB(0,imGray); 内部调用仿函数
(*mpORBextractorLeft)(im, //待提取特征点的图像
cv::Mat(), //掩摸图像, 实际没有用到
mvKeys, //输出变量,用于保存提取后的特征点
mDescriptors); //输出变量,用于保存特征点的描述子
进 ORBextractor.cc 的 重载operator()
调用 构建金字塔 ComputePyramid 、四叉数分配特征点 ComputeKeyPointsOctTree、图像高斯模糊去杂点GaussianBlur、 计算描述子computeDescriptors 等操作