转:TSDF in Kinect fusion

KinectFusion中用到的TSDF Fusion

原po:https://blog.csdn.net/qq_31785865/article/details/78524429

最近在看关于稠密三维重建的相关算法,看到了KinectFusion,KinectFusion是微软研究院研发的基于Kinect实现的稠密三维重建项目。采用GPU加速的KinectFusion可以实时的实现稠密三维重建。流程步骤如下图所示:

 


 

  1. Depth Map Conversion:读入的深度图像转换为三维点云,计算每一个点云的法向量;
  2. Camera Tracking(map-to-frame):通过上一次对map中点云对上一帧的投影,用ICP对当前帧进行匹配求解位姿;
  3. Volumetric Integration:根据步骤2的位姿,将当前帧的点云融合到网格模型中去,这里用了TSDF
  4. Raycasting :根据当前帧相机位姿将模型中的点云投影到当前帧并且计算其法向量,用来在步骤2中对下一帧的输入图像配准。

    这里重点学习了一下TSDF 
    TSDF(Truncated Signed Distance Function)的作用是将点云的深度估计值和深度相机的测量值进行融合,提高深度估计的精度,改善地图效果。流程如下图所示: 
    这里写图片描述

将重建空间进行体素划分,如下图 


 

我们将整个空间的体素全部存入GPU运算,每个线程处理一条(x,y)。即对于(x,y,z)的晶格坐标,每个GPU进程扫描处理一个(x,y)坐标下的晶格柱。

    1. 1,2:对于每个x,y坐标下的体元g,并行的从前往后扫描
    2. 将晶格坐标g转换到对应的世界坐标系点vg
    3. 对于每次TSDF操作时的拍摄变换Ti反变换到对应的相机坐标系坐标v
    4. 相机坐标系点v投影到图像坐标点p,从3D到2D
    5. 如果v在此摄像机的投影范围内,用它修正现有tsdf表示
    6. sdfi是该相机坐标系点vg到本次相机原点ti的距离与本次观测深度Di(p)的差值
    7. 8-11为截断的过程,Truncated的意义所在,用max truncation表示选取的截断范围,此值将会关系到最后重建结果的精细程度
    8. 如果差值为正,表示该晶格在本次测量的面的后面
    9. tsdfi赋值【0,1】之间,越靠近观测面的地方值越接近0
    10. 如果差值为负,表示该晶格在本次测量的面的前面
    11. tsdfi赋值【-1,0】之间,越靠近观测面的地方值越接近0
    12. 选取本次计算值的tsdf的权值wi,这个权值的选取直接关系到图片的适应性,以及抗噪声的能力,其实这里有点类似卡尔曼滤波。注意这里每次权值+1的操作基于这样的原因,由于只有在相机拍摄范围内的点才会进入求tsdf的操作,每次的权值在原先的基础上增加1能照顾到迅速变化的或很少扫描到的面的变化。
    13. 加权平均求出tsdfavg
    14. 将wi和tsdfavg存储在对应的晶格,进行下个晶格的扫描操作 
      经过上面的扫描,最终立方体晶格中存储的tsdf值形成了重建物体外是负值,物体内部是正值,物体表面是0值得形式(可能没有准确的零值,但是可以根据正负值插值求出零值点,所以最后物体表面的分辨率将会超过晶格的分辨率)
posted @ 2018-05-17 17:34  Bamboo123  阅读(770)  评论(0编辑  收藏  举报