从3D点云进行曲面重建的强大算法?


70

我正在尝试找出可以从3D范围数据进行曲面重建的算法。乍一看,Ball数据透视算法BPA)和泊松曲面重构是更成熟的方法?

  • 除了BPA和Poisson曲面重建算法以外,在该领域还有哪些已建立的,更健壮的算法?
  • 推荐的研究出版物?
  • 有可用的源代码吗?

Answers:


100

我几个月来一直面对这个难题,并进行了详尽的研究。

演算法

主要有2类算法:计算几何和隐式曲面。

计算几何

它们使网格适合现有点。

该组中最著名的算法可能是powercrust,因为从理论上讲它是公认的-它可以确保水密网格。

Ball Pivoting已获得IBM的专利。而且,它不适用于点密度变化的点云。

隐式函数

一种将隐式函数拟合到点云上,然后使用类似于游行多维数据集的算法将函数的零集提取到网格中。

这类方法的主要区别在于所使用的隐式函数不同。

泊松霍普MPU是此类中最著名的算法。如果您是该主题的新手,我建议您阅读Hoppe的论文,这很有解释性。

通常可以实施此类算法,以便它们能够非常有效地处理大量输入,并且可以扩展其质量-速度折衷。它们不受噪声,变化的点密度和孔的干扰。它们的一个缺点是它们需要在输入点处始终定向的表面法线。

实作

您会发现少量的免费实现。但是,这取决于您是将其集成到自由软件(在这种情况下,您可以接受GPL许可)还是在商业软件中(在这种情况下,您需要更自由的许可)进行集成。后者非常罕见。

一种是VTK。我怀疑它很难集成(没有文档可免费获得),它具有一个奇怪的,过于复杂的体系结构,并且不是为高性能应用程序而设计的。对于允许的输入点云也有一些限制。

看一下这个Poisson的实现,然后与我分享您的经验。

另外: 是一些高性能算法,其中包括曲面重构。

CGAL是著名的3d库,但仅对免费项目免费。 Meshlab是GPL的著名应用程序。

另外(2013年8月添加):PCL库具有专用于表面重建的模块,并且正在积极开发中(并且是Google的“代码之夏”的一部分)。表面模块包含许多不同的重建算法。如果您的点数据中没有提供表面法线,则PCL还具有估算表面法线的功能,可以在功能模块中找到此功能。PCL是根据BSD许可条款发布的,是开源软件,可免费用于商业和研究用途。


1
感谢您分享所有评论工作,很好的答案。目前,您正忙于其他工作,但是一旦有时间评估您提供的算法/代码,我会尽快与您联系。
2009年

1
CGAL 4.0现在完全在GPL / LGPL下。看这里
user445786 2013年

1
您可能也对SIGGRAPH论文中的《表面重建基准》感兴趣,论文包含源代码,其中至少有一些是BSD许可证。
Drone2537 '17

我玩过AdaptiveSolvers。该软件包看起来很棒,并且包含对推断出的顶点的清洁。因此,类似的反应也在这里:dsp.stackexchange.com/questions/56663/...
托加Birdal

14

如果要使用各种曲面重建算法进行直接实验,则应尝试 MeshLab这个网格处理系统,它是开源的,它包含许多先前引用的曲面重建算法的实现,例如:

  • 泊松表面侦察
  • 几种基于MLS的方法,
  • 球形旋转实施
  • 基于无卷体积方法的一种变体
  • 基于Delaunay的技术(Alpha形状和Voronoi滤波)
  • 从分散点集计算法线的工具
  • 和许多其他工具来比较/测量/清洁/简化生成的网格。

光源受GPL保护,因此您不能在商业封闭源项目中使用它们,但是正确了解各种表面重建算法的属性(对噪声,速度,噪声的敏感度)非常重要。开始实施其中一个之前,对异常值的鲁棒性,它们如何保留精细细节等)。


3
我发现此博客文章及其下面的评论提供了很好的提示。
加布里埃尔·德维勒


4

虽然不是网格表示形式,但前同事向我推荐了此链接到Thin Plate Spline方法的源代码:

链接

有人尝试过吗?


3

不确定是否完全适合您的情况,因为您似乎忽略了它很奇怪,但是在此类情况下通常会提到行进多维数据集


1
谢谢,我仍处于该主题的探索阶段,之前从未听说过进行多维数据集处理-将退房。
Fredriku73,2009年

3
行进立方体不是表面点的理想选择,要计算出是否在体积内是很昂贵的。
马丁·贝克特

2

因为我也遇到这个问题,所以我确实开发并实现了自己的点云结壳算法。可以在github.com上找到源代码和文档:https : //github.com/ricebean-net/PointCloudCrust。该算法用Java实现。

也许可以帮到您。您还可以在页面上找到一个简短的python脚本,该脚本说明了如何使用该库。玩得开心!


谢谢!这是一个很干净的实现,非常容易理解。有点慢 我设法将其移植到cpp。
南德



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.