本文结合原始论文[1][2]和笔者实际项目经验,对KinectFusion[1]算法做一个介绍。如有错误,欢迎评论指正。
一.简介
KinecFusion
算法核心在于维护一个场景的TSDF volume
(如图1所示,volume
可以想象为一个空间包围盒,由多个voxel
(体素)组成,其中包含了我们想要重建的场景),通过把当前视角下拍摄的局部场景的点云和颜色不断融合进该volume
内,完成对场景的各视角覆盖和补全,最后从中提取网格及颜色即完成了三维重建。
图1.tsdf volume
示意
二.具体步骤
图2.KinectFusion
算法流程
1.Measurement
Measurement
模块用于对彩色图和深度图进行预处理,并进一步将深度图转化为点云、计算点云法线。
-
去畸变、彩色图和深度图配准
有些相机彩色图和深度图需要自己对齐,或者处于算法速度考虑需要自己手写对齐 -
对输入的深度图像计算图像金字塔
不计算金字塔也可以,直接在原始图像上就行 -
对金字塔的每一层图像进行双边滤波
-
对金字塔的每一层深度图计算顶点图
式1中,为相机内参,为像素点,为在处的深度,为在处计算的三维点坐标。
-
对金字塔的每一层顶点图计算法向图:领域点算叉乘,当然要保证法线朝外
式2.点云法线计算
式2中,表示对向量做归一化,即向量除以向量的模,为在处计算的三维点法线。
注:
-
1)笔者实际项目中一般是通过直接由像素点构建三角面片信息,然后用叉乘计算法