3D 24 PCA點雲法向量估計

2021-08-20 12:21:39 字數 1838 閱讀 3444

點雲法向量的估計在很多場景都會用到,比如icp配準,以及曲面重建。

基於pca的點雲法向量估計,其實是從最小二乘法推導出來的。假設我們要估計某一點的法向量,我們需要通過利用該點的近鄰點估計出乙個平面,然後我們就能計算出該點的法向量。或者可以這麼說,通過最小化乙個目標函式(要求的引數為法向量),使得該點與其每個近鄰點所構成的向量與法向量的點乘為0,也就是垂直:

正常情況下,我們可以將點c看成是某一領域中所有點的中心點: m=

1n∑i

=1nx

i m=1

n∑i=

1nxi

同時: yi

=xi−

m yi=

xi−m

這樣,優化目標函式變為:

我們進一步對目標函式進行推導:

上面的優化目標函式等於: f(

n)=n

tsn其

中,s=

(yyt

)min

(f(n

))s.

t.nt

n=1 f(n

)=nt

sn其中

,s=(

yyt)

min(

f(n)

)s.t

.ntn

=1其中,yy

t yy

t是乙個3×3的協方差矩陣,x,y,z座標的協方差矩陣。

對於這種有約束的優化目標函式,我們可以用拉格朗日演算法進行求解:

λn?有沒有很眼熟,其實就是線性代數裡面的特徵值和特徵向量的相關公式。也即是,

λ λ

是矩陣s的特徵值,法向量是對應的特徵向量。

所以法向量n的求解就是要對s進行向量分解。然後取特徵值最小的特徵向量作為求解的法向量。這個過程也就是pca的乙個標準求解過程,將每個鄰域點與該鄰域的中心點相減,得到乙個n×3的矩陣。接著,用svd對該矩陣進行分解,得到: y=

uσv∗

y =u

σv∗u中最後一列就是要求解的法向量n,也就是特徵值最小的特徵向量。

為什麼是特徵值最小的?我個人理解是:pca的協方差矩陣的特徵值越大,其特徵向量就越能夠描述資料的特徵。越小就越不能區分樣本之間的不同,也就是表徵了資料中的共性。在我們的優化目標函式中,就是要為所有的鄰域點尋找乙個平面,使得所有的鄰域點都在這個平面上,或者說所有點與該平面的距離最小,而不是而不是最大。而這個平面就是能夠描述這些點的共性,即他們的法向量都一樣。

也可以用另外乙個求法,直接對協方差矩陣s,求解特徵值和特徵向量,然後取最小的特徵值對應的特徵向量。另外,也不一定用中心點m作為c,可以用點雲中要求解法向量的頂點作為頂點c。

在求出法向量後還需要判斷法向量的方向,一般來說法向量方向的矯正沒有嚴格的數學公式可以使用。比較簡單的方法是通過視點方向進行判斷。比如我的視點方向是(0,0,1),那麼求出來的法向量跟(0,0,1)進行點乘,如果小於0,就將法向量取反。更複雜的方法是使用最小生成樹對法向量進行方向矯正。

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

最近報了個點雲學習的網課,前段時間因為各種問題,落下了很多課程,今天開始要好好搞起來了 python真的有點難,之前很少用,也藉著這次課程好好學習一下python 雖然pcl一些現成的庫裡面封裝了pca,但是自己寫出來,雖然是照著別人抄的,但是一點一點搞懂,也是有成就感的 import open3d...

3D點雲法向量估計 最小二乘擬合平面

1 點雲法向量估計的主要思路是對k 近鄰的n個點進行平面擬合 平面過n點重心 平面法向量即為所求 2 最小二乘擬合可以轉換為求協方差矩陣最小特徵值對應的特徵向量 svd分解 此種解法對資料雜訊有很強的魯棒性,關鍵點在於要對資料去中心化處理,將座標原點移動到資料重心。3 最後根據特徵點p到重心oi形成...

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

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