KinFu--an open source implementation of KInect Fusion 论文阅读

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uniqueyyc/article/details/82116005

这篇论文是在Kinect Fusion的基础上开源并且是利用PCL实现的版本

Introduction

本文的目标是通过分析Kinect Fusion算法来探索重建真是物体的解决方案,Kinect Fusion可以实时重建和渲染真实世界的场景并实现。本文使用的是Kinect Fusion和PCL库获得的点云来创建的一个3D扫描仪应用程序,。
本文分为四个部分
一、介绍Kinect Fusion算法
二、介绍点云库和KInFu,PCL中包含了Kinect Fusion算法的实现
三、介绍了使用PCL实现的三维扫描算法
四、给出了3D扫描仪应用程序的示例结果

(一)Kinect Fusion

Kinect Fusion是微软研究院在2011年12月份开发的一种算法,该算法可以实现实时重建3D场景,并通过移动微软Kinect传感器在真实场景中进行较为健壮的重建操作。

(1)Kinect Fusion硬件的需求

需要微软的Kinect传感器。
这里写图片描述
Kinect V1:RGB相机(30 FPS 640*480像素)、一个红外投影仪、一个红外传感器、深度像素30 fps 320×240、四个麦克风阵列。
Kinect Fusion工作需要配备CUDA支持的NVIDIA GPU的pc,用于快速并行处理。

(2)算法

  • Kinect返回的输入是深度地图的时间序列。该算法仅使用深度图而不使用颜色信息,光照条件不会干扰。

  • 该算法是实时运行的它使用一个接一个的输入深度帧作为传感器的输入。从当前深度框架中提取表面表示,通过先对新表面进行对齐,然后将新表面与之合并,可以细化全局模型。

  • 该模型是对每一步都在重构和细化的全局曲面的预测。

  1. 表面提取。
    在每一帧中,使用Kinect传感器获得的新的深度图作为输入。深度图是一种像素图像,保持的是深度值,即从相机到3D场景的距离。Kinect通过红外投影仪在场景上发射一种不均匀的红外图案,然后通过红外传感器获得相同的图案,测量其飞行时间(TOF)。Kinect内部的处理器能够将输入的模式与硬编码的图像进行匹配,找到关联关系,从而计算场景中各点的3D位置,构建深度图。
    返回的深度图中必然会有噪声,因此应用双边过滤消除深度图中的噪声,通过邻近平均单个像素的值,由目标像素与相邻像素之间的深度强度差进行加权。结果平滑了深度,保留了尖锐的边缘。
    深度图在进行算法操作之前需要转化成具有顶点和正常信息的三维点云。这是在不同的分层的分辨率下完成的,目标为三层。这也被称为多分辨率金字塔。低分辨率层是通过亚采样获得的。
    深度图通过投影后转换为三维点云。Kinect内部存储的校准矩阵被用来匹配深度像素到实际的3D坐标。每个点的法线是通过两个向量的叉乘来估计的:向量连接选定点和它上面的点,向量连接选定点和它右边的点。由于这些点被安排为深度像素,所以选择点(x, y, z)我们可以选点(x, y+1, z)和(x+1, y, z)来进行正常估计,x和y是图像坐标,z是这些坐标的深度。这个步骤的结果是点云,每个点的顶点和普通数据在三个不同的细节级别。
  2. 对齐,校准。前面步骤获取的点云作为模型。在后面的步骤中,新的点云与模型对齐,然后合并,通过迭代方法生成一个新的、更为精细的模型。使用的是ICP算法(迭代最近点算法)。ICP算法通过估计两个当前点云的匹配程度来工作。可以以不同的方式,更为简单的方式是使用点对点错误:该算法为每个点云搜索最近的第二点云并计算其距离进行搜索。然后,将原始点云与目标点云对齐的转换将最小化所有点对之间的总误差。这个对齐步骤迭代执行,直到找到一个好的匹配。标准的ICP算法有三种不同的终止条件:①迭代次数达到用户施加的最大数量②上次迭代中的对齐转换与当前估计的对其转换之间的差异小于用户强加的值。③欧式平方误差之和小于用户定义的阈值。
    算法为O(N*M*S),N为目标点云中点的个数,M为最近点搜索中考虑的点数,S为迭代次数。
    Kinect Fusion中使用的不是标准ICP算法,因为它的实时速度太慢。相反,它假设当前云和上一个云之间的变化很小。如果算法实时运行(每秒30帧),并且Kinect以缓速在场景中移动,那么这个假设是合理的。然而,如果处理器不能处理速度,ICP算法将失败,新的点云将被丢弃。然后修改后的ICP将两个点云投射到模型的摄像机图帧上,并认为如果两个点落在同一个像素上,它们就是匹配的。这使得算法可以再GPU上并行化。为了进一步加快计算速度,从粗帧开始,在三个分辨率下执行ICP迭代,利用变换的增量性质(由于两个连续帧之间的差异很小)在GPU中计算变换矩阵。因此,改进后的ICP算法复杂度仅为O(S),其中S为迭代步骤数,通过使用多分辨率金字塔使得复杂度保持较小。此外,在两个连续帧之间进行小的更改的假设允许使用ICP,而无需使用其他算法进行初始对齐。在找到匹配后,改进的ICP算法计算匹配点到平面的两个点之间的误差。ICP在一组迭代之后,生成一个6自由度的转换矩阵,它通过旋转和平移将源点云与目标点云对齐。
  3. 表面重建
    一旦找到对齐变换,从而估计摄像机的当前姿态,新的点云可以与当前模型合并。原始深度数据用于合并,而不是过滤后的云,避免丢失细节。这个步骤使用了一个截断符号距离函数(TSDF)。TSDF是新的云计算和模型合并到当前模型,TSDF通过加权平均计算运行新的表面。选择这种方式的原因是通过加权平均可以轻松地合并不同的TSDFs,而且并行化也很容易,这使得能够实现实时性。
    所得的TSDF用于重建当前精细化模型的表面。执行射线强制转换。射线追踪法是计算机图形学中的一种表面可视化方法。它包括选择一个视点,相机的焦点,并从它的场景中投射光线。射线基本上是一条直线,它从零长度的角度出发,沿着选定的方向运动,直到与某物相交。`当光线与一个平面相交时,它在相机图像空间中对应的像素被分配给3D相交点。这使得以输出为中心的投射追踪不同与典型的以对象为中心的可视化方法。射线追踪法通常用于半透明和半透明物体的可视化,因为它很容易通过改变运动光线的方向来进行反射和折射。它也被认为是更好的3D可视化方法之一,从而产生高质量的图像。射线追踪法还可以用于虚拟现实环境中的物理检查,也可以用于3D用户选择等基于距离的计算。在Kinect Fusion算法中,这个表面重建步骤中使用了射线追踪法。射线追踪法是通过与TSDF的零能级集合相交,从全局相机焦点进行的。利用顶点数据和估计的正太数据对当前全局曲面进行了预测。改进的射线追踪模型将在下一个ICP步骤中对齐。而不是仅仅使用最后一个帧点云作为对齐的来源,一个较小的噪声模型被获得,把重点放在寻找一个光滑的表面。这个过程是通过使用光线跳跃来加速的,即通过以离散的步骤推进光线。最后的可视化步骤也使用了光线追踪法。最终的结果是一个3D曲面,表示获得的场景。
    ###(3)Conclusion and notes
    Kinect Fusion凭借其实时和高度并行化,可以轻松实时重建3D场景。然而,它仍然存在一些问题。
    第一,该算法需要较高的计算能力和较强的GPU来工作。
    第二,对于Kinect的运动轨迹也有严格的限制。
    Kinect Fusion算法对于场景中动态对象的存在是很健壮的,这些对象是从点云模型中删除的。就是如果算法迭代的次数足够多,有人可以进入Kinect的视场而不在结果中出现。对于动态存在的鲁棒性是由于TSDFs合并时使用的加权平均运行时间。

##(二)点云库(PCL)
点云库是一个独立的、大规模的、开放的2D/3D图像和点云处理项目。该库是免费提供的。PCL可以有效地利用于点云的高水平工作(以及在较小成都上用于其他3D表示)。库带来的是一组易于使用的高科技模块,允许开发人员关注图像处理的结果,而不是重新从底层开始。这个库被划分为几个单独的库模块,每个模块都有自己的关注点,比如过滤器库或可视化库。这些库允许开发人员执行过滤、特征提取、关键点和模型检测、登记、近邻搜索、细分、表面重建、输入输出处理和可视化。


(三)kinfu

是Kinect Fusion的开源实现,是PCL点云库的一部分。代码编写使用的是C++以及PCL库。Kinect Fusion只能在微软的Kinect上进行工作,而kinfu可以在任何与openni兼容的深度相机上工作。常规的估计步骤是通过特征值估计而不是简单的交叉向量计算。渲染使用一个移动立方体算法来完成的。


(四)3D scanner

1、算法

该算法需要两个点云,点云A与点云B,它们在平面表面上包含放置在不同方向上的目标。由于位于地面的区域(物体的基部)被地面遮挡,多点云被用来重建整个三维物体,多点云被用来重建整个三维物体。该算法分为滤波、对齐和重构三个阶段。
(1)Filtering
首先使用立体像素网格过滤器(voxel grid filter)对A,B两个点云数据进行下采样,以减少云中的点数以进行进一步计算。体素网格过滤器通过将3D场景划分为体素和用质心近似体素中的所有点。这样做的优势在于可以在接下来的步骤中减少计算需求,并获得更结构化的点云,因此可以控制点云的密度。然后使用crop-box滤波器对点云进行裁剪,这是一个在三维空间上的高通滤波器,会将选择的3D框外的点被丢弃。在裁剪阶段,必须特别小心地从场景中提取所需的对象。然而,地面仍然存在于生成的云中,因此我们对云进行分割以删除它。我们定义了一个平面模型,并将随机样本一致性(RANSAC)应用到云上以找到它。RANSAC是在给定一组点的情况下估计模型参数的迭代方法,包含内值(属于模型的点)和外值(不属于模型的点)的输入。该方法通过迭代地选择输入数据的一个随机子集,将模型与之匹配,并保持模型适合大多数的输入数据。在找到定义平面的点后,我们删除它们并获得所需对象的点云表示。在这个阶段,点云仍然拥有噪声。然后执行最后一个过滤阶段,以去除点云中的噪声,使用半径离群值去除方法,它去除在选定的半径范围内没有足够邻近点的点。我们得到的是目标物体的两种无噪声的点云表示,虽然在三维空间中有不同的位置和方向,并且缺少与地面接触的一侧,但是由于地板平面的平移而消失了。
(2)Alignment
过滤完之后,两个点云需要对齐,以便它们可以合并在一起。应该执行一个初步步骤,其中包括通过额外的crop-box过滤器从两个点云中的一个移除一侧。这被认为是获得正确对齐的必要条件。产生的点云被称为“A”。使用抽样一致-初始对齐算法(SAC-IA)执行第一次对齐,该算法执行源点云到目标点云的对齐,其思想类似于RANSAC方法。从输入数据中随机选择一个子点集,因此必须对初始对齐进行细化。
类似于例子,SAC-IA可以被修改,使用点特性而不仅仅是原始点数据。点特征是与点的位置一起编码关于相邻几何区域的附加信息的表示。点特征最简单的例子是在3D位置估计的表面法线1计算输入云的快速点特征直方图(FPFHs),并将这些特征用于SACIA对齐。点特征直方图(PFHs)试图通过考虑点及其领域的估计法线来捕捉点表面曲率的变化,从而产生6个自由度不变特征,能够很好地应对噪声和不同的采样密度。FPFHs与FPFHs很相似,但是为了速度还是牺牲一些准确性的。此处由B得B‘。
然后使用ICP改进对齐方式,使这两种点云几乎完全匹配。采用ICP,以B’为源,以A为目标,得到B”。两种对齐算法的选择取决于:当ICP的输入相对已经足够接近时,ICP的性能很好,而SAC-IA的准确性较低,但对于大的平移和旋转更强。最后,A(不是A’,因为这个阶段使用的点云的所有点)和B”合并为一个云C”。
(3)Reconstruction
表面重建试图从点云中提取网格,有序或无序。
使用贪婪三角剖分算法进行快速重建,它通过链接点来创建多边形,从而将它们转换为顶点。
使用一个移动立方体算法,它与平滑的正常渲染想联系,将产生一个光滑的网格(由kinfu自己使用),或一个光线投射方法类似于Kinect Fusion算法中使用的方法。合并的C是我们想要重新构建一个网格的点云。然而,部分点云会由于输入点云的结构受到干扰,部分点云会很好的配准。如果将贪婪三角剖分算法应用到这片点云上,会得到一个真正锯齿状的网络。采用最小移动平法算法(LSM)对点云进行平滑重构,得到C’。LSM算法允许对点云进行重采样,通过在周围数据点之间进行高阶多项式插值,对表面缺失的部分进行重新采样。输出是对象的3D网格,可以保存为其他软件使用。

2、implement(实现)

IO模块:在输入输出模块中,使用一些方法从.pcd文件加载用于PCL。将结果网络保存到.vtk文件中。
特征:采样常规的估计方法,同时采用对齐相位和重构两种方法,以及特征提取,如快速点Hystogram特征提取实现。
registration:此模块中使用了SACIA和ICP算法的实现。
filters:使用体素网格过滤器、裁剪框过滤器和半径离群值去除方法。
surface:使用MLS和贪婪三角剖分
kdtree:使用树搜索实现,用于注册和三角剖分
可视化:使用PCLVisuallizer类来可视化结果网格

由于PCL开发主干的不完全稳定性,我们想要使用的一些方法没有插入到最终的算法中,如进行立方体表面重构方法。

3、结果

猜你喜欢

转载自blog.csdn.net/uniqueyyc/article/details/82116005