KinectFusion仅用Kinect的深度信息来追踪相机的3D姿态,实时重建室内场景的3D模型。本文详细描述了KinectFusion的功能和新提出的基于GPU的流水线。这个核心GPU流水线的扩展表明了能够在不降低相机追踪和重建的精确度的情况下,直接在相机前进行物体分割和用户交互。
Kinect生成实时的实物场景的离散测量点深度图,这些测量值可以被投影到一系列离散3D点(点云)。Kinect的噪声会引起深度测量值波动,使深度图中包含没有读到的“空洞”。
为了达到实时重建高质量3D模型的效果,系统持续追踪相机的6D自由度,实时地把摄像得到的深度数据融合成一整个全局3D模型。随着相机移动,新拍摄到的物理场景融合到同一模型中,重建模型随着新的深度测量值加入而得到细节的完善,空洞被填补,模型也变得完善。重建的模型还可以运用Kinect的RGB相机进行纹理贴图。
法线贴图:在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,若在特定位置上应用光源,可以让细节程度较低的表面生成高细节程度的精确光照方向和反射效果。
KinectFusion支持先重建出整个场景,再通过移动想要分离的物体,精确地将其分离出来。
GPU实现:
主流水线包括4个阶段:
1.Depth Map Conversion:把实时深度图从二维图像坐标转化到相机坐标空间的3D顶点(vertices)和法线。
2.Camera Tracking(ICP):在追踪阶段,用ICP算法的GPU实现,计算六维刚体变换,使每个当前有向点都与前一帧对应点紧密配准。所有相关变换都累积应用于一个单一变换,这个单一变换定义了Kinect的全局姿态。
3.Volumetric Integration:应用基于[5]的体积表面表示方法,给出相机的全局姿态,有向点就能转化到全局坐标系,单个的3D体素网格被更新。每个体素存储一个持续更新的由它到假定实物表面位置的平均距离。
4.Raycasting(3D Rendering):为了渲染给用户,整体被光线投射以提取隐式表面的视图。若给出相机的全局姿态,这个体光线投射视图就等同于一个合成深度图,这个合成深度图可用作下一次ICP迭代的全局一致的低噪参考帧。这使得我们能通过把当前实时深度图和模型的低噪光线投射视图进行配准来实现追踪。
以上每一步都是在GPU上使用CUDA并行执行的。
1. Depth Map Conversion
在时刻i,每个CUDA线程并行地操作输入深度图Di(u)中一个单独的像素u=(x,y)。给定Kinect相机内部校准矩阵K后,每个GPU线程把一个深度测量值投影变换为相机坐标空间中的一个3D顶点:vi(u)=Di(u)K-1[u,1]。这样就并行地算出了一个顶点图Vi。
每个顶点对应的法向量由使用每个GPU线程使用相邻投影点计算出来:ni(u)=(vi(x+1,y)-vi(x,y))×(vi(x,y+1)-vi(x,y))(标准化到单位长度ni/||ni||)。这样就并行地计算出了一个法线图Ni。
在时刻i的6自由度(6DOF)相机姿态是一个刚体变换矩阵Ti=[Ri|ti],其中Ri是一个3