top of page
作家相片Lingheng Tao

CG Paper #2 KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera

已更新:10月31日


本篇 Paper 分享是来自于 Izadi1 et al. 的《KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera》。


KinectFusion 是一种能够让用户拿着 Kinect 摄像机然后快速重建室内场景的技术。这篇 Paper 主要介绍的是微软团队如何开发这个技术,使得深度相机可以用于制作高精度 3D 场景重建。


KinectFusion


这个系统允许用户通过移动 Kinect 摄像头,在室内场景中进行 3D 扫描,并且实时生成一个几何精确的三维模型。系统通过持续追踪摄像头的六自由度(6DOF)位置,将每个视角的深度数据融合到一个全局 3D模型中,逐步增加细节并填补模型中的空洞。系统通过多视角重建提升了图像的分辨率,即便在原始深度数据中含有噪声和不完整信息,这一过程类似于图像超分辨率技术。


低成本手持扫描


文中反复强调 Kinect 摄像头本身是很低成本的,KinectFusion 的移动性和实时性使其成为一种低成本的对象扫描工具。用户可以快速从不同角度捕捉物体,并即时在屏幕上查看反馈。生成的3D模型可用于 CAD 或 3D 打印。


直接互动以单独分割出物体


用户可以直接通过移动物体来分割出场景中的特定对象(比如如果用户只想扫描桌上的一个茶杯而不是整个场景)。系统实时监测模型的变化,如果检测到较大变化,就会将其标记并分割出移动的对象。


能感知出几何的增强现实


KinectFusion 支持几何感知的增强现实功能,虚拟物体可以直接覆盖在3D模型上,并与真实环境精确对齐。这包括虚拟物体的遮挡处理和反射真实场景的细节,使虚拟物体和真实世界更自然地融合在一起。


此外,系统采用光线追踪来生成物体的阴影、反射等效果,使虚拟与真实物体在渲染上融合得更自然。例如,虚拟物体可以在书桌等复杂几何表面上精确投影阴影和反射周围的真实环境。


要知道遮挡处理对于 AR 来说是重中之重,能不能妥善处理虚拟物体和真实物体的遮挡决定了虚拟物体的可信度。


物理模拟


通过物理模拟,KinectFusion 支持虚拟物体在3D模型上进行动态交互。系统可以在重建模型的同时进行刚体碰撞模拟,实现真实感的物理交互,例如成千上万个粒子可以实时与场景模型交互。


进入场景


KinectFusion 进一步扩展了用户在3D场景中直接进行物理交互的能力。


传统的3D重建会假设场景是静止的,但此系统允许用户的手或其他物体动态地进入摄像头视野,并且不会破坏整体的摄像头追踪效果。为了实现这一点,系统在前景和背景之间实现了分割,通过动态调整前景物体和背景模型的相对位置来保证摄像头的稳定追踪。这种分割和追踪技术使用户能够与虚拟场景中的物理对象直接交互,例如手指可以在模型表面进行触控操作。


GPU 实现


主要的系统管线由以下四个阶段组成:深度图转换 → 相机追踪 → 体积积分 → 光线投射。每个阶段都在 GPU 上以 CUDA 进行编程。


深度图转换


文中对于使用 CUDA 进行深度图转换的算法描述如上。


这一阶段将实时深度图从图像坐标转换为三维点(文中称为 vertex)和相机坐标空间中的法线。每个像素对应的深度数据被投影为三维点,这样就得到了一个并行计算的顶点图和法线图。Kinect 的内参矩阵用于将深度数据重新投影到三维空间中。


相机追踪


该阶段通过一个 GPU 实现的最近点迭代(ICP)算法计算摄像头的六自由度变换,使当前帧的点与上一帧对齐。这种相对变换会逐步应用于一个全局变换矩阵,从而定义 Kinect 的全局位置。每个 GPU 线程基于投影数据关联方法找到当前帧和上一帧之间的点对应关系,并在平行计算中测试点与法线的距离和角度是否在预设阈值内,以排除异常点。ICP 的输出是一组最小化点到面误差的变换矩阵。


显然,这种密集追踪方法计算量巨大,仅在 GPU 实现的情况下可行。


体积表达和积分


在这一阶段,系统使用体素(voxel)网格来实现表面重建,而不是简单地融合点云或创建网格。每个体素存储到物理表面的距离值,通过截断符号距离函数(TSDF)进行存储。

更新体素网格的过程基于每个体素与相机之间的距离,并将测量的深度数据融入网格的全局坐标系中。


系统在 GPU 上分配了一个完整的 3D 体素网格,并将其作为线性内存来存储。尽管这种方法在内存上并不高效(例如,一个分辨率为 512^3 的体素网格需要 512MB 内存),但它在速度上具有优势。由于内存对齐,每个 GPU 线程可以通过 合并存取访问内存,从而提升了内存访问的吞吐量。算法采用投影方式将深度数据整合到体素网格中,通过更新体积中的 TSDF(截断符号距离函数)值,系统能够以实时速度更新体素网格(例如在 512^3 分辨率下仅需 2ms),并将 Kinect 深度图中的连续表面估计离散化到体素网格中。这种方法相比于层级化技术实现更简单,在现代 GPU 内存支持下,可以扩展到整个房间的建模。


光线投射


系统使用基于光线投射的方法从体素网格中提取隐式表面,并生成供用户查看的视图。每个 GPU 线程沿着一条光线遍历体素网格,当检测到符号值变为零的位置时,计算出表面交点和法线,以支持光照渲染。

该阶段的渲染还会将虚拟几何与体素网格的真实几何进行遮挡处理,使虚拟物体与真实场景在视觉上无缝融合,并提供额外的阴影和反射效果。


物理模拟


论文同时也描述了 KinectFusion 如何通过 GPU 扩展来支持虚拟物体和重建场景之间的物理碰撞模拟,使虚拟物体与真实物体的交互更具物理真实性。具体实现包括以下内容:


  1. 粒子模拟:在 GPU 上实现了基于粒子的物理模拟。场景中的几何结构由一组静态粒子表示,每个静态粒子对应一个表面体素。这些粒子是相同大小的球体,尽管它们是静止的,但可以与动态模拟的粒子发生碰撞。尽管这是一个近似模型,但它能在实时状态下模拟体素体积的每个表面位置,甚至可以细致到书的边缘或茶壶把手等复杂形状。

  2. 静态粒子的创建:静态粒子是在体素整合阶段生成的。当体积被扫描时,距离表面的 TSDF 值接近零的位置会被提取,定义为“零层”。对于每个表面体素,系统会实例化一个静态粒子,每个粒子包含一个 3D 顶点(在全局坐标系中)和一个 ID。

  3. 碰撞检测:碰撞检测是该模拟的关键挑战。为此,系统使用了一个空间上划分均匀的网格来识别相邻的粒子,并为每个粒子分配一个唯一的网格单元 ID。动态和静态粒子会按网格单元排序,以便通过 GPU 实现快速的邻居检测。每个动态粒子在模拟步骤中会检查邻居单元中的粒子,以检测并处理碰撞。

  4. 碰撞处理和速度更新:在碰撞处理中,系统使用离散元法(DEM)来计算碰撞后的速度向量。每个粒子的全局速度会根据邻近碰撞、重力和边界条件的影响进行更新,最后在每个模拟步骤中根据累计的速度重新定位粒子。


 

参考资料:

11 次查看0 則留言

Comments


bottom of page