1.建图
我们所谓的地图,即所有路标点的集合。一旦我们确定了路标点的位置,那就可以说我们完成了建图。
地图的作用:(1)定位 ;(2)导航; (3)避障; (4)重建; (5)交互
2. 稠密重建
单个图像中的像素,只能提供物体与相机成像平面的角 度以及物体采集到的亮度,而无法提供物体的距离(Range)。而在稠密重建,我们需要知道每一个像素点(或大部分像素点)的距离,大致上有以下几种解决方案:
1. 使用单目相机,利用移动相机之后进行三角化,测量像素的距离。
2. 使用双目相机,利用左右目的视差计算像素的距离(多目原理相同)。
3. 使用 RGB-D 相机直接获得像素距离。
使用 RGB-D 进行稠密重建往往是更常见的选择。而单目双目的好处,是在目前 RGB-D 还无法很好应用的室外、大场景场合中,仍能通过立体视觉估计深度信息。
3. 单目稠密重建
稠密深度估计问题中,匹配是很重要的一环:如何确定第一张图的某像素,出现在其他图里的位置,需要用到极线搜索和块匹配技术。
3.1.极线搜索与块匹配
极线搜索的示意图
在特征点法中,通过特征匹配得到p2的位置,然而实际没有描述子,只能在极线上搜索和p1想的比较相似的点。(可能沿着极线一直走比较每个像素与p1的相似程度。)这就是极线搜索。
单个像素的亮度没有区分性,由此我们想到可以比较像素块,我们在 p1 周围取一个大小为 w×w 的小块,然后在极线上也取很多同样大小的小块进行比较,就可以一定程度上提高区分性。这就是所谓的块匹配。
计算小块与小块间的差异,有不同的计算方法:
1. SAD(Sum of Absolute Difference)。顾名思义,即取两个小块的差的绝对值之和:
2. SSD。SSD 并不是说大家喜欢的固态硬盘,而是 Sum of Squared Distance(SSD)(平 方和)的意思:
3. NCC(Normalized Cross Correlation)(归一化互相关)。这种方式比前两者要复杂一些,它计算的是两个小块的相关性:
请注意,由于这里用的是相关性,所以相关性接近 0 表示两个图像不相似,而接近 1 才表示相似。前面两种距离则是反过来的,接近 0 表示相似,而大的数值表示不相似。
在极线上,计算了 A 与每一个 Bi 的相似性yo度量。为了方便叙述,假设我们用了 NCC,那么,我们将得到一个沿着极线的 NCC 分布。这个分布的形状严重取决于 图像本身的样子,例如图 13-3 那样。在搜索距离较长的情况下,我们通常会得到一个非凸 函数:这个分布存在着许多峰值,然而真实的对应点必定只有一个。在这种情况下,我们 会倾向于使用概率分布来描述深度值,而非用某个单一个的数值来描述深度。于是,我们 的问题就转到了,在不断对不同图像进行极线搜索时,我们估计的深度分布将发生怎样的 变化——这就是所谓的深度滤波器。
3.2. 高斯分布的深度滤波器
稠密深度的完整过程
1. 假设所有像素的深度满足某个初始的高斯分布;
2. 当新数据产生时,通过极线搜索和块匹配确定投影点位置;
3. 根据几何关系计算三角化后的深度以及不确定性;
4. 将当前观测融合进上一次的估计中。若收敛则停止计算,否则返回 2。
最后深度图趋于稳定
像素梯度
逆深度
4. RGB-D稠密建图
点云地图(Point_Cloud Map)
1. 在生成每帧点云时,去掉深度值太大或无效的点。
2. 利用统计滤波器方法去除孤立点。该滤波器统计每个点与它最近 N 个点的距离值的 分布,去除距离均值过大的点。这样,我们保留了那些“粘在一起”的点,去掉了孤 立的噪声点。
3. 最后,利用体素滤波器(Voxel Filter)进行降采样。由于多个视角存在视野重叠,在 重叠区域会存在大量的位置十分相近的点。这会无益地占用许多内存空间。体素滤波 保证在某个一定大小的立方体(或称体素)内仅有一个点,相当于对三维空间进行了 降采样,从而节省了很多存储空间。
三角网格(Mesh),面片(Surfel)
通过体素(Voxel)建立占据网格地图(Occupancy Map)
SFM 泊松重建
八叉树地图(Octo-Map)
将三维空间建模为很多小方块(体素),每个面切成两片分割为8块。一直重复达到建模的最高精度。
对于本文的所有实践,可参考《视觉SLAM十四讲》建图部分,这里就不加以叙述了。