c# - 通过保留点位置进行 3D 表面重建

标签 c# 3d mesh point-clouds 3d-reconstruction

我有 3D 点云并且想要重建表面。我在 Meshlab 中尝试了各种技术,以找到最适合我的特定云类型的算法。

泊松曲面重建很有前途,但它不保留原始点位置。在云中的特定位置进行重建和测量后发现,与现实世界中对象的测量值相比,测量值的误差超过 1.5 倍。

球旋转算法更好。它保留了点的位置,并且测量值也在预期范围内。但是这个算法在美国获得了专利,所以我不能将它用于商业项目。

研究了其他算法后,我没有发现任何像球旋转一样保留点位置的算法可以在商业环境中使用。您知道满足这两个标准的算法吗?我可以在我的点云中尝试使用这些算法,看看它们在实现之前是否运行良好?

如有任何帮助,我们将不胜感激。

最佳答案

对于插值表面重建(保留数据点),两种算法表现相当好(地壳和共锥)。

结壳算法:

想法是首先计算点集的 Voronoi 图,然后从 Voronoi 顶点中选择与中轴(称为极点)非常近似的顶点,然后计算输入点的 3D Delaunay 三角剖分 +极点,最后提取连接四面体中三个输入点的三角形,其中第四个顶点是极点。

更多引用:

http://web.cs.ucdavis.edu/~amenta/pubs/crust.pdf

http://web.mit.edu/manoli/crust/www/crust.html

  • plus:实现起来非常简单,如果输入数据是一个好的采样,则有一些理论上的保证

  • minus:需要计算两个 Delaunay 三角剖分

Co-cone 算法:

想法是计算点集的 Voronoi 图,然后在每个 Voronoi 单元中计算表面法线的良好近似值(作为连接极点的向量,即离数据点最远的两个 Voronoi 顶点).然后在每个 Voronoi 单元格中,考虑以数据点为中心并以法线为轴的锥体(共锥体)的补集。如果三个共锥与 Voronoi 边有非空交点,则这三个数据点用一个三角形连接。请注意,不需要显式构造共锥体对象(只需比较角度以测试是否存在交集)。

更多引用:

http://web.cse.ohio-state.edu/~tamaldey/surfrecon.htm

  • 另外:需要单个 Delaunay 三角剖分(与 Crust 的 2 个三角剖分相比),如果输入数据是“良好采样”,则有一些理论上的保证

  • 缺点:比地壳复杂一点(但我认为值得付出努力)

最后的话:

如果点集实现了良好的采样(即密度与厚度和曲率成正比,称为“局部特征尺寸”= 到中轴的距离),这些算法将构建一个良好的(即流形)表面。在实践中,输入数据不满足这个条件,因此该方法的输出将是一个“三角形汤”,大部分都可以,但需要一些后处理来修复一些局部缺陷。

编辑 03/21/16 您也可以尝试我自己的算法 (Co3Ne),该算法在我的软件库 Geogram (http://alice.loria.fr/software/geogram/doc/html/index.html) 和我的软件 Graphite (http://alice.loria.fr/software/graphite/doc/html/) 中实现。 Graphite 可以在那里下载:http://gforge.inria.fr/frs/?group_id=1465 (可移植源代码和 Windows64 可执行文件)。它是一种具有各种优化和并行实现的 Co-cone 形式。

关于c# - 通过保留点位置进行 3D 表面重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31385163/

相关文章:

c# - MEF 4.5 中缺少 CompositionInitializer。我可以用什么代替?

algorithm - 从另一组中找到一组中的最远点

python - 从网格数据中提取坐标

c# - 将 json 反序列化为包含字典的强类型对象

c# - 如何在 C# 中从 BindingSource 获取值

java - 如何将人脸存储在内存中

iphone - iOS 中 opengl 顶点数据的对齐有多重要

Three.js - 变形几何体和细化三角形网格

C++ 和 DirectX 9 - 调用 D3DXLoadMeshFromX 时出现解析错误

c# - 已处理死信队列中的 MSMQ 无效签名错误