鲁棒的三维点云表面重buildalgorithm?
我正试图找出哪些algorithm可以从3D距离数据中进行曲面重build。 乍一看, Ball pivotingalgorithm ( BPA )和泊松曲面重build是比较成熟的方法吗?
- 在BPA和泊松曲面重buildalgorithm以外,现有的更稳健的algorithm是什么?
- 推荐研究出版物?
- 有没有可用的源代码?
几个月来,我一直面临这个困境,做了详尽的研究。
algorithm
主要有两类algorithm:计算几何和隐式曲面。
计算几何
它们适合现有点上的网格。
可能这组中最着名的algorithm是powercrust ,因为它在理论上是完善的 – 它保证了水密网格。
Ball Pivoting是IBM的专利。 另外,它不适合点密度不同的点云。
隐式函数
一个在点云上拟合隐式函数,然后使用类似marching-cube的algorithm将函数的零集提取到网格中。
这个类别中的方法主要与所使用的不同隐式函数有所不同。
Poisson , Hoppe和MPU是这一类中最着名的algorithm。 如果您对这个主题不熟悉,我build议阅读Hoppe的论文,这是非常具有说服力的。
这个类别的algorithm通常可以被实现,使得它们能够非常有效地处理巨大的input,并且可以缩放它们的质量 – 速度折衷。 它们不受噪音,不同点密度,孔的干扰。 它们的缺点是它们需要在input点处始终保持定向的表面法线。
实现
你会发现less量的免费实现。 但是,这取决于您是否将其集成到免费软件(在这种情况下GPL许可证是可以接受的)或商业软件(在这种情况下您需要更宽松的许可证)。 后者是非常罕见的。
一个是VTK 。 我怀疑它很难集成(没有文档是免费的),它有一个奇怪的,过于复杂的架构,而不是为高性能应用而devise的。 对于允许的input点云也有一些限制。
看看这个泊松实现,然后与我分享你的经验。
另外: 这里有一些高性能algorithm,其中包括表面重build。
CGAL是一个着名的三维图书馆,但它是免费的,只有免费的项目。 Meshlab是一个与GPL着名的应用程序。
另外(2013年8月增加):图书馆PCL有一个专门用于表面重build的模块 ,并且正在积极开发(并且是Google的Summer of Summer代码的一部分)。 表面模块包含许多不同的重buildalgorithm。 PCL还具有估算曲面法线的能力 ,如果您没有提供点数据,则可以在function模块中find该function。 PCL是根据BSD许可条款发布的,并且是开源软件,可以免费用于商业和研究用途。
如果你想用各种表面重buildalgorithm做一些直接的实验,你应该尝试一下网格处理系统MeshLab ,它是开源的,它包含许多以前引用的表面重buildalgorithm的实现,如:
- 泊松曲面运算
- 几个基于MLS的方法,
- 一个球枢转的实现
- 基于Curless卷的方法的变体
- 基于Delaunay技术(Alpha形状和Voronoi过滤)
- 用于从分散点集计algorithm线的工具
- 以及用于比较/测量/清洁/简化所得网格的许多其他工具。
来源受GPL保护,所以你不能在商业封闭源项目中使用它们,但是对各种表面重构algorithm的属性有正确的感觉是非常重要的(它们对噪声有多敏感,速度,对exception值的鲁棒性,如何保存精细的细节等等),然后开始实现其中的一个。
您可能会开始关注一些近期在该领域的工作 – 目前像Gianmauro Cuccuru,Enrico Gobbetti,Fabio Marton,Renato Pajarola和Ruggero Pintus的快速低内存streamMLS重build点采样曲面 。 它的引用可以让你快速浏览文献。
虽然不是一个网格表示,前同事推荐我这个链接到薄板样条线方法的源代码:
链接
有人试过吗?
不知道你的情况是否完全正确,因为你忽略了这一点似乎很奇怪,但是在这种情况下通常会提到行军立方体 。
在GitHub上, Hugues Hoppe博士在C ++中是一个开源的网格处理库 ,其中表面重build程序Recon是一个很好的select。
你可能会对Alpha Shapes感兴趣。
有几何工具3D Delaunay工具 。 这个工具是用DirecX和OpenGL的。 不幸的是,您可能需要购买一本书来查看库的实际示例代码。 您仍然阅读代码并找出答案。
Matlab还引入了一个使用Delaunay 类的 Delaunay 三angular网表面重构工具。
由于我也有这个问题,所以我开发并实现了我自己的点云壳algorithm。 这些资源以及文档可以在github.com上find: https : //github.com/ricebean-net/PointCloudCrust 。 该algorithm在Java中实现。
也许,这可以帮助你。 您还可以在页面上find一个简短的python脚本,说明如何使用该库。 玩的开心!