贝叶斯点云重构实现
我需要能够从无序的点云数据生成网格。
当我试图实施Marching Cubes算法时,我偶然发现了这篇文章:
贝叶斯点云重构
我想知道在这个算法的.NET中是否已经有了一个实现。 C ++也可以......
UPDATE
行进立方体算法的问题在于,我很难将点云数据(基本上是一组3D点)转换为算法需要的输入体素网格数据,这是一个三维数组,其值介于0和1。
我仍然不知道如何转换它...
据我所知,有两个库是用C ++中的点云实现网格生成的。 CGAL的网格生成模块和PCL。 我知道至少CGAL的版本支持多种算法,但我不确定他们是否有你指的那个。 但是,如果您正在寻找“更光滑”的行进立方体替代品,您可以尝试一下。
行军立方体的优势在于,通过将其移植到GPU上,您可以大幅提升它的速度。 如果你想在行进立方体之后消除一些东西,你可以尝试CGAL的网格简化技术。
CGAL确实有商业用途的许可证,而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,它可能很乏味,但却非常高效。 你可以在其上运行行军立方体。
点云 - 体素集二元性是一个活跃的研究领域,您将能够在网上找到大量的信息并实现这个想法的各种实现。 祝你好运。
链接地址: http://www.djcxy.com/p/37185.html上一篇: Bayesian Point Cloud Reconstruction implementation
下一篇: Fast volume representation, modification and polygonisation