點雲法向量的估計在很多場景都會用到,比如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...