![20217de7f9c5789e433a3fa99e772efa.png](https://i-blog.csdnimg.cn/blog_migrate/d18e52298a31644c8bf76e4caa7dd54a.jpeg)
Reference
- Semi-Dense Visual Odometry for a Monocular Camera. LSD-SLAM深度滤波的论文
- https://www.zybuluo.com/lancelot-vim/note/412293 讲解LSD-SLAM中深度滤波的博客
- https://blog.csdn.net/kokerf/article/details/78006703 也是一篇讲解LSD-SLAM中深度滤波的博客
- REMODE: Probabilistic, Monocular Dense Reconstruction in Real Time. SVO采用的深度滤波的论文
- Supplementary matterial Parametric approximation to posterior. SVO的补充材料,推到了高斯--均匀模型到高斯--Beta分布的推导过程
- https://www.cnblogs.com/ilekoaiq/p/8228324.html. 比较详细的推导了高斯--均匀模型
- 视觉SLAM十四讲. 第十三章对逆深度基于高斯分布的融合进行了讲解
- https://blog.csdn.net/qq_18343569/article/details/49003993 讲解一些像素匹配算法
- https://towardsdatascience.com/beta-distribution-intuition-examples-and-derivation-cf00f4db57af Beta分布的参考
本文会比较长,因为本身这部分就比较复杂,笔者自身加入了自己的一些思考和理解,不对的地方请及时指出,一同进步。
一切的开始——简单的深度滤波
这部分主要参考高博的slam十四讲
我们都知道,SLAM中建图是一个很重要的部分,SLAM进行位姿推断也是基于之前建立的地图(即三维空间的坐标点)进行的,目前最流行的方法通常是直接根据两帧或者多帧图像看到同一个特征点,之后对这个特征点直接三角化作为一个初值,之后在后续的优化问题中不断的对这个坐标点进行优化或者剔除;这样的做的优点就是简单、易行,但是缺点也比较明显,如果某个时刻点的生成出现了问题,那么对于系统的稳定性可能是灾难性的;基于此,另一种方法进入人们的视野——深度滤波。
我个人觉得深度滤波其实更偏向于一个后端的技术,前端得到相对正确的位姿,后端根据位姿进行深度值不断的迭代更新,使得深度值收敛到一个稳定的值。
常规来说,深度滤波都会使用以下几个步骤:
- 根据两帧的位姿计算当前帧上的极线搜索范围;
- 在要搜算的极线段上通过对比算法获得最佳的匹配位置;
- 通过得到的最佳匹配点计算深度值;
- 把该深度值作为观测进行滤波器的迭代;
一种较为简单的方法就是把高斯分布
下面根据上面的几个步骤分解一下该深度滤波方法:
第一步:根据位姿计算当前帧上的极线搜索范围
该步骤用图表示为如下形式:
![575627bd2e798e821effa027803febe1.png](https://i-blog.csdnimg.cn/blog_migrate/26f0f5abb6a322795e2c0797000ba531.jpeg)
从图中可以看到,在运用深度滤波的时候:
- 通常已经通过前端得到了相对稳定的位姿,记为
和
;
- 当前深度滤波得到的深度值为
,标准差为
,此时可以得到一个可能的深度范围,记为
;
- 将可能的深度范围映射到当前帧上,就可以得到极线上的搜索范围;
第二步:在极线搜索段上找到最佳的匹配点
经过上一步之后就可以在当前帧上得到一个大概的搜算范围,算法会认为真实深度所对应的投影点就在这个搜算范围内,这里得到对应投影点的方法并不会使用基于特征的匹配方法(运算量比较大),而是采用基于像素块的匹配方法,具体的做法如下:
- 从搜算范围的一端一个步长一个步长的向另一端移动;
- 每在极线方向上移动一步(步长通常设为
),就将当前帧的
窗口内的像素值与参考帧的窗口内的像素值进行比较,得到一个分数用来表征两者是否相似,最后取最相似的那个位置作为匹配点;
其中相似的方法参考Reference中的【5】.
但是这个过程中必然伴随着误匹配(特征点法也无法避免这样的情况!),也就是一个搜索范围内很多地方满足要求,十四讲中给出下面的图,可以看到在整个搜索范围内有较多的点都是峰值,虽然下图中有一个最大值,但是其实这个最大值也不一定就是真正的对应匹配:
![2d8d09b1057e008c9641b8f84c192a04.png](https://i-blog.csdnimg.cn/blog_migrate/05523401e65f959fcc3befc3daaa3244.jpeg)
在LSD-SLAM中也给出一个例子表示这样的情况,可以看到,基线越小(两个图像间的移动越小),搜索的时候最小值是唯一的,但是不确定性会很大(后面会说为什么),也就是方差会很大;相反,较大的基线,搜索的时候会有较多的最小值,但是不确定性会很小;这也是深度滤波存在的一个重要的理由之一:
![56d48b872c024c4018f5f9b64fbb8860.png](https://i-blog.csdnimg.cn/blog_migrate/5054da742a2b9117adfb35fdc7b3bcb3.jpeg)
这部分稍微再拓展一下,因为在整个深度滤波中,好的匹配会加快整个滤波的收敛过程,所以SVO在这方面引入了一个仿射矩阵来更好的对比两个像素块,其实在上图中可以看到,reference图像的像素块假设是一个标准的正方形,那到了后面的帧中,这个正方形很可能就可能变作了一个平行四边形,在多视图几何中,这样的变化在2D到2D平面通常被建模成仿射变换,公式如下:
有了公式(1)之后,可以在Reference图像中取三个点,分别设为
![5dc3e7688eccf40c5e91f4341903b447.png](https://i-blog.csdnimg.cn/blog_migrate/16294f1d5e9f141ffe814475fa8f2a64.jpeg)
于是可以得到以下关系:
于是我们可以通过
于是我们就可以得到A矩阵的第一列了,同样的方法应用到