SLAM_视觉SLAM中的一种单目稠密建图方法
目录
介绍
单目稠密建图
极线搜索与块匹配
块匹配
深度滤波器
常见问题与改进
介绍
由于我们专注于讨论单目相机的稠密地图重建问题,在此情况下我们可以直接利用RGBD图像中的深度信息来生成高密度的空间表示。此外,在大多数视觉 Odometry(VO)算法中已经实现了对稀疏地图的支持,并且这些系统通常不支持用于导航与避障等更高阶的任务。因此,在实际应用中通常会同时构建并维护多层地图信息以满足不同的需求。

单目稠密建图
在单目VO中,我们利用特征描述子匹配与立体几何关系能够得到稀疏地图上的各关键点深度值。为了实现建立稠密地图的目标,则需要对图像中的每一个像素进行深度信息采集。为此第一步便是确定第一幅图像中的某一像素在其他图像中的对应位置。显然我们可以对每个像素逐一分析其对应的坐标信息,并通过提取其特征向量来进行初步定位。然而这一方法虽然直观但存在显著缺陷:每幅图像都需要进行大量特征描述子的匹配计算工作量巨大导致实际应用难度较高因此这种基于暴力搜索的方法难以实施。
针对这个问题,一种比较有效的方法是使用极线搜索 与块匹配 技术。
极线搜索与块匹配
首先,在SLAM中构建图模型时,我们可以利用视觉前端获取运动信息的基础上推导出每一帧图像中的 camera pose(即 camera 的位置与朝向),这也被称为 camera extrinsics. 根据 camera 的内外参数结合关系, 我们能够将该基准帧上的某一点位置进行坐标变换以实现三维空间中的点云重建

我们也可以认为该点被投影到了当前帧上的一条光线(即所谓的极线)。这条光线也被称为视线下落路径(具体细节可参阅对极几何)。因此我们需要寻找的就是位于这条极线上的特定点,在这一特定位置上确定该点位置的方法则被称为极线搜索算法。

通过了解前后帧之间的相对位姿, 我们可以确定...的存在. 然而, 在掌握了点的...之后, 这有助于缩小匹配时的搜索范围.
确定极线的方法有很多,我们在这里介绍一种svosvo中确定极线的方法:
在种子

的深度延长线 上,构造两个三维点

这两个三维点都源自同一个像素;然而它们的深度存在差异,在深度滤波器中通常被设定为此处。

与

,其中

是种子的初始深度 ,

是深度的方差,

可以调节成不同的值,比如

等,一般取3 。
将

利用帧间位姿,投影到当前帧,投影点为

,连接

就是我们所要的极线(此处是一个线段)
块匹配
通常采用块匹配算法来进行极线搜索操作。即,在处理极线图像时,我们对每个极线上选取的特定点进行分析时的具体步骤如下:首先,在该点周围选取一定范围的区域进行采样,并对这些采样数据进行计算处理以确定其与参考基准点之间的相似程度。

在样本中选取一些小面积后,在基准线上也相应选取很多等尺寸的小面积进行对比。对比的方式有很多种,在比较两个样本时主要依据的是它们之间的相似程度。
此处,我们假设对于一个像素点

,我们将其周围的小块记成

,把极线上的每个点的小块记为

。那么,下列方法都可以用来计算小块之间的差异。
*SAD(Sum of Absolute Difference)。计算两组块之间的差异并取其绝对差之和(该值越大则表明两者差异越大;反之,则两组块越相似):

- SSD(Sum of Squared Distance)。即取两个小块的差的平方和 (这个结果越大,说明越不匹配,越接近0,块的相似度越高):

- NCC(Normalized Cross Correlation) 即通过计算两个小块之间的归一化互相关性(该值越大反映出两者的相似程度越高),当其为零则表示两者完全不相关*:

这三种方法通常被视为较为普遍的方法,在实际应用中所采用的方法往往具有更高的复杂性。例如,在具体实施过程中

中使用的是

对

的矩形

计算相似度 ,同时在计算小块差异之前通常会进行一些预处理操作。例如对像进行去均值处理(即减小亮度影响),并基于参考帧和当前帧之间的运动学关系先对该块执行相应的仿射变换再进行匹配过程。
深度滤波器
基于极线搜索和块匹配算法确定了对应点的位置后
自然地建立非线性最小二乘模型,并依赖于非线性优化方法来求解。然而,在处理过程中会对整幅图像的所有像素进行深度估计这一操作会导致计算负担显著增加。因此,在实际操作中通常采用滤波器等方法来更新深度信息。

使用的是卡尔曼滤波器 ,

提出了一种深度滤波器 的方法。有时间会详细介绍这种方法。
常见问题与改进
在图像环境中应用块匹配方法时表现出较高的可靠性,在具体实施过程中需要注意选择合适的参数设置以提高算法效率和精度。例如,在处理具有较大梯度的小块区域时能够更好地进行区分判断,在较为均匀或变化缓慢的区域可能会出现误判情况

在传统深度滤波器的设计中,默认假定图像像素的灰度值服从高斯分布这一前提往往难以成立。实际上,在现实场景中,由于物距存在最小值(相机焦距附近),因此真实场景中的边缘检测结果往往呈现出非对称性特征。例如,在实际应用中,物距越近时边缘检测结果越显著;而当物距增大时边缘检测效果则逐渐减弱。基于此分析,在后续的研究与应用过程中我们通常会采用另一种更为合理的参数化方法——即所谓的倒数映射策略。

改为

)(视差 )为高斯分布,这样会得到更好的结果。
当相机发生旋转时

里的像素坐标逐一映射到当前帧中,这样映射的所有坐标就组成了块

。
由上述介绍可知,在对每个像素进行深度估计的过程中(即在对每个像素进行深度估计的过程中),这些过程彼此之间是完全相同的但彼此之间又是完全独立的操作。因此,在这种情况下我们可以平行地完成这些操作以提高效率和性能,并使整个系统能够更好地适应复杂度较高的场景需求。为了实现这一目标我们建议采用基于GPU编程框架的方法以确保计算效率和性能。”
采用统计滤波方法 对数据中的孤立现象进行识别和剔除。(通过计算每个数据点与其邻近N个数据点之间的距离分布确定偏差较大的数据项并予以排除)
通过应用体素滤波器 来消除这些重叠点 ,从而确保在每个由立体单元格所包围的空间区域内仅保留一个点。由于在重建过程中我们利用了大量图像数据作为基础,在每个由立体单元格所包围的空间区域内仅保留一个点。因此,在每个由立体单元格所包围的空间区域内仅保留一个点。由于在重建过程中我们利用了大量图像数据作为基础,在每个由立体单元格所包围的空间区域内仅保留一个点。由于在重建过程中我们利用了大量图像数据作为基础,在每个由立体单元格所包围的空间区域内仅保留一个点。
参考: 视觉SLAM十四讲
