ORB-SLAM2源码分析(单目)——特征点提取

ORB-SLAM2源码分析(单目)——特征点提取

一、 先将图像转化成灰度图

在这里插入图片描述

二、 对图像进行特征提取

在这里插入图片描述

如果这帧图像是初始化图像,则提取两倍特征点数量用于后续初始化

三、 单目帧构造函数(Frame)

在这里插入图片描述

四、 读取图像金字塔的参数

在这里插入图片描述

五、 特征点提取(ExtractORB)

在这里插入图片描述

内部使用仿射函数完成,类似函数调用
具体调用函数:
在这里插入图片描述

具体实现的代码流程:
(1) 构建图像金字塔(ComputePyramid)
在这里插入图片描述

1、 计算出金字塔每一层图像的尺寸和提取特征点的数量
在这里插入图片描述

2、 对图像进行缩放,变成该层金字塔的图像尺寸
在这里插入图片描述

3、 对每一层金字塔图像进行填充(copyMakeBorder)
在这里插入图片描述

为什么要填充?
因为我们在提ORB特征点采用的是FAST方式,我们需要对边界进行填充从而能提取到边界点的角点,而且在后续的提取描述子是,我们要对图像先进行高斯模糊再提取描述子,所以也要对图像进行填充,

(2) 均匀化提取图像的特征点(ComputeKeyPointsOctTree)
与Opencv提取特征点不同,Opencv提取的特征点是对全图像区域提取的,这样提取到的特征点可能会集中出现在某几块区域内,而我们希望图像的每一块区域都有相对应的特征点,而均匀的特征点可以提高我们计算位姿的精确度
在这里插入图片描述

1、 对每一层金字塔图像进行分块,每30*30成一个块,将图像切分成很多块
在这里插入图片描述

我们后续对这些块进行特征点提取,而不是对整个图像进行提取
2、 计算图像的有效提取特征区域,因为之前对图像进行了填充
在这里插入图片描述

之前对图像的填充,是一次性填充后续算法需要用的,而我们这里对特征点提取,本质上不需要填充那么多,所以要截取掉一些无效的填充区域,保留我们提取角点的图像区域,获取到有效的特征点提取区域后,将图像进行分块,图像被切分成一块块网格
3、 对图像的每一个网格块进行提取特征点
在这里插入图片描述

4、 使用默认的角点阈值提取角点,如果没提取到角点,则降低阈值在提取
在这里插入图片描述

对坐标进行转化,因为在网格中提取到的特征点是相对于网格的,我们需要变换到图像中的坐标系。
5、 使用四叉树对特征点进行筛选(DistributeOctTree)
在这里插入图片描述

提取的特点数量超过我们设置的特征点阈值,所以我们要对特征点进行筛选,四叉树是将图像进行分裂,分裂到我们想要提取的特征点的数量,在从这些分裂的区域选择一个最好的特征点作为代表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、 计算特征点的描述子
统计所有特征点,构建特征点描述子矩阵
在这里插入图片描述

对图像进行高斯模糊
在这里插入图片描述

在这里进行高斯模糊,是为了剔除图像中的噪声点,从而提高描述子的准确性,而我们不在提取特征点之前使用高斯模式。是因为高斯模式会对消除图像边缘信息,从而影响我们提取特征点

计算特征点的描述子并且将图像金字塔提取到的特征点坐标都映射到原图像中
在这里插入图片描述

六、 用OpenCV的矫正函数、内参对提取到的特征点进行矫正(UndistortKeyPoints)

因为镜头的原因,我们得到的图像会出现畸变
在这里插入图片描述
在这里插入图片描述

七、 计算去畸变后图像的边界(ComputeImageBounds)

我们的图像会出现畸变,所以要对图像进行矫正,图像去畸形后,原始图像会产生边框 需要重新定位图像的左上角和右下角的位置,重新定位图像的边界

在这里插入图片描述

八、 将特征点分配到图像网格中,后续使用图像网格进行图像匹配(AssignFeaturesToGrid)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43391596/article/details/129692419