我需要能够从无序的点云数据生成一个网格。
当我试图实现Marching多维数据集算法时,我偶然发现了本文:
贝叶斯点云重建
我想知道是否已经在.NET中实现了这个算法。C++也会没事..。
更新
前进立方体算法的问题是,我很难把我的点云数据,基本上是一组3D点,转换成输入的体素网格数据,这是算法需要的一个0到1之间的三维值数组。
我还是不知道怎么改变它..。
发布于 2013-09-30 21:27:22
据我所知,有两个库在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)
}还有稀疏Voxel八叉树,实现起来可能很繁琐,但效率却很高。你可以在上面运行行军立方体。
点云- Voxel集对偶性是一个活跃的研究领域,您将能够在网上找到大量的信息以及这种想法的各种实现。祝好运。
https://stackoverflow.com/questions/19098995
复制相似问题