基于三维点云数据的主成分分析方法(PCA)的python实现
生活随笔
收集整理的這篇文章主要介紹了
基于三维点云数据的主成分分析方法(PCA)的python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主成分分析(PCA)獲取三維點云的坐標軸方向和點云法向量
# 實現PCA分析和法向量計算,并加載數據集中的文件進行驗證import open3d as o3d
# import os
import numpy as np
from scipy.spatial import KDTree# from pyntcloud import PyntCloud# 功能:計算PCA的函數
# 輸入:
# data:點云,NX3的矩陣
# correlation:區分np的cov和corrcoef,不輸入時默認為False
# sort: 特征值排序,排序是為了其他功能方便使用,不輸入時默認為True
# 輸出:
# eigenvalues:特征值
# eigenvectors:特征向量
def PCA(data, correlation=False, sort=True):# normalize 歸一化mean_data = np.mean(data, axis=0)normal_data = data - mean_data# 計算對稱的協方差矩陣H = np.dot(normal_data.T, normal_data)# SVD奇異值分解,得到H矩陣的特征值和特征向量eigenvectors, eigenvalues, _ = np.linalg.svd(H)if sort:sort = eigenvalues.argsort()[::-1]eigenvalues = eigenvalues[sort]eigenvectors = eigenvectors[:, sort]return eigenvalues, eigenvectorsdef main():# 從txt文件獲取點,只對點進行處理filename = "D:\pointcloud_processing\modelnet40_normal_resampled\\airplane\\airplane_0001.txt"points = np.loadtxt(filename, delimiter=',')[:, 0:3] # 導入txt數據到np.array,這里只需導入前3列print('total points number is:', points.shape[0])# 用PCA分析點云主方向w, v = PCA(points) # PCA方法得到對應的特征值和特征向量point_cloud_vector = v[:, 0] #點云主方向對應的向量為最大特征值對應的特征向量print('the main orientation of this pointcloud is: ', point_cloud_vector)# 三個特征向量組成了三個坐標軸axis = o3d.geometry.TriangleMesh.create_coordinate_frame().rotate(v, center=(0, 0, 0))# 循環計算每個點的法向量leafsize = 32 # 切換為暴力搜索的最小數量KDTree_radius = 0.1 # 設置鄰域半徑tree = KDTree(points, leafsize=leafsize) # 構建KDTreeradius_neighbor_idx = tree.query_ball_point(points, KDTree_radius) # 得到每個點的鄰近索引normals = [] # 定義一個空list# -------------尋找法線---------------# 首先尋找鄰域內的點for i in range(len(radius_neighbor_idx)):neighbor_idx = radius_neighbor_idx[i] # 得到第i個點的鄰近點索引,鄰近點包括自己neighbor_data = points[neighbor_idx] # 得到鄰近點,在求鄰近法線時沒必要歸一化,在PCA函數中歸一化就行了eigenvalues, eigenvectors = PCA(neighbor_data) # 對鄰近點做PCA,得到特征值和特征向量normals.append(eigenvectors[:, 2]) # 最小特征值對應的方向就是法線方向# ------------法線查找結束---------------normals = np.array(normals, dtype=np.float64) # 把法線放在了normals中# o3d.geometry.PointCloud,返回了PointCloud類型pc_view = o3d.geometry.PointCloud(points=o3d.utility.Vector3dVector(points))# 向PointCloud對象中添加法線pc_view.normals = o3d.utility.Vector3dVector(normals)# 可視化o3d.visualization.draw_geometries([pc_view, axis], point_show_normal=True)if __name__ == '__main__':main()
總結
以上是生活随笔為你收集整理的基于三维点云数据的主成分分析方法(PCA)的python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谁能告诉我音乐天使发值多少?
- 下一篇: 最近3月份院线上映的电影推荐