· 法向量
1.怎么去找點雲里面每一個點的法向量呢?
什么是法向量呢?
如果能用一個曲面去擬合數據
應用:
目標檢測
分割
怎么找法向量呢(其實是PCA的一個應用,找的是最沒用的向量)
所謂最沒用的點,言外之意就是數據投影在這些向量上面數據為0
具體操作步驟:
1.先選取一個點,我們想要找他的法向量
2.然后找這個點的鄰域,因為只有確定了鄰域我們才能知道這個點的法向量嘛
3.選出鄰域以后在鄰域里面的這些點做PCA
4.然后選取的法向量其實是最不顯著的向量,也就是特征值最小的特征向量
5.曲率:
找到一個平面,使得能與這個平面擬合的點投影到平面的法向量上的投影和最小
一個向量跟一個向量的乘積其實就是一個向量在另一個向量上的投影
怎么選鄰域?
如果鄰域半徑非常大,估算出來的法向量會相對比較平滑,如果是非常精細的結構,那所求的法向量不太准確。
如果鄰域非常小,可以比較精確地描述小范圍,也會收到zhaosheng的影響
如果點雲帶顏色的,或者反射率,但選顏色一樣的作為鄰域
有一個第四節課會說到的RANSAC
深度學習
帶加權的法向量運算
凡是不知道怎么做的事情,就凡事丟給神經網絡
Scale 就是做了三層
小的特征感知域比較小
大的特征感知域比較大
感知域一個特征點或一個結果,一個scale越大,能看到的東西越多
點雲里的法向量估計也可以用deep learning去做
· 濾波
應用廣泛
·噪聲去除
使場景變得更為干凈
·降采樣
例如一開始有一千個點描述一個場景,但實際上我用一百個點就可以描述了,將一千個點變為一百個點的過程就是降采樣。
保存對象特征的同時減少點的運算
·上采樣
沒有的東西我們把它創造出來
就是估算,比較少用
好處是能把車的輪廓較好的保存
MED:中值濾波
AVE:平均值濾波
##點雲上的噪聲去除
第一個方法:Radius Outlier Removal
有很多點雲,對某一個點,都划定一個鄰域,就是一個半徑為d的圓。如果是三維,就可以是球
然后我們數一下每一個點在半徑為d的鄰域里有幾個點,如果這個點的數量少於一定數值,就把他去掉
這個數量由你規定。
實用的算法,實現簡單
第二個方法:Statistical Outlier Removal
統計版的removal,就是升級版的Radius Outlier Removal
1.找每個點的鄰域,還是畫圓,但是這時候不熟點的數量,而是算鄰居離我自己的距離dij
i是我自己這個點,j是鄰居
然后算距離的平均值和方差
就可以得到平均下來這些dij應該是怎樣的,還是同樣找,如果鄰居的距離大於平均值3∑的就去掉。
閾值是動態的。
##voxel grid降采樣
功能效果:降低點的數量,使在后面的算力更少。
操作步驟:
舉例子,一個框框里有很多個點,你可以先在原本的框框里划分,然后找一個點出來。
這個特別的點要怎么找呢?是隨便找嗎?
要么隨便找,要么平均值
如何使降采樣過程更高效?
如果有很多點都落在一個框框里,那就取框框里的平均值作為降采樣的結果。
每個點都有一個標簽,比如這個點是一個人的點或一個是車的點,這種是無法求平均值的。
此時會進行投票
隨意選點容易錯誤
下面是一個類似於一個偽代碼的做降采樣的過程
首先給一堆n維的點
然后怎么畫框框呢?要先觀察,看這些點能不能用一個巨大的框框表現
只有先得到大框才能繼續划分小框
求max,每個坐標都要求
求voxel grid 的分辨率
也就是小格子要多大
算每個點會落在哪個格子上面去
flow操作?選取離他最近的整數
最后做一個排序,得到的結果的意思是有四個點落在h=0這個格子里,有三個點落在h=3這個格子里。
在實現降采樣的過程中,要注意一些問題:
①假如我把小格子的分辨率設的特別小,然而我們需要處理的點又很大。防止溢出問題
②排序問題,要用小於,不要用小於等於
排序算法需要N*logN 但是這個N是很大的。對十幾萬個點進行降采樣是需要好幾毫秒的,那我們能不能加速這個過程呢?其實是可以的。
利用一個特性:空間中大部分的空間是沒有點的。
如果我們有一萬個點,假設說我們最后得到95個點,如果我們有個神奇的函數,投射到一百個容器里面去,那就取非空的容器。
那這個神奇的函數是什么呢?
hash表
那具體來說怎么操作呢?
前面四步准確來說跟voxel grid 是一樣的。
①算最大值、最小值,取出一個最大的框框
②找到分辨率
③算一下voxel grid 的每個方向上面的格子的數量
算每個點在voxel grid 的位置,也就是h
定義一個hash函數,將三個方向上的h(hx,hy,hz)映射成一個數字
這個數字代表了這個容器的位置。
hash函數有可能將兩個隔得很遠的點放到一個容器里面去。
兩個點經過hash函數后是一樣的,但他們其實距離是很遠的,這就是沖突。
所以如何解決沖突的hash函數呢?
就把被沖突的容器的點先釋放出去,把新來的點占到容器里。
檢測沖突:值一樣,但是那個不一樣