在上一篇博客中, 我介绍了NID-SLAM中的的Robust Direct NID Tracking的实现。这篇继续记录一下文章中 Multi-resolution NID Tracking的部分。
Multi-resolution NID Tracking
文中提到LSD-SLAM中为提高鲁棒性而使用image-pyramid的方法。LSD-SLAM中是对待匹配的原始图像建立图像金字塔。NID-SLAM中作者发现这种方式并没有很好效果。NID-SLAM中采用的是多分辨率直方图的表达。NID-SLAM中建立了一个n-channel 的直方图图像金字塔,第层金字塔图像记为, 第0层直方图每一个channel 是从输入图像计算得来的:
其他层都是通过上一层降采样得来:
表示2x2的临域。
直方图降采样过程如下图所示:
图中中的n层二值图像对应的是直方图的n个bin。论文中这块的做法是对图像进行直方图统计,会统计出n个bins, 对应n段intensity的取值。然后另每一个bin对应一副二值图像,对原始图像的每一个像素计算对应的直方图的bin。然后再该bin对应的二值图像中的对应像素位置置1, 其余位置置0。因此会生成n幅二值图像。然后构建直方图金字塔时降采样是在生成的二值图像上进行。
基于以上金字塔结构,联合概率分布的更新过程:
式中权重函数定义如下:
示意图如下:
这里与之前Direct NID Tracking中的更新过程不太一样。由于这里直方图中的每一个bin对应一幅图像,所以对于参考帧中的采样点坐标,会在所有bin的二值图像中做匹配。因此会涉及到参考帧的所有bin。所以有可能对的任意项更新,即上述更新公式可能对中的个元素更新,而不是n个元素。
这种Coarse-to-fine的tracking方法是在pyramid的每一层上做优化。优化方法还是使用BFGS。上一层优化后的pose,作为下一层的初始pose。
NID Depth Map Update
估计出当前相机的pose之后,直接法一般会采用小基线立体测量的方法,从当前帧图像对关键帧的depth进行校正。对于光度误差法可以针对每个像素利用优化的方法进行校正。但是如果长时间之后,光线、场景表面等发生变化。则光度误差法几乎就不可能再进行校正了。但是利用NID匹配方式,对于环境变化,依然能够起作用。
已知图像的pose, 计算NID中逆深度的梯度:
迭代更新的方法还是使用的BFGS方法,类似之前的更新过程:
计算出一个新的逆深度之后即方差之后,将其与之前的逆深度和方差融合得到最终校正后的逆深度和方差:
其中是Hadamard (element-wise) product, 是加入的误差项,防止逆深度的方差过小。
实际中发现,NID 深度更新对深度初始值和采样点数敏感,因此论文中建议,在中间的更新过程中使用NID.光度误差法对较差的初始深度估计比较鲁棒,所以对于新的关键帧深度初始化更有效。然而论文中作者在初始化时还是直接使用的NID, 没有使用光度误差法。
论文中核心的内容主要就是这些。