我正在研究一个3D重建系统,并希望使用Python 3从注册的点云数据生成三角形网格。我的对象不是凸的,所以行进立方体算法似乎是解决方案。
我更喜欢使用这种方法的现有实现,所以我尝试了scikit-image和Open3d,但这两个API都不接受原始点云作为输入(请注意,我不是这些库的专家)。我转换数据的尝试失败了,而且由于文档没有阐明函数的输入格式,因此我的想法已经用完了。
这些是我想要的片段,其中pcd_to_volume
是我需要的。
scikit-image
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
矩阵,其中dtype=float
.
你知道另一种适用于原始点云数据的[行进立方体算法]的实现吗?我更喜欢像scikit和open3d这样的库,但我也会考虑github项目。
你知道另一种适用于原始点云数据的[行进立方体算法]实现吗?
Hoppe的论文《从无组织点进行表面重建》可能包含您需要的信息,并且它是开源的。
最新的Open3D似乎包含表面重建算法,如alphaShape,ballPivoteing和PoissonReconstruction。
据我所知,行进立方体通常用于从三维离散标量场中提取等值面的多边形网格(这就是你所说的体积)。该算法不适用于原始点云数据。
Hoppe 的算法的工作原理是首先生成一个有符号距离函数场(SDF 体积),然后将其传递给行进立方体。这可以被视为您的实现pcd_to_volume
,这不是唯一的方法!
如果原始点云是你所拥有的一切,那么情况就有点受限了。如您所见,泊松重建和筛选泊松重建算法都以自己的方式实现pcd_to_volume
(它们是高度相关的)。但是,它们需要额外的点法线信息,并且法线必须始终定向。(为了保持一致的方向,您可以阅读这个问题)。
虽然一些基于 Delaunay 的算法(他们不使用行进立方体)如 alphaShape,这可能不需要点法线作为输入,但对于具有复杂拓扑的表面,由于方向问题,很难获得令人满意的结果。图形切割方法可以使用可见性信息来解决这个问题。
话虽如此,如果你的数据来自深度图像,你通常会得到可见性信息。您可以使用 TSDF 构建良好的表面网格。Open3D已经实现了这一点。