KinectFusion系统思路

还是为了更好地理解infiniTAM,所以来看看KinectFusion这篇文章,下面就开始吧。

总体思路

KinectFusion系统思路_第1张图片
kinect Fusion整体由四个模块组成:

1.Surface measurement:这个模块是整个系统的预处理阶段,在这个阶段,根据相机获取的原始深度图像计算带法向量的3D点云;
2.sensor pose estimation传感器位姿估计:将(1)中计算的到的带有法向量的点云,和通过光线投影法从利用上一帧图像位姿从模型投影出来的点云进行ICP配准,从而计算当前帧的位姿,这也是经常提到的(frame-to-model);
3.Surface reconstruction update表面重建更新:依据计算到的当前帧位姿,将当前帧的点云融合到网格模型当中;
4.Surface prediction表面预测:根据当前帧的位姿,利用光线投影法从模型进行投影,得到当前帧相机视角下能够观察到的点云,并计算其法向量,等下一帧图像来临时,在(2)中与其进行配准。
通过这个步骤进行循环,从而不断更新网格模型中的数值,从而实现三维重建的目的。
下面对这四个步骤进行阐述:

1.Surface measurement

记从相机获得的第k帧深度图像为 Rk,记u=[uv]T 是Rk上的某个像素的坐标,那么 Rk(u) 为第 k 帧深度图的第 (u,v) 像素的深度。
在这个步骤中,作者采用双边滤波器对Rk进行处理,得到处理后的深度图像Dk。
K是相机的内参矩阵,u*是u的齐次坐标。利用Dk通过计算可以得到该帧对应的3D点云集合Vk。
在这里插入图片描述
然后通过Vk计算对应像素点的法向量Nk(u):
在这里插入图片描述
但是深度相机的工作原理一般都是主动发射红外光,如果探测的材质可以吸收红外光,则无法探测到有效的深度数据,在加上深度相机的探测范围一般都很有限,一旦超出探测范围也无法有效的探测到目标的深度信息。因此作者设置了一个掩码矩阵Mk用来标识Rk的对应位置是否具有有效数据,若有Mk(u)=1,反之为0。
到这里,预处理步骤的工作就完成了,通过这一步得到了当前帧的三维点云Vk和对应点的法向量Nk,在下一步中供投影法的ICP使用。

2.sensor pose estimation

在做相机位姿估计的时候,采用的是ICP算法。传统的ICP算法实现的是3D点和3D点之间的匹配,借助若干3D点对之间的关系,利用高斯牛顿之类的方法进行求解。但是传统的ICP算法,需要对匹配的点云进行遍历,算法复杂度较高,很难做到实时。这篇文章中,作者利用的是投影法ICP。
投影法示意图
KinectFusion系统思路_第2张图片
投影法的假设是两帧图像之间的位姿变换较小,对于一副深度图对应点云的三维坐标点Pi,可以计算在另一幅图像中的投影像素坐标:
在这里插入图片描述
Pi:深度图对应点云的三维坐标
Tji:从图像i到图像j的变换矩阵
K:内参矩阵
(ud,vd):pi在图像j中的投影像素坐标。
对于图像i中的点Pi,在图像j像素位置(ud,vd)周围寻找三维坐标值和法向量相近的点作为匹配点。
在ICP匹配中,KniectFusion采用的是frame-to-model(通过当前帧计算三维点云,和根据上一帧位姿从模型投影获得的深度图像转换的到的点云进行配准)而不是frame-to-frame(当前帧深度图像计算的点云,和上一帧深度图像计算的点云),作者在文章中解释说frame-to-model比frame-to-frame更精确。

3.Surface reconstruction update

KinectFusion中采用TSDF模型进行深度数据的融合,他的作用是将点云的深度估计值和深度相机的测量值进行融合,提高深度估计的精度,改善地图效果。TSDF的流程图如下:
KinectFusion系统思路_第3张图片
将准备重建的空间进行体素划分,如下图:
KinectFusion系统思路_第4张图片
将整个空间的体素全部存入GPU运算,每个线程处理一条(x,y)。
1.对于x,y坐标下的体元g,并行的从前往后扫描
2.将晶格坐标g转换到对应的世界坐标系点Vg
3.依据位姿估计的结果,将Vg变换到当前帧的相机坐标系下的坐标V
4.相机坐标的三维坐标点V投影到像素坐标点p
5.sdf是该相机坐标系点V到本次相机光心ti的距离与本次观测深度DI(p)的差值
6.如果差值为正,表示该晶格在本次重建表面的后面,TSDF赋值在[0,1]之间,越靠近观测面的地方值越接近0
7.如果差值为负,表示该晶格在本次重建表面的前面,TSDF在[-1,0]之间,越接近观测面越接近0。
8.加权求出TSDFavg
9.将权重Wi和TSDFavg存入对应的晶格,进行下一个晶格的扫描。

在进行加权求TSDFavg时,如果sdf>0,tsdfi<—min(1,sdfi/max truncation),如果sdf<0,tsdfi<—max(-1,sdfi/min truncation)
权重wi<-----min(max weight,wi-1+1)

经过上面的扫描,最终网格模型中存储的tsdf值形成了重建表面外为负值,重建表面内为正值,重建表面为0的形式。可能体素中存储的没有准确的零值,但是可以通过插值的方法得到。

4.Surface prediction

根据当前帧位姿,将当前帧的对应的三维点云融合到网格模型中,再用光线投影计算(raycasting)在当前视角下可以看到的场景的表面,用来对下一帧的输入图像进行配准,计算下一帧相机的位姿。
从光心出发,穿过像素点在网格模型中的穿越点,就表示当前像素点处可以看到的重建好的场景的表面。对于每个像素点进行计算,就可以得到在每个像素点处的点云。在计算得到点云之后,在计算其法向量,得到带法向量的点云就可以用作下一帧的ICP配准了。
在光线投影法进行计算的时候也是采用了GPU,GPU的一个线程计算一个像素点。

以上就是kniectFusion的基本思想,这篇博客借鉴了泡泡机器人付老师的博客,在这里提出感谢。

你可能感兴趣的:(KinectFusion系统思路)