ORB-SLAM2阅读笔记--Frame类()和KeyFrame类()

ORB-SLAM2—Frame()

1、Frame()构造函数

Frame::Frame(const cv::Mat &imGray, const cv::Mat &imDepth, const double &timeStamp, ORBextractor* extractor,ORBVocabulary* voc, cv::Mat &K, cv::Mat &distCoef, const float &bf, const float &thDepth)

函数功能:

1、初始化该帧的ID、初始化高斯金字塔的尺度参数

2、提取图像的特征点,对特征点进行失真矫正

3、如果为初始帧则将相机的相关参数重新加载进来,并计算矫正后的图像边界

4、将特征点加入到网格中(网格用来加速匹配,通过GetFeaturesInArea(x,y,r)可以迅速找到对应点周围区域的所有特征点序列

2、检查地图点是否在该帧相机的视锥内

bool Frame::isInFrustum(MapPoint *pMP, float viewingCosLimit)

函数参数介绍: pMP:待检测地图点

​ viewingCosLimit:最大视角 地图点与光心组成的向量与地图点平均向量组成的夹角的最大阈值

实现流程:

(1)、根据地图点的世界坐标得到地图点的相机坐标,验证深度值是否小于零

(2)、根据地图点的相机坐标得到地图点的像素坐标,检测像素坐标是否在边界内

(3)、计算地图点离相机中心的距离和角度是否符合设定的最大最小值,根据地图点与光心的组成一个向量和地图点的平均方向向量,两向量相乘除以向量的模值,即可得到视角。

(4)、如果都符合要求,说明此地图点可以被用在追踪线程中。就给地图点相应的数据赋值,这些数据主要用在追踪线程中,标记该点将来要被投影

3、找到特定区域的所有特征点

vector Frame::GetFeaturesInArea(const float &x, const float  &y, const float  &r, const int minLevel, const int maxLevel) const

函数功能:找到在 以x,y为中心,边长为2r的方形内且在[minLevel, maxLevel]的特征点

实现流程:

(1)计算该区域所占据的最大最小网格点

(2)循环所有找到的网格点内的所有特征点

(3)剔除所有不符合要求的特征点(包括不在规定金字塔层数和不在范围内的),返回满足条件特征点的序号

ORB-SLAM2—KeyFrame()

1、为该关键帧添加连接的关键帧(组建共视图)

void KeyFrame::AddConnection(KeyFrame *pKF, const int &weight)

实现流程:

(1)在map mConnectedKeyFrameWeights容器中加入此关键帧

(2)对mConnectedKeyFrameWeights中存储的关键帧集按照连接权重进行降序排序,排序之后的关键帧存储到mvpOrderedConnectedKeyFrames中,排序后的关键帧存储到mvOrderedWeights中

2、将关联的关键帧进行排序

void KeyFrame::UpdateBestCovisibles()

实现流程:对mConnectedKeyFrameWeights中存储的关键帧集按照连接权重进行降序排序,排序之后的关键帧存储到mvpOrderedConnectedKeyFrames中,排序后的关键帧存储到mvOrderedWeights中

3、返回关联关键帧(关联关键帧是指权重大于15的共视关键帧)

set KeyFrame::GetConnectedKeyFrames()

实现:抽取mConnectedKeyFrameWeights容器中存储的关键帧集返回

4、更新连接,创建共视图

void KeyFrame::UpdateConnections()

实现过程:

(1)首先获得该关键帧的所有MapPoint点,对于每一个MapPoint点,统计所有能观测到它的关键帧,然后统计这些关键帧与本关键帧的共视程度(即共视关键点个数)

(2)对每一个找到的关键帧(共视程度大于15),建立一条边,边的权重是该关键帧与当前关键帧公共3d点的个数

(3)对这些连接按照权重从大到小进行排序,以方便将来的处理,存储到mvpOrderedConnectedKeyFrames和mvOrderedWeights中

(4)更新父关键帧为关联关键帧权重最大帧

5、计算关键帧场景的深度,即关键点的像素深度

float KeyFrame::ComputeSceneMedianDepth(const int q)

参数:q=2代表帧中关键点的深度的中值

实现过程:提取帧中的所有地图点,根据相机位姿得到地图点在相机坐标系下的坐标,计算深度,求取中值。

你可能感兴趣的:(ORB-SLAM2源代码阅读)