在Python 3中使用行进立方体进行点云三角剖分

时间:2019-06-20 13:16:29

标签: python-3.x scikit-image marching-cubes

我正在使用3D重建系统,并且希望使用Python 3从注册点云数据生成三角形网格。我的对象不是凸形的,因此行进立方体算法似乎是解决方案。

我更喜欢使用这种方法的现有实现,因此我尝试了scikit-imageOpen3d,但是两个API都不接受原始点云作为输入(请注意,我不是那些专家库)。我尝试转换数据失败,并且由于文档未阐明函数的输入格式,因此我的想法用光了。

这些是我想要的片段,其中pcd_to_volume是我所需要的。

scikit图像

import numpy as np
from skimage.measure import marching_cubes_lewiner

N = 10000
pcd = np.random.rand(N,3)

def pcd_to_volume(pcd, voxel_size):
    #TODO

volume = pcd_to_volume(pcd, voxel_size=0.05)

verts, faces, normals, values = marching_cubes_lewiner(volume, 0)

open3d

import numpy as np
import open3d

N = 10000
pcd = np.random.rand(N,3)

def pcd_to_volume(pcd, voxel_size):
    #TODO

volume = pcd_to_volume(pcd, voxel_size=0.05)

mesh = volume.extract_triangle_mesh()

我找不到正确编写pcd_to_volume函数的方法。我不喜欢图书馆,所以这两种解决方案对我来说都很好。

您对正确转换我的数据有任何建议吗?点云是Nx3的{​​{1}}矩阵。

您知道用于原始点云数据的另一种[行军立方体算法]实现吗?我更喜欢scikit和open3d之类的库,但我还将考虑github项目。

1 个答案:

答案 0 :(得分:1)

您知道适用于原始点云数据的[行军立方体算法]的另一种实现吗?

Hoppe的论文Surface reconstruction from unorganized points可能包含您需要的信息,并且为open sourced

最新的Open3D似乎包含alphaShapeballPivotingPoissonReconstruction之类的表面重建算法。


据我所知,marching cubes通常用于从三维离散标量场(即体积)中提取等值面的多边形网格。该算法不适用于原始点云数据。

Hoppe的算法的工作原理是首先生成一个带符号的距离函数字段(一个SDF卷),然后将其传递给行进多维数据集。这可以看作是对您pcd_to_volume的一种实现,这不是唯一的方法!

如果您仅拥有原始点云,那么情况会受到一些限制。如您所见,Poisson reconstructionScreened Poisson reconstruction算法都以自己的方式实现pcd_to_volume(它们之间是高度相关的)。但是,它们需要其他点法线信息,并且法线必须一致。 (对于一致的方向,您可以阅读this question)。

尽管某些基于Delaunay的算法(他们不使用行进立方体)(例如alphaShape和this)可能不需要点法线作为输入,但是对于具有复杂拓扑的曲面,它是由于方向问题,很难获得满意的结果。 graph cuts method可以使用可见性信息来解决这个问题。


话虽如此,如果您的数据来自深度图像,则通常将具有可见性信息。而且,您可以使用TSDF来构建良好的曲面网格。 Open3D具有already implemented that

相关问题