泊松点云曲面重建管线
泊松点云曲面重建通常是一下流程,包含以下步骤:
- 采集设备扫描产生一组点或带有法线的点;
- 异常值去除(Outlier removal);
- 简化(Simplification)以减少输入点的数量;
- 平滑(Smoothing)以减少输入数据中的噪声;
- 当采集设备未预先提供法向量时,进行法向量估计和定向(Normal estimation and orientation);
- 表面重建( Surface reconstruction)。
假设有一组三维点,这些点带有方向明确的法线,它们是从一个三维实体的边界上采样得到的。泊松曲面重建(Poisson Surface Reconstruction)方法致力于求解出一个函数,这个函数近似代表所推断实体的指示函数(indicator function)。所谓指示函数,它能表明空间中的点是否属于这个实体。这里要让该函数的梯度与输入的法线尽可能地匹配。
最终得到的是一个标量函数(scalar function),它以自适应八叉树(adaptive octree)的形式存储。接下来,通过自适应移动立方体( adaptive marching cubes)算法,对这个标量函数进行等值面提取,从而构建出三维实体的表面。
示例
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/poisson_surface_reconstruction.h>
#include <CGAL/IO/read_points.h>
#include <vector>
#include <fstream>
// Types
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;
typedef std::pair<Point, Vector> Pwn;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
int main(void)
{
std::vector<Pwn> points;
if(!CGAL::IO::read_points(CGAL::data_file_path("points_3/kitten.xyz"), std::back_inserter(points),
CGAL::parameters::point_map(CGAL::First_of_pair_property_map<Pwn>())
.normal_map(CGAL::Second_of_pair_property_map<Pwn>())))
{
std::cerr << "Error: cannot read input file!" << std::endl;
return EXIT_FAILURE;
}
Polyhedron output_mesh;
double average_spacing = CGAL::compute_average_spacing<CGAL::Sequential_tag>
(points, 6, CGAL::parameters::point_map(CGAL::First_of_pair_property_map<Pwn>()));
if (CGAL::poisson_surface_reconstruction_delaunay
(points.begin(), points.end(),
CGAL::First_of_pair_property_map<Pwn>(),
CGAL::Second_of_pair_property_map<Pwn>(),
output_mesh, average_spacing))
{
std::ofstream out("kitten_poisson-20-30-0.375.off");
out << output_mesh;
}
else
return EXIT_FAILURE;
return EXIT_SUCCESS;
}
使用CGAL::compute_average_spacing<CGAL::Sequential_tag>
计算的 average_spacing
为0.016857202298245593
。
在poisson_surface_reconstruction_delaunay
算法中,参数average_spacing
具有重要意义:
- 定义点云数据的平均间隔:
average_spacing
用于描述输入点云数据中各个点之间的平均距离。它反映了点云在空间中的疏密程度。例如,在对一个建筑物进行三维扫描获取点云数据时,如果扫描设备的精度较高且扫描间距设置较小,那么得到的点云数据中average_spacing
值相对较小,意味着点云分布较为密集,能够更精确地表示建筑物的形状细节;反之,如果扫描设备精度较低或扫描间距较大,average_spacing
值会较大,点云分布稀疏,可能会丢失一些建筑物的细微特征 。 - 影响泊松曲面重建的效果:该参数对泊松曲面重建算法的结果有着关键影响。在泊松曲面重建过程中,算法会根据输入点云的法线方向等信息,求解一个代表重建曲面的指示函数。
average_spacing
会参与到这个求解过程中,影响算法对曲面细节的捕捉和重建。具体来说,如果average_spacing
设置得过大,算法可能会认为点云之间的间隔较大,从而在重建曲面时忽略一些细节特征,导致重建的曲面较为平滑,丢失了原物体表面的一些微小起伏和变化;相反,如果average_spacing
设置得过小,算法会过度关注点云之间的细微差异,可能会在重建曲面时引入一些不必要的噪声和波动,使得重建的曲面看起来不够光滑和自然 。