法向量
计算法向量的接口函数:
Open3d使用estimate_normals函数来计算法向量。其参数设置Open3d提供了3中参数搜索的方法(所有计算的法向量模长为1):
open3d.geometry.KDTreeSearchParamKNN(knn=20) # 计算近邻的20个点
open3d.geometry.KDTreeSearchParamRadius(radius=0.01) # 计算指定半径内的点
open3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=20) # 同时考虑搜索半径和近邻点个数
法线朝向:
#自定义主方向
orient_normals_to_align_with_direction(self, orientation_reference=None, *args, **kwargs)
#相机方向
orient_normals_towards_camera_location(self, camera_location=None, *args, **kwargs)
#最小生成树
orient_normals_consistent_tangent_plane(self, k)
接口测试:
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("bunny.pcd")
pcd.paint_uniform_color([1.0, 0.0, 0.0])
pcd_sampled = pcd.uniform_down_sample(every_k_points=10)
pcd_sampled.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
# 自定义法线朝向
pcd_sampled.orient_normals_to_align_with_direction([0, 0, 1])
# 可视化点云和法线
o3d.visualization.draw_geometries([pcd_sampled], point_show_normal=True, mesh_show_back_face=False)
# # 最小生成树
# pcd_sampled.orient_normals_consistent_tangent_plane(6)
# o3d.visualization.draw_geometries([pcd_sampled], point_show_normal=True, mesh_show_back_face=False)
# # 相机方向
# pcd_sampled.orient_normals_towards_camera_location()
# o3d.visualization.draw_geometries([pcd_sampled], point_show_normal=True, mesh_show_back_face=False)