點雲學習 PCA演算法實現與法向量估計

2021-10-05 17:11:49 字數 1914 閱讀 7296

最近報了個點雲學習的網課,前段時間因為各種問題,落下了很多課程,今天開始要好好搞起來了~~

python真的有點難,之前很少用,也藉著這次課程好好學習一下python

雖然pcl一些現成的庫裡面封裝了pca,但是自己寫出來,雖然是照著別人抄的,但是一點一點搞懂,也是有成就感的~~

import open3d as o3d

import os

import numpy as np

from pyntcloud import pyntcloud

from pandas import dataframe

def main():

points = np.genfromtxt("d:/desktop/深藍學院/airplane_0006.txt", delimiter=",")

points = dataframe(points[:, 0:3]) # 選取每一列 的 第0個元素到第二個元素 [0,3)

points.columns = ['x', 'y', 'z'] # 給選取到的資料 附上標題

point_cloud_pynt = pyntcloud(points) # 將points的資料 存到結構體中

point_cloud_o3d = point_cloud_pynt.to_instance("open3d", mesh=false) # to_instance例項化

data_mean = np.mean(points, axis=0) #對列求取平均值

# 歸一化

normalize_data = points - data_mean

# svd分解

# 構造協方差矩陣

h = np.dot(normalize_data.t, normalize_data)

# svd分解

eigenvectors, eigenvalues, eigenvectors_t = np.linalg.svd(h) # h = u s v

# 逆序排列

sort = eigenvalues.argsort()[::-1]

eigenvalues = eigenvalues[sort]

eigenvectors = eigenvectors[:, sort]

print(eigenvectors[:, 0]) #最大特徵值 對應的特徵向量,即第一主成分

print(eigenvectors[:, 1]) #第二主成分

#在原點雲中畫圖

point = [[0, 0, 0], eigenvectors[:, 0], eigenvectors[:, 1]] # 提取第一v和第二主成分 也就是特徵值最大的對應的兩個特徵向量 第乙個點為原點

lines = [[0, 1], [0, 2]] # 有點構成線,[0, 1]代表點集中序號為0和1的點組成線,即原點和兩個成分向量劃線

colors = [[1, 0, 0], [0, 1, 0]] # 為不同的線新增不同的顏色

# 構造open3d中的 lineset物件,用於主成分的顯示

利用Eigen庫,PCA構建點雲法向量

疫情在家,想做科研,可是資料都在學校電腦裡面。只能看看能不能回想起什麼寫點什麼。這次主要是想把提取出的點雲patch單獨進行點雲法向量的計算,因為已經構成patch,則不需使用knn或者設定鄰域半徑。接下來手撕 pca 來構建點雲法向量。1 define crt secure no warnings...

3D 24 PCA點雲法向量估計

點雲法向量的估計在很多場景都會用到,比如icp配準,以及曲面重建。基於pca的點雲法向量估計,其實是從最小二乘法推導出來的。假設我們要估計某一點的法向量,我們需要通過利用該點的近鄰點估計出乙個平面,然後我們就能計算出該點的法向量。或者可以這麼說,通過最小化乙個目標函式 要求的引數為法向量 使得該點與...

PCA解決三維點雲法向量問題

pca 主成分分析法,也可以用於處理三維點雲得到三維點雲的特徵向量,一直不是很理解為什麼分析點雲的主成分可以得到法向量,最近略有感悟,稍作分享。使用pca計算的點雲的過程可以看做是優化函式的過程 也可以這麼理解 點雲中的每乙個點和點雲中點組成乙個向量,這些小向量與最終想要求得的法線的向量積的平方和最...