从三维点云中重建表面的强大算法是什么?

77

我正在试图找出有哪些算法可以从三维范围数据中进行表面重建。乍一看,Ball pivoting algorithm (BPA) 和 Poisson surface reconstruction 看起来是更为成熟的方法?

  • 除了BPA和Poisson表面重建算法之外,在该领域中还有什么已建立、更健壮的算法吗?
  • 推荐的研究出版物是什么?
  • 是否有可用的源代码?
9个回答

110

我已经面临这个困境已有几个月了,并进行了详尽的研究。

算法

主要有两类算法:计算几何和隐式表面。

计算几何

它们通过适合现有点上的网格来完成任务。

这个组中最著名的算法可能是powercrust,因为它在理论上很成熟-它保证网格无漏洞。

Ball Pivoting由IBM拥有专利。此外,它不适用于点密度不同的点云。

隐式函数

该类算法在点云上拟合隐式函数,然后使用类似Marching Cube的算法将零集提取为网格。

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

PoissonHoppe'sMPU是该类别中最著名的算法。如果您对这个主题还不熟悉,我建议您阅读Hoppe的论文,它非常详细。

这一类算法通常可以实现为能够非常高效地处理巨大输入的方式,并且可以缩放其质量和速度之间的平衡。它们不受噪声、不同的点密度、孔洞等影响。它们的一个缺点是需要在输入点处具有一致的表面法线。

实现

您将找到少量的免费实现。然而这取决于您是否要将其集成到自由软件中(在这种情况下,GPL许可证对您是可接受的)或商业软件中(在这种情况下,您需要更自由的许可证)。后者非常罕见。

其中一个在VTK中。我怀疑它很难集成(没有可免费获得的文档),它的架构奇怪而且过于复杂,并且不适用于高性能应用程序。此外,还有一些对允许的输入点云的限制。

看看这个泊松实现,然后请与我分享您的经验。

另外:这里有一些高性能算法,其中包括表面重建。

CGAL是一个著名的3D库,但仅适用于免费项目。 Meshlab是一款带有GPL的知名应用程序。

此外(添加于2013年8月): 库PCL有一个专门用于表面重建的模块,并正在积极开发中(是Google的Summer of Code的一部分)。表面模块包含许多不同的重建算法。 PCL还有能力估计表面法线,以防数据没有提供它们,这种功能可以在特征模块中找到。 PCL按照BSD许可条款发布,并且是开源软件,可以免费用于商业和研究用途。


1
感谢分享你的所有评论工作,非常好的答案。目前有其他事情要忙,但一旦我有时间评估你提供的算法/代码,我会回复你的。 - Fredriku73
1
CGAL 4.0现在完全采用GPL/LGPL协议。请参见这里 - user445786
1
您可能也会对SIGGRAPH论文-表面重建的基准感兴趣,其中包含源代码,至少有一部分是BSD许可证。 - Drone2537
我已经尝试过AdaptiveSolvers。这个软件包看起来很棒,包括清理外推顶点的功能。因此,在这里也有类似的回应: https://dsp.stackexchange.com/questions/56663/how-to-extract-a-smooth-contour-from-a-set-of-points-in-3d/56664?noredirect=1#comment114064_56664 - Tolga Birdal

14

如果您想对各种表面重建算法进行直接实验,可以尝试MeshLab,它是一个网格处理系统,是开放源代码的,并包含了许多之前提到的表面重建算法的实现,例如:

  • Poisson表面重建
  • 基于MLS的一些方法
  • 球极化实现
  • 基于Curless体积的变种方法
  • Delaunay基础技术(Alpha形状和Voronoi过滤)
  • 从散点集计算法线的工具
  • 以及许多其他用于比较/测量/清理/简化生成的网格的工具。

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


3
我找到了这篇博客文章和下面的评论,它们提供了很好的提示。 - Gabriel Devillers

5

很好,这篇最新的论文我之前没有看过。喜欢相关工作部分。太棒了,谢谢! - Fredriku73
谢谢Paul,我不知道这篇论文。而且我喜欢两位作者明显来自撒丁岛 :P - alcor

4

虽然不是一个网格表示,但我的一位前同事向我推荐了这个薄板样条方法的源代码链接:

链接

有人尝试过吗?


3

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

也许这能帮到你。在网页上还有一个简短的Python脚本,说明如何使用库。祝你玩得开心!


谢谢!这是一个非常干净易懂的实现。有点慢。我已经成功将它移植到了cpp。 - Nande

3

不确定它是否完全适用于你的情况,因为你似乎省略了一些信息,但是在这种情况下常常提到的是Marching cubes算法


1
谢谢,我还处于探索阶段,之前没有听说过Marching Cubes - 我会去了解一下。 - Fredriku73
3
Marching cubes并不适用于处理表面点,因为判断一个点是否在体积内部的计算开销较大。 - Martin Beckett

1

1

这份文档写得太糟糕了。 - Schütze

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接