SVO深度解析(三)之深度滤波(建图部分)


转载请说明出处ide

http://blog.csdn.net/zhubaohua_bupt/article/details/74911000函数


3.1深度滤波简介

SVO在建图部分采用的是深度滤波器,论文中并无详细的介绍。深度滤波在SVO做者写的另外一篇叫REMODE[1]的文章里,介绍了深度滤波的每个步骤。REMODE[1]这篇文章讲的是利用svo提供的位姿,进行三维重建,属于渐进式三维重建。其过程和SVO深度滤波同样,只不过在REMODE里,实现用GPU进行了加速处理。优化


SVO深度滤波是利用一系列先后,完成对指定帧上像素深度的求取。用一些列帧,来求取指定帧上每一个像素深度的缘由是,在计算像素点深度时,单次匹配恢复的深度有偏差,须要依靠屡次深度测量值的融合,来恢复偏差较小的深度值。SVO把像素的深度偏差模型看作几率分布,有两个属性,一个是深度值服从高斯分布,另外一个是局外点的几率服从Beta分布,同时融合这两种属性。spa


SVO深度滤波对深度进行渐进式融合(动态融合)。其过程可表述以下:.net

关键帧上选取像素点(SVO是fast角点,REMODE是梯度点),做为种子(seed,种子就是深度未收敛的像素点),每来一帧图像,融合更新一下以前提取的种子,直至种子的深度收敛,这是个动态过程,相似于滤波,大概这就是叫深度滤波的缘由吧。若是新的一帧是关键帧,那么再次提取新的像素点做为种子。blog

就这样旧的种子不断收敛,新的种子不断增长,不断进行下去。ip

 

下面来探讨一下深度滤波的整个过程。pip


3.2 深度滤波分步骤详细介绍


对于一个种子,其每一次深度滤波(也叫深度融合,利用新的一帧来更新种子的深度值),都行须要经如下过程。io




3.2.1 计算极线


关于极线的基本知识,本文不作介绍。对于每一个种子,在当前帧计算极线的条件是:ast

<1>已知种子所在帧与当前帧的相对位姿

<2>已知种子的初始深度


条件<1>的做用是用来作匹配,由VO提供。

条件<2>的做用是缩小找匹配的搜索量。当种子新提取时,这个时候尚未深度值,用场景平均深度初始。


本文用z表示种子的深度,sigma2表示深度方差,sigma表示深度标准差。

极线的计算方法以下:


step1:

   在深度延长线上,构造两个三维点P1,P2,这两个三维点来源同一个像素,惟一的不一样就是深度,

分别为 P1(x,y,z- n*sigma),P2(x,y,z+ n*sigma),这里n能够调节,通常选择n=1,2,3(3sigma原则)。


Step2:

将P1,P2利用帧间位姿,投影至当前帧,投影点为u1,u2,链接u1,u2就是咱们所要计算的极线。

SVO工程里,实如今Matcher.cpp里的findEpipolarMatchDirect()函数里。


 

REMODE工程里,实如今epipolar.cpp seedEpipolarMatchKernel()函数里。



 

3.2.2 计算仿射矩阵


为何要计算仿射矩阵?

咱们知道,同一张图像在通过旋转平移后,同一个场景在图像上的成像位置就发生了变换。

在像素作匹配时,咱们须要用像素周围的信息(通常是矩形窗口)来描述本像素的特征。

设想一下,若是帧间图像发生了旋转,咱们还用一样的窗口(当前帧的窗口坐标和种子所在帧窗口坐标同样)

来描述搜索点,是否是不太合适?

 



如上图,描述p的窗口w1在后帧上投影点为p’,咱们在匹配p和p’时,是用蓝色窗口来描述p’呢,仍是用红色窗口

答案确定是红色窗口,那既然是红窗口,红色窗口怎么计算呢?


这就会用到仿射矩阵,SVO仿射矩阵是这样的计算的。

计算窗口的思路是先利用三点法计算出tk和tn两时刻图像的仿射变换矩阵,

而后再把窗口w1里的像素坐标逐一映射到图像tn里,这样映射的全部坐标就组成了窗口w2。

实现代码

 


3.2.3 搜索匹配


跟踪部分的匹配,是靠特征对齐完成的,不须要极线搜索,这是由于在深度和位姿都比较准确的状况下,

用特征对齐能够完成匹配。


可是,深度估计却不能这样干,它须要极线搜索,由于深度未知或者深度不肯定性太大。

SVO选用ZMSSD,经过8*8矩形patch来描述像素,用于计算种子和当前帧搜索点的类似性。

实际上,在svo搜索匹配过程当中,当计算的极线小于两个像素时,直接采用图像对齐,

由于这个时候深度不肯定较小(能够经过极线的计算方式想一下为何)。

不然,沿极线以一个像素为步进单位搜索匹配。代码在findEpipolarMatchDirect()里,



3.2.4三角测量恢复深度以及匹配不肯定性的计算


通过搜索匹配后,可以获得种子p以及种子p在当前帧上的匹配像素点p’,

经过三角测量,就能够恢复种字p的深度。

原理能够参考 http://blog.csdn.net/zhubaohua_bupt/article/details/74926111

实现部分:

 


屡次三角测量的深度是为了,融合获得种子较准确的深。那么既然有融合,不一样测量值确定有不一样权重。

不肯定性就是用来计算权重的。在SVO中,深度的不肯定被认为是,

在匹配时,误匹配一个像素所带来的最大深度偏差。

 

其计算很简单,能够直接看论文。


3.2.5 深度融合


SVO的融合是不断利用最新时刻深度的观测值,来融合上一时刻深度最优值,直至深度收敛。以下图

 

深度数据具体融合过程的过程以下,



3.2.6 平滑去噪


这一步在SVO里没有,在REMODE里,做者加上这一步骤,对深度图有不错的去噪平滑效果,以下图。


 


这个就不细说了,由于这一步骤自己与SVO无关,有兴趣的话能够看一下论文[1],做者经过构造一个能量函数,

而后迭代优化能量函数,当能量函数最小时,就完成平滑去噪。


 至此,咱们探讨了SVO整个深度滤波。


REMODE论文:

[1] MatiaPizzoli,Christian Forster, and Davide Scaramuzza. REMODE: Probabilistic,monocular densereconstruction in real time. In International Conference onRobotics andAutomation (ICRA), pages 2609–2616, Hong Kong,China, June 2014.



待续

相关文章
相关标签/搜索