algorithm - 贝叶斯点云重建实现

标签 algorithm mesh bayesian point-clouds marching-cubes

我需要能够从无序的点云数据生成网格。

当我尝试实现 Marching Cubes 算法时,我偶然发现了这篇论文:

Bayesian Point Cloud Reconstruction

我想知道是否已经在 .NET 中实现了该算法。 C++ 也可以...

更新

行进立方体算法的问题是我无法将我的点云数据(基本上是一组 3D 点)转换为算法需要的输入体素网格数据,这是一个三维值数组介于 0 和 1 之间。

我还是不知道怎么转换...

最佳答案

据我所知,有两个库使用 C++ 从点云生成网格。 CGAL's Mesh Generation模块和 PCL .我知道至少 CGAL 的版本支持多种算法,但我不确定他们是否有你所指的那个。但是,如果您正在寻找移动立方体的“更平滑”替代品,您可以尝试一下。

行进立方体的优势在于您可以大大加快速度 by porting it to the GPU .如果你想在行进立方体之后平滑一些东西,你可以试试CGAL's Mesh simplification techniques.

CGAL 确实有一个 license用于商业用途,而 PCL 是在 BSD 下发布的,因此是免费的。

更新:

将点云转换为体素网格很简单,前提是您有足够的内存来以必要的粒度制作网格。例如,如果您需要每个单位一个体素并覆盖 256^3 的空间,并且您有那么多的内存可用,则只需制作一个 256^3 的二进制数组并在云中有一个点的地方设置 1。

如果您需要更高的粒度(比如每 0.1 个单位一个体素)或需要覆盖更多空间 (1024^3),并且如果您没有足够的内存,那么您需要更智能的方法。

我能想到的一个选择是对您的点云进行排序,一次将其分成三个切片。假设您沿 z 对点进行了排序,并且您的粒度为 0.1 个单位。你的行进立方体算法可以是这样的:

for z in (minz to maxz in steps of 0.1) { //We want to do marching cubes on z-1, z, z+1
    FreeVoxelSet(z-2) //This will free the voxel slice at z-2 from previous iteration
    CreateVoxelSet(z+1) //This step will go through your sorted point cloud and voxelate all points between z and z+1
    DoMarchingCubes(z) //You have z-1, z (from prev iterations) and z+1(this iter)        
}

还有 Sparse Voxel Octrees ,实现起来可能很乏味,但非常高效。您可以在其上运行行进立方体。

点云 - 体素集对偶性是一个活跃的研究领域,您可以在网上找到大量信息以及该想法的各种实现。祝你好运。

关于algorithm - 贝叶斯点云重建实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098995/

相关文章:

unity3d - 统一 5 : Automatically specifying the triangle list for the vertices of a mesh

5 个拟合值的贝叶斯区间

algorithm - 在一系列图像中检测公共(public)区域的方法

algorithm - 如果启发式函数 h 是单调的,为什么在 A-star 算法中减去 h(x)?

algorithm - 桶大小不同的桶排序

python-3.x - 在 Python 3.6 Windows 上安装 PyMesh

algorithm - 如何以函数式方式使用 Clojure 解决这种编程情况?

c# - 在 C# 管理的 DirectX 中制作自定义网格

machine-learning - 为什么我们选择 Beta 分布作为假设的先验?