1、介绍
该CGAL组件实现了一种曲面重建方法,该方法将具有定向法线的点集作为输入,并计算隐式函数。我们假设输入点不包含异常值和少量噪声。通过使用CGAL曲面网格生成器[4]或可能使用任何其他曲面轮廓算法提取该函数的等值面来生成输出曲面网格。
更具体地说,核心表面重建算法包括计算隐函数,该隐函数是推断实体的近似指示函数(泊松表面重建-称为泊松)。泊松是一个两步过程:它需要在函数求值之前求解隐函数。
本章提供了一个关于表面重建的详细教程,并提供了选择最合适的方法以及预处理和后处理的指南。
2、流程改造
从点集重建曲面通常是一个连续的过程,包括以下步骤:1)扫描和扫描对齐生成一组点或具有法线的点;2) 异常值去除;3) 简化以减少输入点的数量;4) 平滑以减少输入数据中的噪声;5) 当采集设备尚未提供法线时的法线估计和定向;以及6)表面重建。
CGAL为上面列出的除对齐以外的所有步骤提供算法。
第二章点集处理描述了在重建前对点集进行预处理的算法,其中包括简化、异常值去除、平滑、法线估计和法线定向等功能。
3、泊松
给定一组在3D固体边界上采样的具有方向性的法线(在此之后称为定向点)的3D点,Poisson表面重建方法解决了对于推断的固体的近似指示函数的问题,其梯度最好匹配输入的法线。输出的标量函数以自适应八叉树表示,然后使用自适应游走立方体进行等值轮廓。
CGAL实现了一种此算法的变体,它在一组3D定向点上构建3D Delaunay三角剖分,并通过Delaunay细化来改进它,从而消除所有非各向同性的四面体并细分为输入定向点的松散边界框。在细化期间添加的Steiner点的法线被设置为零。然后,它作为剖分上的分段线性函数求解指示函数的标量。更具体地说,它在三角剖分的每个顶点上解决Poisson方程 Δf=div(n) 使用稀疏线性求解器。最后,CGAL表面网格生成器提取等值曲面,其函数值默认设置为所有输入点处的f的中值。
4、重构函数
提供了一个全局函数 poisson_surface_reconstruction_delaunay()。它以具有法线的点作为输入,处理整个重建管道:它计算隐函数;它使用基于Delaunay细分的CGAL表面网格生成器以给定的精度重建表面;它以多边形网格的形式输出结果。
此函数旨在为泊松重建提供一个快速且用户友好的API。高级用户可能对使用该类(请参阅重建类)感兴趣,该类允许他们使用其他曲面网格或不同的输出结构。
5、重构类
类模板声明是template<class Gt>class Poisson_rebuildion_function,其中Gt是几何特征类。
有关详细信息,请参阅:Poisson_rebuildion_function<GeomTraits>
5.1、轮廓
通过使用CGAL曲面网格生成器,可以将计算的隐函数等值线化以重建曲面:make_surface_mesh()
参数Tag会影响make_surface_mesh()的行为:
Manifold_tag:输出网格保证为无边界的流形曲面。
Manifold_with_boundary_tag:输出网格保证是流形,可能有边界。
Non_manifold_tag:输出网格没有保证,因此作为多边形汤输出。
5.2、输出
make_surface_mesh() 重建的表面需要是 SurfaceMeshComplex_2InTriangulation_3 概念的模型,这是一种数据结构,用于表示嵌入到三维三角剖分中的二维复杂体。
SurfaceMeshComplex_2InTriangulation_3定义了遍历重建表面并将其转换为三角形汤的方法。
其他CGAL组件提供将重建的表面网格写入对象文件格式(OFF)并将其转换为多面体(当它是流形时)的功能:output_surface_facets_to_off();output_surface_facets_to_polyhedron()
6、指导
表面重建问题本质上是不适定的,因此所提出的算法并不假装重建具有任意采样条件的各种表面。本节为用户提供了一些关于理想采样和轮廓条件的提示,并描述了当这些条件不匹配时的一些失败案例。
6.1、理想条件
用户必须记住,泊松曲面重建算法包括两个阶段(从输入点集计算隐函数和绘制该函数的等值面轮廓)。两者都需要在采样条件和参数调整方面给予一定的注意。
6.2、点集
理想情况下,泊松表面重建方法的当前实现期望密集的3D定向点集,并在闭合、光滑的表面上采样。这里的“定向”是指所有3D点必须具有指向推断曲面的一致定向法线。下图说明了满足这些理想条件的情况。
泊松重建。左图:雕像上采样的120K点(美能达激光扫描仪)。右图:重建的曲面网格。
左图:雕像上采样的120K点(美能达激光扫描仪)。右图:重建的曲面网格。
该算法对各向异性采样和噪声具有相当的鲁棒性。它还通过填充相应的孔对缺失数据具有鲁棒性,因为该算法旨在重建推断实体的指示函数
左上角:手上采样的65K点(Kreon激光扫描仪)。左下:由于扫描技术,点集具有高度各向异性。右图:重建的曲面网格和特写。这些孔已适当闭合。
该算法通常对异常值不具有鲁棒性,尽管少数异常值并不总是会导致故障,
左图:在象上采样的70K点,很少有异常值用磁盘强调。右图:重建的曲面网格。
即使当推断的曲面由几个连接的组件组成时,该算法也能很好地工作,前提是所有法线都得到了正确的估计和定向(当前的CGAL法线定向器算法在某些情况下可能会失败,请参见mst_orient_normals()),并且最终的轮廓绘制算法对每个组件都进行了正确的播种。当推断的曲面由几个嵌套的连接组件组成时,应注意交替(向内/向外)定向每个组件的法线,以便最终的轮廓绘制阶段选择适当的轮廓绘制值。
6.3、轮廓参数
我们的泊松曲面重建算法的实现计算了一个隐函数,该隐函数表示为3D Delaunay三角剖分的四面体上的分段线性函数,该三角剖分由输入点构建,然后通过Delaunay精化进行精化。因此,任何等参曲面也是分段线性的,因此可能包含尖锐的折痕。由于轮廓算法make_surface_mesh()期望平滑的隐式函数,当设置较小的网格大小或曲面近似误差参数时,这些尖锐的折痕可能会在最终重建的曲面网格中创建虚假的顶点簇(见下图)。
避免这些虚假聚类的一种方法是调整网格大小和表面近似参数,使其与平均采样密度(通过compute_average_spacing()获得)相比足够大,以便轮廓算法感知平滑的等参表面。我们建议使用以下轮廓参数:
最大三角形半径:至少为平均间距的100倍。
近似距离:至少为平均间距的0.25倍。
左图:用近似距离=0.25*平均间距重建的曲面。右图:用近似距离=0.15*平均间距重建的曲面。注意脸颊上的假簇。
6.4、退化条件
上面列出的条件是相当严格的,在实践中并不是所有条件都能在申请中得到满足。我们现在说明了在采样、法线方向错误、噪声和尖锐折痕等条件不满足时算法的行为。
6.5、稀疏采样
重建算法期望一个足够密集的点集。尽管由于算法的变分性质,在某些密度条件下没有正式的证据证明其正确性,但我们的实验表明,当局部间距至多为局部特征大小的十分之一(到中轴的距离,它完全捕捉曲率、厚度和分离度)时,该算法能很好地重建所有薄特征。当不满足此条件时,重建不会重建薄的欠采样特征.
左图:海王星三叉戟上的50万个采样点。在这种情况下,重建(未示出)是成功的。右图:点集简化为1K个点,然后重建(所有输入点都用法线表示)。不重建薄特征。
6.6、大孔
重构被设计为求解隐函数,该隐函数是推断实体的近似指示函数。因此,轮廓算法总是提取一个闭合的表面网格,因此能够填充由于采集过程中的遮挡等原因而丢失数据的小孔
左图:一只手上采样的65K个点,腕基处没有捕捉到数据。右图:重建的曲面网格。表面在手指上适当闭合,在手腕上也闭合,但方式不太合理。
在大孔的情况下,该算法仍然将它们全部闭合,但由于用于求解的3D Delaunay三角剖分在孔被填充的地方非常粗糙,因此所得到的分段线性隐式函数可能表现出大的三角形补丁和尖锐的折痕。这可以通过两次通过的方法来避免。点子集的第一步用于获得孔处曲面的近似值。然后,该曲面用于计算具有完整点集的第二遍的更平滑的3D Delaunay三角测量。
Left: The wrist. Middle: one pass. Right: two passes.
6.7、错误的法线方向
泊松曲面重建方法求解梯度与一组输入法线最匹配的隐式函数。因为它在最小二乘法的意义上解决了这个问题,所以它对少数孤立的方向错误(翻转)的法线是稳健的。然而,一组方向错误的法线会导致不正确的隐函数,从而导致虚假的几何失真甚至拓扑失真。
左图:在具有方向错误法线簇的球体上采样的点。右图:重建的曲面网格带有虚假凸起。
6.8、噪声和异常值
大量的噪声不可避免地会影响重建(见下图顶部),并且当前的实现没有提供任何用数据拟合来换取平滑度的方法。然而,如果信噪比足够高和/或为绘制等参表面轮廓而设置的表面近似和尺寸参数相对于噪声水平较大,则输出表面网格将看起来平滑(未示出)。如果用户想要生成平滑而详细的输出曲面网格,我们建议通过jet_smooth_point_set()应用平滑。
左上角:在球体上采样并被大量噪声破坏的点。右上角:重建的曲面网格。左下:平滑的点集。右下角:重建的曲面网格。
对于大量的异常值,故障情况(未显示)转化为虚假的小连接部件和推断表面附近的巨大失真。在这种情况下,必须通过remove_outliers()删除异常值。
6.9、尖锐的折痕
当前的重建算法不能恢复推断表面中存在的尖锐折痕和角。这转化为平滑的尖锐折痕。
左图:在具有尖锐特征(折痕、飞镖和角)的机械零件上采样的5K点。右图:具有平滑折痕的重建曲面网格。
7、性能
我们提供了一些扫描数据的性能数字。我们测量泊松隐函数的计算时间、一系列近似距离的轮廓绘制时间、内存占用以及点集简化的影响。
7.1、泊松隐函数
为确定泊松隐函数基准而选择的点集是Bimba con Nastrino点集(160万点)。我们测量该点集以及通过随机简化获得的简化版本的泊松隐式函数计算(即,对Poisson_reformation_function::compute_implicit_function()的调用,在下文中用泊松解表示)。下表提供了越来越多点的泊松求解计算时间(以秒为单位)。
Number of points (x1000) | Poisson solve duration (in s) |
60 | 15 |
100 | 25 |
250 | 96 |
500 | 150 |
1,000 | 249 |
1,800 | 478 |
7.2、轮廓
为确定轮廓阶段的基准而选择的点集是简化为100k点的Bimba con Nastrino点集。我们测量一系列近似距离的轮廓绘制(即调用make_surface_mesh())持续时间和重建误差。重建误差表示为从输入点到重建表面的平均距离,单位为毫米(Bimba con Nastrino雕像高324毫米)。
Approx. distance (*average spacing) | Contouring duration (in s) | Reconstruction error (mm) |
0.1 | 19.2 | 0.055 |
0.25 | 6.9 | 0.106 |
0.5 | 3.2 | 0.18 |
1 | 1.65 | 0.36 |
2 | 0.8 | 0.76 |
简化为100k点的Bimba con Nastrino点集的轮廓持续时间(以s为单位)和重建误差(mm)与几个近似距离参数的关系。
7.3、内存
我们测量了重建完整Bimba con Nastrino点集(180万点)以及简化版本的内存占用率。
当使用稀疏线性求解器求解泊松线性系统时,泊松隐函数计算具有记忆峰值。
Number of points (x1000) | Memory occupancy (MBytes) |
60 | 180 |
100 | 270 |
250 | 790 |
500 | 1300 |
1,000 | 2200 |
1,800 | 3800 |
7.4、点集简化
由于上述内存限制,我们建议简化激光扫描仪捕获的点集。
我们测量了Bimba con Nastrino点集(1.6M个点)以及简化版本的重建误差。所有重建都使用推荐的轮廓参数近似距离=0.25*输入点集的平均间距。重建误差表示为从输入点到重建表面的平均距离,单位为毫米(Bimba con Nastrino雕像高324毫米)。
Number of points (x1000) | Reconstruction error (mm) |
60 | 0.27 |
120 | 0.15 |
250 | 0.11 |
500 | 0.079 |
1,000 | 0.066 |
1,500 | 0.061 |
1,600 | 0.06 |
具有1.6M个点的Bimba con Nastrino点集以及简化版本的重建误差(mm)相对于点的数量。
CGAL 5.6 - Poisson Surface Reconstruction: User Manual