点云学习(3)-奇异值分解&表面曲率

1.奇异值分解

average_data = np.mean(data, axis=0)  # 求均值
decentration_matrix = data - average_data  # 去中心化
H = np.dot(decentration_matrix.T, decentration_matrix)  # 求解协方差矩阵 H
eigenvectors, eigenvalues, eigenvectors_T = np.linalg.svd(H)  # SVD求解,特征向量,特征值

2.求表面曲率

cloud = o3d.io.read_point_cloud("C:/Users/HP/Desktop/Open3D/pcl-learning/data/table_scene_lms400_downsampled.pcd")

kdtree = o3d.geometry.KDTreeFlann(cloud)
num_points = len(cloud.points)
points = np.asarray(cloud.points)
k, idx, _ = kdtree.search_radius_vector_3d(cloud.points[100], 0.03)

neighbors = points[idx, :]

data=neighbors

average_data = np.mean(data, axis=0)  # 求均值
decentration_matrix = data - average_data  # 去中心化
H = np.dot(decentration_matrix.T, decentration_matrix)  # 求解协方差矩阵 H
eigenvectors, eigenvalues, eigenvectors_T = np.linalg.svd(H)  # SVD求解特征值、特征向量

if 1:
    sort = eigenvalues.argsort()[::-1]  # 降序排列
    eigenvalues = eigenvalues[sort]  # 索引
w=eigenvalues
delt = np.divide(w[2], np.sum(w), out=np.zeros_like(w[2]), where=np.sum(w) != 0)

注:

np.divide() 将第一个数组中的数组元素除以第二个元素中的元素(所有情况均逐个元素发生)。 arr1和arr2必须具有相同的形状,并且arr2中的元素不能为零;否则会引发错误。

W_update=np.zeros_like(W):函数主要是想实现构造一个矩阵W_update,其维度与矩阵W一致,并为其初始化为全0;这个函数方便的构造了新矩阵,无需参数指定shape大小

你可能感兴趣的:(Open3D学习,大数据)