如何在Open3D中为点云赋予已知法向量并实现泊松重建
问题解决方法
错误原因
- 变量名不匹配:你定义的法向量变量是
normals,但赋值时写成了normal,导致变量未定义。 - 法向量维度不匹配:点云有4个点,每个点必须对应一个3维法向量,而你提供的是单个3维向量,无法与点云的点数量对应,引发
RuntimeError。
修正后的代码
import numpy as np import open3d as o3d # 点云数据 xyz = np.array([[36.1162223 , 22.13427368, 0.37597846], [36.1162223 , 22.13427368, 0. ], [40.67849004, 22.13427368, 0. ], [40.67849004, 22.13427368, 0.37597846]]) # 单个法向量扩展为与点数量匹配的数组 normals = np.array([0., -1., 0.]) # 重复4次,得到(4,3)的法向量数组 point_normals = np.tile(normals, (xyz.shape[0], 1)) # 构建点云并赋值法向量 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(xyz) pcd.normals = o3d.utility.Vector3dVector(point_normals) print(pcd) # 泊松重建 with o3d.utility.VerbosityContextManager( o3d.utility.VerbosityLevel.Debug) as cm: mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( pcd, depth=9) print(mesh)
额外说明
泊松重建通常需要足够多的点云数据来生成连续曲面,你当前只有4个平面点,重建结果可能不符合预期。如果是要可视化这4个点构成的平面,直接用凸包网格生成会更合适:
# 生成凸包网格替代泊松重建 mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_convex_hull(pcd) mesh.compute_vertex_normals() o3d.visualization.draw_geometries([mesh])
内容的提问来源于stack exchange,提问作者Nima
相关产品推荐
相关产品推荐

