泊松点云曲面重建管线

泊松点云曲面重建管线

泊松点云曲面重建通常是一下流程,包含以下步骤:

  1. 采集设备扫描产生一组点或带有法线的点;
  2. 异常值去除(Outlier removal);
  3. 简化(Simplification)以减少输入点的数量;
  4. 平滑(Smoothing)以减少输入数据中的噪声;
  5. 当采集设备未预先提供法向量时,进行法向量估计和定向(Normal estimation and orientation);
  6. 表面重建( 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;
}

kitten.xyz 点云CloudCompare距离量算
使用CGAL::compute_average_spacing<CGAL::Sequential_tag>计算的 average_spacing0.016857202298245593

泊松重建结果

poisson_surface_reconstruction_delaunay算法中,参数average_spacing具有重要意义:

  • 定义点云数据的平均间隔:average_spacing用于描述输入点云数据中各个点之间的平均距离。它反映了点云在空间中的疏密程度。例如,在对一个建筑物进行三维扫描获取点云数据时,如果扫描设备的精度较高且扫描间距设置较小,那么得到的点云数据中average_spacing值相对较小,意味着点云分布较为密集,能够更精确地表示建筑物的形状细节;反之,如果扫描设备精度较低或扫描间距较大,average_spacing值会较大,点云分布稀疏,可能会丢失一些建筑物的细微特征 。
  • 影响泊松曲面重建的效果:该参数对泊松曲面重建算法的结果有着关键影响。在泊松曲面重建过程中,算法会根据输入点云的法线方向等信息,求解一个代表重建曲面的指示函数。average_spacing会参与到这个求解过程中,影响算法对曲面细节的捕捉和重建。具体来说,如果average_spacing设置得过大,算法可能会认为点云之间的间隔较大,从而在重建曲面时忽略一些细节特征,导致重建的曲面较为平滑,丢失了原物体表面的一些微小起伏和变化;相反,如果average_spacing设置得过小,算法会过度关注点云之间的细微差异,可能会在重建曲面时引入一些不必要的噪声和波动,使得重建的曲面看起来不够光滑和自然 。

参考

  1. CGAL 6.0.1 - Poisson Surface Reconstruction
  2. 点云法向量的计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值