我正在使用3D重建系统,并且希望使用Python 3从注册点云数据生成三角形网格。我的对象不是凸形的,因此行进立方体算法似乎是解决方案。
我更喜欢使用这种方法的现有实现,因此我尝试了scikit-image和Open3d,但是两个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项目。
答案 0 :(得分:1)
您知道适用于原始点云数据的[行军立方体算法]的另一种实现吗?
Hoppe的论文Surface reconstruction from unorganized points可能包含您需要的信息,并且为open sourced。
最新的Open3D似乎包含alphaShape,ballPivoting和PoissonReconstruction之类的表面重建算法。
据我所知,marching cubes通常用于从三维离散标量场(即体积)中提取等值面的多边形网格。该算法不适用于原始点云数据。
Hoppe的算法的工作原理是首先生成一个带符号的距离函数字段(一个SDF卷),然后将其传递给行进多维数据集。这可以看作是对您pcd_to_volume
的一种实现,这不是唯一的方法!
如果您仅拥有原始点云,那么情况会受到一些限制。如您所见,Poisson reconstruction和Screened Poisson reconstruction算法都以自己的方式实现pcd_to_volume
(它们之间是高度相关的)。但是,它们需要其他点法线信息,并且法线必须一致。 (对于一致的方向,您可以阅读this question)。
尽管某些基于Delaunay的算法(他们不使用行进立方体)(例如alphaShape和this)可能不需要点法线作为输入,但是对于具有复杂拓扑的曲面,它是由于方向问题,很难获得满意的结果。 graph cuts method可以使用可见性信息来解决这个问题。
话虽如此,如果您的数据来自深度图像,则通常将具有可见性信息。而且,您可以使用TSDF来构建良好的曲面网格。 Open3D具有already implemented that。