本讲是最后一讲!讲了不同地图的表示方法=-=
一、概述
前面所讲的地图都是特征点的集合,也就是稀疏地图,实际上还有各种地图,面向各种任务:
- 稀疏地图:定位
- 稠密地图:导航、避障、重建
- 语义地图:交互
二、单目稠密重建
1. 立体视觉
要进行稠密重建,就要知道每一个像素的深度,其方法是:
- 单目:三角化
- 多目:视差
- 深度:直接
对于单目,需要使用参考帧,和它移动一小段后的当前帧,对其中的匹配点三角化。但这个过程中,匹配是很耗时的。对于所有像素来说,都做一遍匹配是不现实的。
因此问题转化为:如何进行快速的匹配?
2.极限搜索与快匹配
其方法是,对于参考帧ref,其像素
p
1
p_1
p1可能存在于
p
1
p_1
p1与光心连线的任一点。投影到当前帧curr就是极线。因此,可以在极线上搜索和
p
1
p_1
p1比较相似得点。
逐像素对比不够稳定,因此选择使用块匹配,即对比邻域内的所有像素。
其量化方法有SAD、SSD、NCC等。
3.高斯分布的深度滤波器
对像素点的深度估计,看成一个状态估计问题。注意,对一个深度是要进行多次三角化确保收敛的。
深度滤波器,是用概率分布描述深度值,在每一张新的图像来临时,用三角化后得到的值,更新深度值的概率分布和不确定性。
问题转化为:如何更新这个高斯分布。
在假设高斯分布的情况下,即维护其均值和协方差。设当前深度的高斯分布是
N
o
b
s
N_obs
Nobs,更新后是
N
f
u
s
e
N_fuse
Nfuse,根据高斯分布的成乘积,得到其更新公式(P326)。
接下来的问题是,如何得到当前帧的分布。
书上给出了几何推倒,意思是当存在一个扰动时,它对深度的影响有多大。这个影响值就是不确定性。
4. 流程
- 假设所有像素的深度满足某个初识高斯分布,初始化深度矩阵和协方差矩阵。
- 对于每一帧图像,确通过极线搜索和快匹配确定ref中每个像素在curr上的投影点位置。
- 对于每对ref的像素和对于curr的投影点,使用三角化计算深度,使用集合方法计算其不确定性。
- 使用高斯分布公式,将当前帧的概率分布融合进总的概率分布(深度矩阵和协方差矩阵)中。
- 检查收敛。
5、存在的问题
5.1.纹理问题
立体视觉中,对纹理依赖性强。若纹理(光滑,纯色,亮度均匀)的地方,难以检测。
5.2.像素梯度问题
像素梯度垂直于极线方向,能够精准匹配,存在最高点。
像素梯度平行于极线方向,无法匹配,处处相等,无最大值。
因此,像素梯度与极线夹角越大(接近垂直),不确定性越小。
5.3. 逆深度
使用深度的倒数,而非深度,为高斯分布。避免计算表示困难(极大、极小的特殊深度值)。
5.4. 图像间的变化
主要是预先进行旋转的变换处理。
使用给一个增量,计算变换关系的方法。
5.5. 其他
可GPU并行。
加正则项,使深度平滑。
处理外点,考虑块匹配时错误匹配的情况。
三、 RGBD稠密建图
可直接获得地图。
点云地图:初级,信息少,存储量大,存在冗余,无法处理运动物体。
还有网格地图、surfel、voxel等地图。
八叉树地图
把空间不断八等分,建立八叉树。
其节省体积之处在于:避免了没必要的存储,如都是空的位置,不必存储的十分精细,都有信息的位置,就按粗的分辨率存储。
因此当某个节点的所有子节点都被占据或都不被占据时,这个节点就不展开
并且,每个节点存储的信息,也可以动态建模,使用logit变换,描述其是否被占据。