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)可以迅速找到对应点周围区域的所有特征点序列
bool Frame::isInFrustum(MapPoint *pMP, float viewingCosLimit)
函数参数介绍: pMP:待检测地图点
viewingCosLimit:最大视角 地图点与光心组成的向量与地图点平均向量组成的夹角的最大阈值
实现流程:
(1)、根据地图点的世界坐标得到地图点的相机坐标,验证深度值是否小于零
(2)、根据地图点的相机坐标得到地图点的像素坐标,检测像素坐标是否在边界内
(3)、计算地图点离相机中心的距离和角度是否符合设定的最大最小值,根据地图点与光心的组成一个向量和地图点的平均方向向量,两向量相乘除以向量的模值,即可得到视角。
(4)、如果都符合要求,说明此地图点可以被用在追踪线程中。就给地图点相应的数据赋值,这些数据主要用在追踪线程中,标记该点将来要被投影
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)剔除所有不符合要求的特征点(包括不在规定金字塔层数和不在范围内的),返回满足条件特征点的序号
void KeyFrame::AddConnection(KeyFrame *pKF, const int &weight)
实现流程:
(1)在map
(2)对mConnectedKeyFrameWeights中存储的关键帧集按照连接权重进行降序排序,排序之后的关键帧存储到mvpOrderedConnectedKeyFrames中,排序后的关键帧存储到mvOrderedWeights中
void KeyFrame::UpdateBestCovisibles()
实现流程:对mConnectedKeyFrameWeights中存储的关键帧集按照连接权重进行降序排序,排序之后的关键帧存储到mvpOrderedConnectedKeyFrames中,排序后的关键帧存储到mvOrderedWeights中
set KeyFrame::GetConnectedKeyFrames()
实现:抽取mConnectedKeyFrameWeights容器中存储的关键帧集返回
void KeyFrame::UpdateConnections()
实现过程:
(1)首先获得该关键帧的所有MapPoint点,对于每一个MapPoint点,统计所有能观测到它的关键帧,然后统计这些关键帧与本关键帧的共视程度(即共视关键点个数)
(2)对每一个找到的关键帧(共视程度大于15),建立一条边,边的权重是该关键帧与当前关键帧公共3d点的个数
(3)对这些连接按照权重从大到小进行排序,以方便将来的处理,存储到mvpOrderedConnectedKeyFrames和mvOrderedWeights中
(4)更新父关键帧为关联关键帧权重最大帧
5、计算关键帧场景的深度,即关键点的像素深度
float KeyFrame::ComputeSceneMedianDepth(const int q)
参数:q=2代表帧中关键点的深度的中值
实现过程:提取帧中的所有地图点,根据相机位姿得到地图点在相机坐标系下的坐标,计算深度,求取中值。