KinectFusion 论文解析

地位和特点

1、RGB-D 重建的开山之作,首次实现实时稠密的三维重建
2、通过融合序列图像重建三维重建,如果显卡满足要求重建的帧率可以跟得上 Kinect 相机的帧率(30Hz)。
3、通过当前帧和模型投影获取的图像之间计算位姿,相当于通过当前帧和上一帧之间计算位姿要更加准确。

重建流程图


KinectFusion 论文解析_第1张图片

重建流程如上图所示:
a) 读入的深度图像转换为三维点云并且计算每一点的法向量;
b) 计算得到的带有法向量的点云和上一帧光线投影算法得到的点云配准用 ICP 算法计算位姿;
c) 根据计算得到的位姿,将当前帧的点云融合到网格模型中去;
d) 光线投影算法计算当前视角下的点云,并且计算其法向量用来对下一帧输入图像配准。
如此是个循环的过程,通过移动相机获取场景不同视角下的点云,重建完整的场景表面。

Depth Map Conversion (深度数据转化)

在已知相机内参情况下,将 Kinect 获取到的深度图像转换成点云。
根据相邻像素点求得每个点的法向量。
转换之后的带有法向量的点云如 a) 图所示

Camera Tracking (相机跟踪)

采用 ICP 算法计算两帧之间位姿,因为这里是实时的三维重建,相邻两帧之间位姿变化很小,R 矩阵可以做线性化,加速求解效率,关于KinectFusion 中的 ICP 算法和 GPU 实现后续的博客会给介绍

KinectFusion 算法采用 frame-to-model 的形式而不是采用 frame-to-frame 的形式计算两帧位姿,作者论文里也验证了采用 frame-to-model 的形式重建要更加准确。frame-to-model 指在已知相机的 pose 情况下,重建好的模型点云投影到相平面上得到的点云,和下一帧输入图像配准。frame-to-frame 指当前帧点云和上一帧点云配准计算位姿。

Volumetric Representation (深度数据融合)

Kinect 深度相机获取的数据是有噪声,而且对于一些场景扫描出来的会有孔洞(没有深度的值的区域),三维模型需要消除传感器的噪声和孔洞的影响。

KinectFusion 中采用 TSDF 模型进行深度数据的融合,示意图如下:



TSDF 模型将整个待重建的三维空间划分成网格,每个网格中存储了数值,如下:


KinectFusion 论文解析_第2张图片

网格模型中值的大小代表网格离重建好的表面的距离,如上图表示的是重建的一个人的脸(红线表示重建的表面,示意图给出的二维信息,实际是三维的),重建好的表面到相机一侧都是正值,另一侧都是负值,网格点离重建好的表面距离越远绝对值越大,在网格模型中从正到负的穿越点表示重建好的场景的表面。

TSDF 模型隐含表示了重建好的表面。

KinectFusion 采用 ICP 算法计算相机的位姿,在计算得到相机位姿之后,这里说明是如何进行点云融合的。



KinectFusion 采用 GPU 更新网格中的值,GPU 的每个线程处理如上图所示的一个蓝条,相当于每个线程处理一个 (x,y) 坐标上的网格。对于每个网格点,从网格模型坐标系(全局坐标系)转到相机坐标系,再根据相机的内参投影到相平面上。

将网格单元从全局坐标系转到相机坐标系: v=T1ivg
再从相机坐标系投影到相平面上: (u,v)=Av
按照如下进行更新:

sdfi||tivg||Di(u v)if(sdfi>0) then    tsdfimin(1,  sdfi/max_truncation)else    tsdfimax(1,  sdfi/max_truncation)wimin(max)tsdfavgtsdfi1wi1+tsdfiwiwi1+wi

ti :表示相机光心在全局坐标系下坐标。
vg :表示网格点在全局坐标系坐标
||tivg| :表示网格点到光心的距离,应该是 z 向距离
Di(u,v) :表示像素位置 (u,v) 下相机测量到的深度值
tsdfavg :表示网格中存储的值,不断进行加权融合的
直观上理解:当相机测量到的深度之和网格到光心的距离近似相等时,更新网格加权融合时,加权的值越小,说明网格在测量到场景的表面周围。

Raycasting (光线投影)

根据当前帧位姿,将当前帧的点云融合到网格模型中之后,再用光线投影算法计算在当前视角下可以看到的场景的表面,用来对下一帧的输入图像进行配准,计算下一帧输入图像的位姿。




如图:从光心出发,穿过像素点在网格模型中从正到负的穿越点,就表示在当前像素点处可以看到的重建好的场景的表面;对于每个像素点,分别做类似的投影,就可以计算得到的在每个像素点处的点云。
光线投影算法在实际计算的时候,也是用 GPU 并行计算,GPU 的单个线程处理单个的像素点。

采用光线投影算法计算得到的点云,再计算其法向量,用带法向量的点云和下一帧的输入图像配准,计算下一帧输入图像的位姿。如此是个循环的过程。

参考文献

1、”KinectFusion: Real-Time 3D Reconstruction and Interaction Using a MovingDepth Camera”
2、”KinectFusion: Real-Time Dense Surface Mapping and Tracking”

你可能感兴趣的:(GPU,kinect,实时三维重建)