视觉SLAM笔记(61) 单目稠密建图


1. 立体视觉

相机,很久以来被认为是只有角度的传感器(Bearing only)
单个图像中的像素,只能提供物体与相机成像平面的角度以及物体采集到的亮度
而无法提供物体的距离(Range)

而在稠密重建,需要知道每一个像素点(或大部分像素点)的距离
那么大致上有以下几种解决方案:

  1. 使用单目相机,利用移动相机之后进行三角化,测量像素的距离
  2. 使用双目相机,利用左右目的视差计算像素的距离(多目原理相同)
  3. 使用 RGB-D 相机直接获得像素距离

前两种方式称为立体视觉(Stereo Vision),其中移动单目的又称为移动视角的立体视觉(Moving View Stereo)
相比于 RGB-D 直接测量的深度,单目和双目对深度的获取往往是“费力不讨好”的
需要花费大量的计算,最后得到一些不怎么可靠的深度估计

当然, RGB-D 也有一些量程、应用范围和光照的限制
不过相比于单目和双目的结果,使用 RGB-D 进行稠密重建往往是更常见的选择

而单目双目的好处,是在目前 RGB-D还无法很好应用的室外、大场景场合中
仍能通过立体视觉估计深度信息

从最简单的情况开始说起:
在给定相机轨迹的基础上,如何根据一段时间的视频序列,来估计某张图像的深度
换言之,不考虑 SLAM,先来考虑稍为简单的建图问题

假定有某一段视频序列,通过某种手段得到了每一帧对应的轨迹(当然也很可能是由视觉里程计前端估计所得)
现在以第一张图像为参考帧,计算参考帧中每一个像素的深度(或者说距离)
首先,请回忆在 视觉SLAM笔记(30) 特征点法 是如何完成该过程的:

  1. 首先,对图像提取特征,并根据描述子计算了特征之间的匹配
    换言之,通过特征,对某一个空间点进行了跟踪,知道了它在各个图像之间的位置
  2. 然后,由于无法仅用一张图像确定特征点的位置
    所以必须通过不同视角下的观测,估计它的深度,原理即前面的 视觉SLAM笔记(34) 三角测量

那么,在稠密深度图估计中,不同之处在于,无法把每个像素都当作特征点,计算描述子
因此,稠密深度估计问题中,匹配就成为很重要的一环:
这需要用到 极线搜索块匹配技术确定第一张图的某像素,出现在其他图里的位置

然后,当知道了某个像素在各个图中的位置,就能像特征点那样,利用三角测量确定它的深度
不过不同的是,在这里要使用很多次三角测量让深度估计收敛,而不仅是一次
希望深度估计,能够随着测量的增加,从一个非常不确定的量,逐渐收敛到一个稳定值
这就是 深度滤波器技术


2. 极线搜索与块匹配

在这里插入图片描述

先来探讨不同视角下观察同一个点,产生的几何关系
左边的相机观测到了某个像素 p1
由于这是一个单目相机,无从知道它的深度
所以假设这个深度可能在某个区域之内,不妨说是某最小值到无穷远之间: (dmin,+∞)
因此,该像素对应的空间点就分布在某条线段上

在另一个视角(右侧相机)看来,这条线段的投影也形成图像平面上的一条线,这称为极线
当知道两个相机间的运动时,这条极线也是能够确定的
那么问题就是:极线上的哪一个点,是刚才看到的 p1 点呢?

重复一遍,在特征点方法中,通过特征匹配找到了 p2 的位置
然而现在没有描述子,所以只能在极线上搜索和 p1 长的比较相似的点
再具体地说,可能沿着第二张图像中的极线的某一头,走到另一头,逐个儿比较每个像素与 p1 的相似程度

从直接比较像素的角度上来看,这种做法倒是和 视觉SLAM笔记(43) 直接法 的直接法是异曲同工的
在直接法的讨论中也知道,比较单个像素的亮度值并不一定稳定可靠
一件很明显的事情就是:
万一极线上有很多和 p1 相似的点,怎么确定哪一个是真实的呢?
这似乎回到了在回环检测当中说到的问题:如何确定两个图像(或两个点)的相似性?
回环检测是通过词袋来解决的,但这里由于没有特征,所以只好寻求另外的途径

一种直观的想法是:
既然单个像素的亮度没有区分性,那是否可以比较像素块呢?
在 p1 周围取一个大小为 w × w 的小块,然后在极线上也取很多同样大小的小块进行比较,就可以一定程度上提高区分性
这就是所谓的块匹配

注意到在这个过程中,只有假设在不同图像间整个小块的灰度值不变,这种比较才有意义
所以算法的假设,从像素的灰度不变性,变成了图像块的灰度不变性——在一定程度上变得更强了

现在取了 p1 周围的小块,并且在极线上也取了很多个小块
不妨把 p1 周围的小块记成 A \in Rw×w,把极线上的 n 个小块记成 Bi, i = 1,……, n
那么,如何计算小块与小块间的差异呢?
存在若干种不同的计算方法:

  1. SAD(Sum of Absolute Difference),即取两个小块的差的绝对值之和:
    在这里插入图片描述

  2. SSD(Sum of Squared Distance),平方和:
    在这里插入图片描述

  3. NCC(Normalized Cross Correlation)(归一化互相关),它计算的是两个小块的相关性:
    在这里插入图片描述

请注意,由于这里用的是相关性
所以相关性接近 0 表示两个图像不相似,而接近 1才表示相似
前面两种距离则是反过来的,接近 0 表示相似,而大的数值表示不相似

和遇到过的许多情形一样,这些计算方式往往存在一个精度——效率之间的矛盾
精度好的方法往往需要复杂的计算,而简单的快速算法又往往效果不佳
这需要在实际工程中进行取舍

另外,除了这些简单版本之外,可以先把每个小块的均值去掉,称为去均值的 SSD、去均值的 NCC 等等
去掉均值之后,允许像“小块 B 比 A 整体上亮一些,但仍然很相似”这样的情况
因此比之前的更加可靠一些

现在,在极线上,计算了 A 与每一个 Bi 的相似性度量
为了方便叙述,假设用了 NCC,那么,将得到一个沿着极线的 NCC 分布
这个分布的形状严重取决于图像本身的样子
在这里插入图片描述
在搜索距离较长的情况下,通常会得到一个非凸函数:
这个分布存在着许多峰值,然而真实的对应点必定只有一个
在这种情况下,会倾向于使用概率分布来描述深度值,而非用某个单一个的数值来描述深度
于是,问题就转到了,在不断对不同图像进行极线搜索时
估计的深度分布将发生怎样的变化——这就是所谓的深度滤波器


3. 高斯分布的深度滤波器

对像素点深度的估计,本身亦可建模为一个状态估计问题
于是就自然存在滤波器与非线性优化两种求解思路

虽然非线性优化效果较好,但是在 SLAM 这种实时性要求较强的场合
考虑到前端已经占据了不少的计算量,建图方面则通常采用计算量较少的滤波器方式了

对深度的分布假设存在着若干种不同的做法
首先,在比较简单的假设条件下,可以假设深度值服从高斯分布,得到一种类卡尔曼式的方法
而另一方面,采用了均匀——高斯混合分布的假设,推导了另一种形式更为复杂的深度滤波器

本着简单易用的原则,先来介绍并演示高斯分布假设下的深度滤波器
设某个像素点的深度 d 服从:
在这里插入图片描述
而每当新的数据到来,都会观测到它的深度
同样的,假设这次观测亦是一个高斯分布:
在这里插入图片描述
于是问题是,如何使用观测的信息,更新原先 d 的分布
这正是一个信息融合问题
需要了解的是两个高斯分布的乘积依然是一个高斯分布
设融合后的 d 的分布为 N( µ µ fuse, σ σ 2fuse ),那么根据高斯分布的乘积,有:
在这里插入图片描述
由于仅有观测方程而没有运动方程
所以这里深度仅用到了信息融合部分,而无须像完整的卡尔曼那样进行预测和更新
可以看到融合的方程确实比较浅显易懂

不过问题仍然存在:如何确定我们观测到深度的分布呢?
即,如何计算 µ µ obs, σ σ obs 呢?

关于 µ µ obs, σ σ obs,亦存在一些不同的处理方式
暂时只考虑由几何关系带来的不确定性
现在,假设通过极线搜索和块匹配,确定了参考帧某个像素在当前帧的投影位置
那么,这个位置对深度的不确定性有多大呢

在这里插入图片描述
考虑某次极线搜索,找到了 p1 对应的 p2 点,从而观测到了 p1 的深度值,认为 p1 对应的三维点为 P
从而,可记 O1P 为 p, O1O2 为相机的平移 t,O2P 记为 a
并且,把这个三角形的下面两个角记作 α, β
现在,考虑极线 l2 上存在着一个像素大小的误差,使得 β 角变成了 β′,而 p 也变成了 p′,并记上面那个角为 γ
要问的是,这一个像素的误差,会导致 p′ 与 p 产生多大的差距
来列写这个量之间的几何关系,显然有:
在这里插入图片描述
对 p2 扰动一个像素,将使得 β 产生一个变化量 δβ,由于相机焦距为 f,于是:
在这里插入图片描述
所以
在这里插入图片描述
于是,由正弦定理, p′ 的大小可以求得:
在这里插入图片描述
由此,确定了由单个像素的不确定引起的深度不确定性

如果认为极线搜索的块匹配仅有一个像素的误差
那么就可以设:
在这里插入图片描述
当然,如果极线搜索的不确定性大于一个像素,亦可按照此推导来放大这个不确定性
按下来的深度数据融合
在实际工程中,当不确定性小于一定阈值之后,就可以认为深度数据已经收敛了

综上所述,给出了估计稠密深度的一个完整的过程:

  1. 假设所有像素的深度满足某个初始的高斯分布
  2. 当新数据产生时,通过极线搜索和块匹配确定投影点位置
  3. 根据几何关系计算三角化后的深度以及不确定性
  4. 将当前观测融合进上一次的估计中,若收敛则停止计算,否则返回 2

参考:

《视觉SLAM十四讲》


相关推荐:

视觉SLAM笔记(60) 建图
视觉SLAM笔记(59) 相似度计算
视觉SLAM笔记(58) 字典
视觉SLAM笔记(57) 回环检测
视觉SLAM笔记(56) 位姿图优化


谢谢!

发布了217 篇原创文章 · 获赞 290 · 访问量 288万+

猜你喜欢

转载自blog.csdn.net/qq_32618327/article/details/103210529