SLAM10-稠密地图重建

1、要重建稠密地图,就要知道每个像素点的深度,但是之前单目相机要获得深度需要使用三角化,而三角化的前提是要知道像素点在不同图片之间的匹配关系,之前对于特征点的匹配是用的描述子的Hamming距离。但是有的不是特征点的像素点,不知道这个点到下一帧中跑哪去了。当然光流法或者直接法就没有这个问题。极线搜索和块匹配的目的就是找到特定的点在下一帧中的位置。这个目的就是追踪像素点,和光流法和直接法的目的是一样的。
2、极线搜索,类似于计算描述子的Hamming距离,这里计算极线上的像素值的差异。
SLAM10-稠密地图重建_第1张图片
l2是极线,对于任意的像素点p1,直线O1p1在O2的投影就是极线,如果知道点在极线的哪个地方,就可以用几何关系确定深度。
块匹配:不单独匹配点,而是匹配p1所在的小块。在p1周围选定一个小块,然后在极线上面也取同样大小的小块。
如何进行块匹配
假设原则是图像块的灰度不变性。记p1的小块为A, 极线的小块为Bi,有不同的计算方法,SAD(小块差的绝对值之和,进行累加),SSD(差的平方和,进行累加),NCC(归一化互相关。这个有些复杂,列出公式)

NCC:计算A和B 的相关性。0表示不相似,1表示相似SLAM10-稠密地图重建_第2张图片
那么沿着极线搜索下来,得到一个A和B相似性沿着距离的分布,会有很多峰值,真实的对应点只有一个,从而导致p1与p2的匹配是一个概率问题,进而导致了点P的深度也是一个概率问题。
此外,我们倾向使用概率分布来描述深度值,因为在这个时刻的最大峰值位置,在下一时刻由于光照的变化可能就不是最大峰值位置了。
SLAM10-稠密地图重建_第3张图片
对深度的估计,也是一个状态估计问题,就存在滤波器和非线性优化的求解思路。非线性优化效果虽然好,但是比较花费时间,因为前端已经使用了很多时间,为了保证实时性,一般使用滤波器。
滤波器思路
设某一时刻像素的深度满足分布:
在这里插入图片描述
下一时刻新到的数据满足分布:
在这里插入图片描述
那么更新之后的深度分布为:两个正态分布相乘,结果还是正态分布
在这里插入图片描述
如何计算深度分布
假设通过极线搜索或块匹配找到了p1对应的p2,第一次三角化出来的μ,σ就可以作为初始值,然后每次新三角化出一个三维点,就获得了μobs,σobs,然后用公式更新深度值的分布。
μ,或者μobs实际上就是每次我们新三角化出来的深度值
σ,或者σobs2,就是下面提到的 不确定度。
SLAM10-稠密地图重建_第4张图片
根据图片上的几何关系:
向量a = 向量p - t (向量)

α = arccos

β = arccos

对p2扰动一个像素的误差,将会使β 变为β’,根据几何关系有
β’=arccos
γ=π-α -β
根据正弦定理,p’可以求得
||p’||=||t||*sinβ’/sinγ
不确定度:σobs=||p||-||p’||

深度滤波器的现实意义就是不断缩小这个不确定度。缩小不确定度是通过如下方式进行的:不断求出三维点的坐标,更新这个分布,直到这个分布的不确定性σ小于你希望的阈值,就认为是收敛了,收敛以后的均值,就不再改动了,当做是你确定下来的深度值。

极线搜索和块匹配的像素梯度问题:当像素在极线搜索方向,有明显梯度时,具有较好的区分性,而如果梯度不明显,就得不到明显区分。
深度滤波器的逆深度:逆深度是深度的倒数,提逆深度的原因是研究和仿真发现,深度的分布可能不是高斯分布,但是深度的倒数比较接近高斯分布。
图像之间的变换:为了防止相机在运动时,导致拍摄到的图像之间的变换过大,比如相机发生了光心旋转,导致之前下黑上白的图像在旋转运动之后变成了下白上黑,从而导致极线搜索匹配的时候相关性会受到影响,因此在块匹配的时候,要考虑参考帧和当前帧的运动。
对同一个三维点世界坐标Pw,投影到两个帧上(一个用R表示一个用C表示),构建参考帧Pr和当前帧Pc像素的转换公式:
在这里插入图片描述
根据dR和PR,求出PC。之后,如果PR有增量,PC的增量就也能算出来了,构成仿射变换:
SLAM10-稠密地图重建_第5张图片
当前帧的像素经过仿射变换进行变换以后,再进行块匹配,就不受颠倒的影响了。
稠密地图-八叉树地图
在点云地图中,虽然有三维结构,但是地图通常规模很大,而且无法处理空间中的运动物体。可以看到八叉树地图把大的空间块向下进一步切割成8个子节点。
SLAM10-稠密地图重建_第6张图片
最大的好处是节省内存空间(当某个方块中的所有子节点都被占据或者都没被占据,就不用展开这个节点,也就不用再单独存储每个节点的信息)
对于每个节点的内容,我们使用概率值表示某个节点是否被占据。例如使用浮点数x在[0,1]区间,初始x为0.5,当不断观察到节点被占据,x就不断增加,如果后面没有观察到,就把x不断减小,这样就可以动态的描述地图信息。但是x不断增加可能会大于1,所以使用对数变换:y=log(x/(1-x))来替换x。
所以现在是当不断观察到节点被占据,x就不断增加到无穷大,y越来越接近1,对应的概率是x=exp(y)/(exp(y)+1)
当我们看到地图中某个节点有占据信息的时候就可以确定,相机光心出发到这个点的线段上,应该是没有物体的。
TSDF地图:每个小块存储距其最近的物体表面的距离,另外没有颜色信息只使用深度图:
SLAM10-稠密地图重建_第7张图片
代码1:单目稠密重建:无人机采集的俯视图数据集REMODE,200张,每张图片都有真实位姿
https://blog.csdn.net/Summer_star_summer/article/details/107482744
代码2 RGB-D稠密地图
https://blog.csdn.net/Summer_star_summer/article/details/107488829
代码3 通过点云计算点云法线,通过法线建立网格地图
https://blog.csdn.net/Summer_star_summer/article/details/107489868
代码4:搭建八叉树地图,降低点云数量,同时描述运动物体
https://blog.csdn.net/Summer_star_summer/article/details/107490522

你可能感兴趣的:(SLAM10-稠密地图重建)