在Python 3中使用行进立方体进行点云三角测量

Mar*_*tti 7 marching-cubes python-3.x scikit-image

我正在开发 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)
Run Code Online (Sandbox Code Playgroud)

开放3D

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()
Run Code Online (Sandbox Code Playgroud)

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

您对正确转换我的数据有什么建议吗?点云是一个Nx3矩阵,其中dtype=float.

您知道另一种适用于原始点云数据的[行进立方体算法]实现吗?我更喜欢 scikit 和 open3d 这样的库,但我也会考虑 github 项目。

Jin*_*hao 5

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

Hoppe的论文《从无组织点进行表面重建》可能包含您需要的信息,并且它是开源的

最新的 Open3D 似乎包含表面重建算法,如alphaShapeballPivotingPoissonReconstruction


据我所知,行进立方体通常用于从三维离散标量场(这就是你所说的体积)中提取等值面的多边形网格。该算法不适用于原始点云数据。

Hoppe 算法的工作原理是首先生成带符号的距离函数场(SDF 体积),然后将其传递给行进立方体。这可以看作是你的一种实现pcd_to_volume,但它不是唯一的方法!

如果你只有原始点云,那么情况就有点受限了。正如您可能看到的,泊松重建筛选泊松重建算法都pcd_to_volume以自己的方式实现(它们高度相关)。然而,它们需要额外的点法线信息,并且法线必须一致定向。(为了保持一致的方向,您可以阅读这个问题)。

虽然一些基于Delaunay的算法(它们不使用行进立方体)如 alphaShape 并且可能不需要点法线作为输入,但对于具有复杂拓扑的曲面,由于方向问题很难获得令人满意的结果。图割方法可以使用可见性信息来解决这个问题。


话虽如此,如果您的数据来自深度图像,您通常会获得可见性信息。并且您可以使用TSDF构建良好的表面网格。Open3D 已经实现了这一点