what is KinectFusion

kinectfusion是微软研究院利用kinect进行三维重建的项目,深入了解该算法及其实现可以为3D重建的kinect类应用提供一定的参考。该项目本身需要比较强大的CUDA显卡支持实现实时重建。
相应的开源版本可以使用KinFu,其下载地址在http://pointclouds.org/downloads/

How KinectFusion Works

KinectFusion重建的基本流程是(according to 《Real-time 3D Reconstruction and interaction Using a Moving Depth Camera》)

  1. Depth Map Conversion
  2. Camera Tracking
  3. Volumetric Integration
  4. Raycasting
    接下来,我们详细地说说这几步

pre-work

在进行下面的处理处理之前,kinectFusion实际还对原始的深度信息进行了一定的降噪平滑,采用双边滤波(Bilateral filtering),在保留边缘的基础上进行平滑,是个可以接受的选择。

Depth Map Conversion

主要是求出有原先的图像点u=(x,y),以及深度值D(u),求得每个点的法向量n(u)。根据相机的内部矩阵,将图像2D坐标转化为相机原点坐标系的3D点。

Camera Tracking

此步骤用ICP(iterative closest point)算法,求解出相机每次的相对位移与转动。相机位置可以用来将相机原点坐标系的结果转化到世界坐标系。
采用的基本算法根据这篇paper的研究《S. Rusinkiewicz and M. Levoy. Efficient variants of the
ICP algorithm. 3D Digital Imaging and Modeling, Int.
Conf. on, 0:145, 2001.》
其cuda算法实现如下
详细的介绍可以参考http://blog.csdn.net/viewcode/article/details/8426846 中关于fasticp的介绍。
每次迭代的基本思路就是:

  1. 筛选:点集或曲面的筛选(滤波)

    • 有全选,随意筛选,均匀分布,特征筛选等多种方法,kinectFusion中使用的应该是最朴素的全选(由于使用了GPU,并行化增加的前提下简单的算法有无可比拟的优势)
  2. 匹配:两个点集之间的点进行配对
    • 注意这并不是要保证匹配的点对是真实的匹配,因为本身ICP是迭代计算出匹配点并将其拟合的收敛过程。我们需要做的是每次选取合适的初始值。
    • KinectFusion采用的是投影关联(projective data association)。简单来说就是用上一个世界坐标系中的点,先转化成上个相机坐标系点 vi−1 v_{i-1}(3D),再转化成上一个图像坐标系点P(2D),然后找到本次图片中同样的2D坐标点,用当前的Ti值和Ri值去计算出点v及其法向量n,最后判断v和n与其对应点的相容性(其实是第4步去除的操作)。这样就完成了一次找匹配点的计算。
  3. 权重:给每个匹配的点对分配权重
  4. 去除:去除不符合条件的点对
  5. 误差度量:基于以上点对,给出每个点对的误差计算方法
  6. 最小化:最小化误差度量

经过上面的一次迭代,我们找到一堆匹配点,并求出其中使得匹配度最优(可以取类似最小二乘的值)的T,然后将本次测量的深度图进行相应的变换来进行下次迭代。

由于采用的是类似连续图像处理的方式,每一帧的深度测量值相差都很接近,这样才能使得算法能够迭代收敛。对每个点用一个GPU线程去处理的方法有效的简化了ICP的过程。

Volumetric Integration

上一环节已经形成了每个相机图像个子的T和R,可以将每一帧采集的数据转化成世界坐标系当中。通过本环节的操作,我们可以形成水密的物体重建,采用TSDF(Truncated Signed Distance Function)的方法。

接下来我们对每一步进行解释,非常通俗易懂且巧妙的算法:

将重建空间进行体素划分,比如划分成 5123 512^3(即长宽高都是512的立方体晶格)。
我们将整个空间的体素全部存入GPU的显存,所以KinectFusion的这种算法对显存的消耗极大,如果不加改造直接用在大场景的重建会有问题。但是显存随着硬件发展在不断增加,同时一些减少显存消耗的算法改进(比如八叉树)能有效减少KinectFusion的显存消耗。
对于(x,y,z)的晶格坐标,每个GPU进程扫描处理一个(x,y)坐标下的晶格柱。

  • 1,2:对于每个x,y坐标下的体元g,并行的从前往后扫描
  • 3:将晶格坐标g转换到对应的世界坐标系点 vg v^g
  • 4: 对于每次TSDF操作时的拍摄变换 Ti T_i反变换到对应的相机坐标系坐标v
  • 5:相机坐标系点v投影到图像坐标点p,从3D到2D
  • 6:如果v在此摄像机的投影范围内,用它修正现有tsdf表示
  • 7: sdfi sdf_i是该相机坐标系点 vg v^g到本次相机原点 ti t_i的距离与本次观测深度 Di(p) D_i(p)的差值
  • 8-11为截断的过程,Truncated的意义所在,用max truncation表示选取的截断范围,此值将会关系到最后重建结果的精细程度
    • 8:如果差值为正,表示该晶格在本次测量的面的后面
    • 9: tsdfi tsdf_i赋值【0,1】之间,越靠近观测面的地方值越接近0
    • 10:如果差值为负,表示该晶格在本次测量的面的前面
    • 11: tsdfi tsdf_i赋值【-1,0】之间,越靠近观测面的地方值越接近0
  • 12:选取本次计算值的tsdf的权值 wi w_i,这个权值的选取直接关系到图片的适应性,以及抗噪声的能力,其实这里有点类似卡尔曼滤波。注意这里每次权值+1的操作基于这样的原因,由于只有在相机拍摄范围内的点才会进入求tsdf的操作,每次的权值在原先的基础上增加1能照顾到迅速变化的或很少扫描到的面的变化。
  • 13:加权平均求出 tsdfavg tsdf^{avg}
  • 14:将 wi w_i和 tsdfavg tsdf^{avg}存储在对应的晶格,进行下个晶格的扫描操作

经过上面的扫描,最终立方体晶格中存储的tsdf值形成了重建物体外是负值,物体内部是正值,物体表面是0值得形式(可能没有准确的零值,但是可以根据正负值插值求出零值点,所以最后物体表面的分辨率将会超过晶格的分辨率)

Raycasting

之前的操作只是形成了 tsdfavg tsdf^{avg}表示的物体的重建结果,要形成我们能见到的图片,还需要相应的渲染和投影,主要算法如下,不做解释了就。

kinect fusion 3D重建基本算法相关推荐

  1. kinect fusion 3D扫描

    原文连接:http://www.zhaochao.net/index.php/2016/01/14/11/ kinect fusion 3D扫描 1.先看3D扫描效果图 2.环境要求 Kinect F ...

  2. 3D重建传统算法对比深度学习,SFU谭平:更需要的是二者的融合

    点击我爱计算机视觉标星,更快获取CVML新技术 机器之心原创 作者:一鸣 近年来,深度学习在计算机视觉的重要领域--三维重建中取得了一系列成果.然而,最近有论文指出,深度学习的 3D 重建表现甚至不如 ...

  3. 2DASL:目前最好的开源人脸3D重建与密集对齐算法

    点击我爱计算机视觉标星或置顶,更快获取CVML新技术 之前52CV曾经报道过PRNet:人脸3D重建与密集对齐,其结果非常惊艳,在很多人脸应用中都有用武之地. 最近同样专注于3D人脸重建与密集对齐的算 ...

  4. 腾讯优图提出LAP无监督多视角人脸3D重建算法,高清还原面部细节

    编辑丨腾讯优图AI开放平台 近日,腾讯优图实验室提出无监督多视角人脸3D重建算法LAP(Learning to Aggregate and Personalize),摆脱人脸3D训练样本真值依赖,高清 ...

  5. 【Let It Be Color!——3D重建之纹理重建】02-基于映射的纹理重建算法(上)

    文章转自:https://bbs.huaweicloud.com/blogs/195742 原文作者:景末 来自:华为云社区 1 引言 在上一篇博文中,我们已经提到过纹理重建的主流方案可以分成基于融合 ...

  6. 3D重建:硬派几何求解vs深度学习打天下?

    点击我爱计算机视觉标星,更快获取CVML新技术 本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载. 机器之心原创 作者:Yuanyuan Li 编辑:Hao Wang ...

  7. opencv三维重建_使用iPhone相机和OpenCV来完成3D重建(第一部分)

    正文字数:1497  阅读时长:2分钟 这个教程将带你使用自己的手机摄像头和图片实现从零开始到点云. Posted by Omar Padiernaurl : https://becominghuma ...

  8. 使用iPhone相机和OpenCV来完成3D重建(第一部分)

    正文字数:1497  阅读时长:2分钟 这个教程将带你使用自己的手机摄像头和图片实现从零开始到点云. Posted by Omar Padierna url : https://becominghum ...

  9. Kinect Fusion三维重建

    2011年开源的KinectFusion,是第一个使用RGBD相机进行实时稠密三维重建的系统(需要GPU,甚至多个GPU),在当时具有重大开创意义,其所用的地图为TSDF地图,对后续稠密地图的发展有着 ...

最新文章

  1. 美国政府牵头6家公司开发新一代超算 与中国竞争
  2. tarjan求LCA模板
  3. asp.net 导出word excel 当前上下文中不存在名称“Encoding”报错问题
  4. php无限评论回复_php如何制作无限级评论功能?
  5. cannot load oci dll,193-navicate连接oracle的解决方法
  6. java 时间戳转换成时间_java 10位时间戳 转成时间
  7. 自动化所在语音识别研究中获进展
  8. 等价划分测试c语言测试三角形,三角形等价划分法测试用例
  9. 中望cad文字显示问号怎么办_如果CAD工程图显示乱码怎么办?
  10. 共轭、转置,共轭转置和逆矩阵的性质
  11. java深度模仿支付宝订单号/交易流水号(高性能,不重复)
  12. 基于cocos-2dx的游戏制作——I wanna save the princess
  13. 培训班H5宣传单怎么做?快进来拿方案~
  14. 移动web开发要点总结
  15. [Unity编辑器] 根据图片自动生成动画
  16. 2017杭州云栖大会展商一览表
  17. Vue中的v-print打印不完全问题
  18. Android网络请求-新大陆物联网云平台请求通信工程-使用Post登录新大陆云平台获取Token-物联网竞赛-物联网数据通信
  19. 软件质量保证与测试基础知识小计
  20. Android录音-SoundTouch移植到Android

热门文章

  1. 助你上手Vue3全家桶之Vue3教程
  2. 某东满3000减2020真的有这个劵么
  3. FastRTPS - eProsima FASTRTPSGEN Manual
  4. 知识图谱架构(Knowledge Graph)
  5. 2021年秋招面经:上海禾赛提前批(FPGA设计)
  6. centos7 安装obs studio
  7. 微信小程序直播 OBS Studio 26.0.2 官方版推流软件
  8. OBS Studio下载速度慢,加速下载!11m/s
  9. 细说社交化经销商服务的十大典型应用场景
  10. Python解决“鸡兔同笼”问题