python - 如何将 3D 点云 (.ply) 转换为网格(带有面和顶点)?
问题描述
我有一个包含 100 万个点的 3-D 点云文件,我需要将其转换为 trimesh 中的网格文件。这里的最终目标是获取点云并确定该点云是凸的还是凹的(一旦我将云转换为网格,trimesh 允许我这样做)。我愿意接受其他图书馆来解决这个问题。
我已经尝试使用 scipy 进行 Delaunay 三角测量,但我似乎无法将我的点云转换为正确的格式,以便 trimesh 可以读取它。
import open3d as o3d
import numpy as np
import trimesh
from scipy.spatial import Delaunay
pointcloud = o3d.io.read_triangle_mesh("pointcloud.ply")
points = np.array(pointcloud.points)
triangle_mesh = Delaunay(points)
# How do i include triangle_mesh from Delaunay triangulation into processing the mesh file?
mesh = trimesh.load("pointcloud.ply")
print(trimesh.convex.is_convex(mesh))
错误
geometry::TriangleMesh appears to be a geometry::PointCloud (only contains vertices, but no triangles).
geometry::TriangleMesh with 1390073 points and 0 triangles.
expected = (faces.shape[0], faces.shape[1] * 2)
AttributeError: 'NoneType' object has no attribute 'shape'
解决方案
Open3d 0.8.0.0 现在已经实现了滚动球旋转算法来从点云重建网格。
我使用以下方法解决了从点云生成修剪网格的问题:
import open3d as o3d
import trimesh
import numpy as np
pcd = o3d.io.read_point_cloud("pointcloud.ply")
pcd.estimate_normals()
# estimate radius for rolling ball
distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radius = 1.5 * avg_dist
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
pcd,
o3d.utility.DoubleVector([radius, radius * 2]))
# create the triangular mesh with the vertices and faces from open3d
tri_mesh = trimesh.Trimesh(np.asarray(mesh.vertices), np.asarray(mesh.triangles),
vertex_normals=np.asarray(mesh.vertex_normals))
trimesh.convex.is_convex(tri_mesh)
推荐阅读
- javascript - 在绿色和红色之间切换,将有一个计数器来计算按下切换的次数
- python - django get_queryset() 和条件过滤器()
- reactjs - React TypeError:无法在 Internet Explorer 11 中重新定义不可配置的属性“错误”
- javascript - 使用 foreach() 循环元素数组时,如何从 JQuery 中模拟 $()?
- javascript - 如何在 fullcalnedar 中使用各种功能?
- c# - 根据 AppPool 用户设置临时文件位置?
- c# - 打开应用程序时设置DataList项的背景颜色
- html - 在 HTML5 中滚动文章元素时出现问题
- javascript - NPM ReactPlayer 组件在全屏视频中包含滚动条
- r - 如何在 highcharter 中应用色标?