1、RGB-D 重建的开山之作,首次实现实时稠密的三维重建
2、通过融合序列图像重建三维重建,如果显卡满足要求重建的帧率可以跟得上 Kinect 相机的帧率(30Hz)。
3、通过当前帧和模型投影获取的图像之间计算位姿,相当于通过当前帧和上一帧之间计算位姿要更加准确。
在已知相机内参情况下,将 Kinect 获取到的深度图像转换成点云。
根据相邻像素点求得每个点的法向量。
转换之后的带有法向量的点云如 a) 图所示
采用 ICP 算法计算两帧之间位姿,因为这里是实时的三维重建,相邻两帧之间位姿变化很小,R 矩阵可以做线性化,加速求解效率,关于KinectFusion 中的 ICP 算法和 GPU 实现后续的博客会给介绍。
KinectFusion 算法采用 frame-to-model 的形式而不是采用 frame-to-frame 的形式计算两帧位姿,作者论文里也验证了采用 frame-to-model 的形式重建要更加准确。frame-to-model 指在已知相机的 pose 情况下,重建好的模型点云投影到相平面上得到的点云,和下一帧输入图像配准。frame-to-frame 指当前帧点云和上一帧点云配准计算位姿。
Kinect 深度相机获取的数据是有噪声,而且对于一些场景扫描出来的会有孔洞(没有深度的值的区域),三维模型需要消除传感器的噪声和孔洞的影响。
KinectFusion 中采用 TSDF 模型进行深度数据的融合,示意图如下:
TSDF 模型将整个待重建的三维空间划分成网格,每个网格中存储了数值,如下:
网格模型中值的大小代表网格离重建好的表面的距离,如上图表示的是重建的一个人的脸(红线表示重建的表面,示意图给出的二维信息,实际是三维的),重建好的表面到相机一侧都是正值,另一侧都是负值,网格点离重建好的表面距离越远绝对值越大,在网格模型中从正到负的穿越点表示重建好的场景的表面。
TSDF 模型隐含表示了重建好的表面。
KinectFusion 采用 ICP 算法计算相机的位姿,在计算得到相机位姿之后,这里说明是如何进行点云融合的。
KinectFusion 采用 GPU 更新网格中的值,GPU 的每个线程处理如上图所示的一个蓝条,相当于每个线程处理一个 (x,y) 坐标上的网格。对于每个网格点,从网格模型坐标系(全局坐标系)转到相机坐标系,再根据相机的内参投影到相平面上。
将网格单元从全局坐标系转到相机坐标系: v=T−1ivg
再从相机坐标系投影到相平面上: (u,v)=Av
按照如下进行更新:
根据当前帧位姿,将当前帧的点云融合到网格模型中之后,再用光线投影算法计算在当前视角下可以看到的场景的表面,用来对下一帧的输入图像进行配准,计算下一帧输入图像的位姿。
采用光线投影算法计算得到的点云,再计算其法向量,用带法向量的点云和下一帧的输入图像配准,计算下一帧输入图像的位姿。如此是个循环的过程。
1、”KinectFusion: Real-Time 3D Reconstruction and Interaction Using a MovingDepth Camera”
2、”KinectFusion: Real-Time Dense Surface Mapping and Tracking”