【问题标题】:Bayesian Point Cloud Reconstruction implementation贝叶斯点云重建实现
【发布时间】:2013-09-30 16:16:22
【问题描述】:

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

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

Bayesian Point Cloud Reconstruction

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

更新

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

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

【问题讨论】:

    标签: algorithm mesh bayesian point-clouds marching-cubes


    【解决方案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,实现起来可能很乏味,但效率很高。您可以在其上运行行进立方体。

    Point Cloud - Voxel Set duality 是一个活跃的研究领域,您将能够在网上找到大量信息以及该想法的各种实现。祝你好运。

    【讨论】:

    • 我不认为这两个库有贝叶斯实现...请看我的更新。
    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2018-12-07
    • 2021-04-09
    • 2010-11-08
    相关资源
    最近更新 更多