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值得形式(可能没有准确的零值,但是可以根据正负值插值求出零值点,所以最后物体表面的分辨率将会超过晶格的分辨率)

转:TSDF in Kinect fusion的更多相关文章

  1. Kinect for Windows SDK开发入门(十九):Kinect Fusion

        Kinect for Windows SDK1.7中引入了Kinect Fusion功能.在1.8的SDK中对该功能进行了改进和强化,Kinect Fusion能够使得我们使用Kinect f ...

  2. [译]Kinect for Windows SDK开发入门(十八):Kinect Interaction交互控件

    本文译自 http://dotneteers.net/blogs/vbandi/archive/2013/03/25/kinect-interactions-with-wpf-part-i-getti ...

  3. Kinect for Windows SDK 1.8的改进及新特性

    今年3月, 微软推出了Kinect for Windows SDK 1.7 更新,包括了手势识别 Kinect Interactions 和实时 3D 建模 Kinect Fusion 两项新技术. ...

  4. 【翻译】Kinect v1和Kinect v2的彻底比较

      本连载主要是比较Kinect for Windows的现行版(v1)和次世代型的开发者预览版(v2),以C++开发者为背景介绍进化的硬件和软件.本文主要是对传感的配置和运行条件进行彻底的比较.   ...

  5. (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...

  6. Kinect开发笔记之二Kinect for Windows 2.0新功能

    这是本博客翻译文档的第一篇文章.笔者已经苦逼的竭尽全力的在翻译了.但无奈英语水平也是非常有限.不正确或者不妥当不准确的地方必定会有,还恳请大家留言或者邮件我以批评指正.我会虚心接受. 谢谢大家.   ...

  7. Kinect实现简单的三维重建

    Kinect想必大家已经很熟悉了,最近基于Kinect的创意应用更是呈井喷状态啊!看到很多国外大牛用Kinect做三维重建,其中最著名的要数来自微软研究院的Kinect Fusion了,可以看看下面这 ...

  8. 基于三个kinect的人体建模

       单个kinect的人体重建,在Kinect SDK 1.8中,Kinect Fusion的效果已经很不错了.其缺点显而易见,一是扫描时间长,重建对象也需要长时间保持静态:二是需要人体或者kine ...

  9. Kinect 开发 —— Kinect Interaction 交互控件

    Kinect Interactions 提供了一些新的带有姿势识别的控件如 push-to-press 按钮, grip-to-pan 列表控件, 而且支持多用户,同时二个人进行的交互,这些新添加的控 ...

随机推荐

  1. Educational Codeforces Round 70

    目录 Contest Info Solutions A. You Are Given Two Binary Strings... B. You Are Given a Decimal String.. ...

  2. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...

  3. 1059 Prime Factors(25 分)

    Given any positive integer N, you are supposed to find all of its prime factors, and write them in t ...

  4. Ubuntu14.04系统显示器不自动休眠修改

    -----设置Ubuntu14.04不自动锁屏,常亮 右上角的菜单打开system setting ----- brightness&lock按钮 1. 2. 参考: https://blog ...

  5. [luogu P1527]矩阵乘法(矩形k小)

    传送门 Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Solution 整体二分 练习一波... 就是一堆询问放在一起二分 另外的,第一次发现原来矩 ...

  6. C语言应用--数据类型定制一结构体数组

    结构体定义成功后,其实和c语言内部的类型区别也不大了,自然可以用来定义结构体类型的数组了.我们根据结构体定义的方式不同,分别用多种方式定义结构体数组:

  7. ROS launch 总结

    ROS launch 总结 转自博客:https://www.cnblogs.com/Jessica-jie/p/6961837.html 1 运行Launch文件2 新建Launch文件3  在na ...

  8. 2018-2019-2 网络对抗技术 20165202 Exp7 网络欺诈防范

    博客目录 一.实践目标 二.实践内容 简单应用SET工具建立冒名网站 (1分) ettercap DNS spoof (1分) 结合应用两种技术,用DNS spoof引导特定访问到冒名网站.(1.5分 ...

  9. Uploadifive 上传'fileType'格式如何限制?

    Uploadifive: 'fileType':[ "application/pdf", "application/msword", "applica ...

  10. 使用Flask构建机器学习模型API

    1. Python环境设置和Flask基础 使用"Anaconda"创建一个虚拟环境.如果你需要在Python中创建你的工作流程,并将依赖项分离出来,或者共享环境设置," ...