简介
在SVO算法中使用深度滤波器估计特征点的3D位置,本篇旨在了解深度滤波器的原理及相关知识点。
1.极线搜索与块匹配
下图为极限搜索的示意图。
1.1极线搜索
已知参考帧(左图)的某个特征点p1,根据相机几何原理p1对应的3D空间点在连接光心O1和p1的射线上的某一处,假设3D点的深度范围是(d_min, +∞)。
同样的该3D点在相邻的当前帧图像上也存在一个投影点p2,p2也是3D点与当前帧光心O2连线的交点。因为3D点的位置是未知的,所以对于(d_min, +∞)范围内所有3D点可能的位置在当前帧的投影会形成一条极线l2,我们知道p2一定在这条极线上,只需要沿着极线进行搜索就可以找到p1在当前帧的匹配点p2。这个过程就是
极限搜索。
1.2 块匹配
按照直接法的思想,可以通过比较极线l2上每个像素点与p1的灰度值,灰度值之差越小是匹配点的可能性就越大。但是如果极线上有很多和p1相似的点,比较单个像素之间的差异可能会出现很大的误匹配,所以就引入了块匹配的概念。即通过比较特征点邻域内的像素块之间的差异来提高区分度,寻找相应的匹配点p2。
1.3 块匹配方法
现在取p1周围的小像素块,假设像素块的大小为
w×w
;并且在极线上也取了很多个小块。不妨把p1周围的小块记成
A∈Rw×w
,把极线上的n个小块记成Bi, i=1,…,n。
(1)SAD(Sum of Absolute Difference)。顾名思义,即取两个小块的差的绝对值之和
(2)SSD(Sum of Squared Distance),即两个像素块灰度值差异的平方和:
(3)NCC(Normalized Cross Correlation)(归一化互相关)。这种方式计算两个小块的相关性。
分子为A矩阵与B矩阵对应元素相乘的和,分母为A矩阵元素平方和与B矩阵元素平方和的平方跟。
同时可以进行去均值化操作,对AB矩阵分别进行去均值操作再使用上述方法,以应对相邻帧之间光线的明暗变化。
2.高斯分布的深度滤波器
现在,我们在极线上,计算了A与每一个Bi的相似性度量。为了方便叙述,假设我们用了NCC,那么,我们将得到一个沿着极线的NCC分布。这个分布的形状严重取决于图像本身的样子。在搜索距离较长的情况下,我们通常会得到一个非凸函数:这个分布存在着许多峰值,然而真实的对应点必定只有一个。在这种情况下,我们会倾向于使用概率分布来描述深度值,而非用某个单一个的数值来描述深度。于是,我们的问题就转到了,在不断对不同图像进行极线搜索时,我们估计的深度分布将发生怎样的变化——这就是所谓的
深度滤波器
。
2.1基于高斯分布的深度滤波器
核心思想是假设特征点的深度值和观测到的深度值(由多帧的三角化得到)均服从高斯概率分布,通过对深度的观测去不断更新特征点深度值的概率分布,当深度的不确定性小于阈值时则认为收敛,此时的深度值即为特征点深度。但是在进行深度估计时要借助于两帧之间的平移,由于单目匹配计算的平移没有真实的尺度信息,因此这时估计出的深度也是没有尺度的。
主要过程:
- 假设所有像素的深度满足某个初始的高斯分布;
- 当新数据产生时,通过极线搜索和块匹配确定投影点位置;
- 根据几何关系计算三角化后的深度以及不确定性;
- 将当前观测融合进上一次的估计中。若收敛则停止计算,否则返回2。
假设某特征点的深度服从均值为μ方差为σ的高斯分布:
P(d) ~ N(μ,σ^2)
当新的数据到来(新的匹配产生),可以根据几何原理得到观测值,假设观测值同样服从概率分布
P(d_obs) ~ N(μ_obs,σ_obs^2)
然后可以使用当前的观测信息更新之前关于特征点的概率分布,根据高斯分布的性质可以进行以下更新:
当融合后的分布不确定性收敛到一定阈值之后,认为此时的估计值为对应特征点的深度。
2.2贺一家对深度滤波器的解释
最基本的深度估计就是三角化,这是多视角几何的基础内容。我们知道通过两帧图像的匹配点就可以计算出这一点的深度值,如果有多幅图像,那就能计算出这一点的多个深度值。这就像对同一个状态变量我们进行了多次测量,因此,可以用贝叶斯估计来对多个测量值进行融合,使得估计的不确定性缩小。如下图所示:
一开始深度估计的不确定性较大(浅绿色部分),通过三角化得到一个深度估计值以后,能够极大的缩小这个不确定性(墨绿色部分)。
3.SVO中深度滤波器的使用
以下内容参考自:
https://zhuanlan.zhihu.com/p/85190014
在这里,先简单介绍下svo中的三角化计算深度的过程,主要是极线搜索确定匹配点。在参考帧Ir中,我们知道了一个特征的图像位置,假设它的深度值在[d_min,d_max]之间,那么根据这两个端点深度值,我们能够计算出他们在当前帧Ik中的位置,如上图中草绿色圆圈中的线段。
确定了特征出现的极线段位置,就可以进行特征搜索匹配了。如果极线段很短,小于两个像素,那直接使用上面求位姿时提到的Feature Alignment光流法就可以比较准确地预测特征位置。
如果极线段很长,那分两步走,第一步在极线段上间隔采样,对采样的多个特征块一一和参考帧中的特征块匹配,用Zero mean Sum of Squared Differences 方法对各采样特征块评分,哪个得分最高,说明他和参考帧中的特征块最匹配。第二步就是在这个得分最高点附近使用Feature Alignment得到次像素精度的特征点位置。像素点位置确定了,就可以三角化计算深度了。
最后,得到一个新的深度估计值以后,就可以用贝叶斯概率模型对深度值更新。
在深度估计的过程中,除了计算深度值外,这个深度值的不确定性也是需要计算的,它在很多地方都会用到,如极线搜索中确定极线的起始位置和长度,如用贝叶斯概率更新深度的过程中用它来确定更新权重(就像卡尔曼滤波中协方差矩阵扮演的角色),如判断这个深度点是否收敛了,如果收敛就插入地图等等。
4.逆深度
在进行极线搜索时,可能会存在多个极值,为了确定真实深度值,通过使用深度的概率分布描述深度值。
(1)逆深度误差可以降低真实世界中较远的深度点造成的误差。比如对于100m和50m处的不同深度点,可能在图像中表现为几个像素的距离,如果使用深度误差的话是50的差距,但是采用逆深度误差只有1/50-1/100=0.01的差距
(2)当采用逆深度时,通过将坐标归一化可以得到逆深度因子以及特征的齐次表达形式,优化变量减少
(3)逆深度的表达形式能够表达更远的点,而且更接近于高斯分布