import open3d as o3d
import numpy as np
from matplotlib import pyplot as plt
def compute_planarity(pcd, k=30):
"""
计算点云的面状指数(Planarity Index)。
参数:
pcd (): 输入点云。
k (int): 每个点的邻域点数量。
返回:
: 面状指数数组,长度与点云中的点数相同。
"""
# 使用 KD-Tree 来查找每个点的邻域
pcd_tree = (pcd)
planarity_indices = (len())
# 遍历每个点,计算其面状指数
for i in range(len()):
# 查找邻域点
[_, idx, _] = pcd_tree.search_knn_vector_3d([i], k)
neighbors = ()[idx, :]
# 计算协方差矩阵
cov_matrix = ()
# 计算特征值
eigenvalues, _ = (cov_matrix)
# 对特征值排序
eigenvalues = (eigenvalues)
# 计算面状指数 (Planarity Index)
planarity_index = (eigenvalues[1] - eigenvalues[0]) / eigenvalues[2]
planarity_indices[i] = planarity_index
return planarity_indices
# 加载点云
pcd = .read_point_cloud("standford_cloud_data\")
.draw_geometries([pcd],window_name="原始点云",width=1024,height=768,)
# 计算点云的面状指数
planarity_indices = compute_planarity(pcd)
# 可视化面状指数(使用颜色映射)
colors = plt.get_cmap("viridis")(planarity_indices / max(planarity_indices))
= .Vector3dVector(colors[:, :3])
# 显示点云和面状指数
.draw_geometries([pcd],window_name="处理后点云",width=1024,height=768,)