三維點雲處理|點雲里的每個點如何去尋找鄰近點(一)


##最常用來解決這個問題的是八叉樹和KD樹 

但我們在講這些之前要先了解二叉樹,畢竟二叉樹是這些的基礎。

 

先講以下兩種方法

 

· K-NN

就是直接找三個最近的點,三個。

 

紅色的點就是我們要查找的點,綠色和藍色的點就是我們數據庫里的點,而綠色的點是我們所找到的鄰近點。

· Fixed Radius-NN

在中心點紅點以某半徑畫一個圈,在圈內的點都算鄰近點。

 

思考:為什么找鄰域問題很重要?

因為我們常要用到,在之前講到的法向量估計中也需要用到找鄰域,上采樣和降采樣或者噪聲去除我們都會用到NN方法。

既然重要,一定有很多開源的方法和包(PCL,flann等)。但是很遺憾,他們都不夠快。如果自己寫,大概率會比較快。

現在GPU都已經滿大街了,但是在GPU上面的最鄰近算法很少也很慢。

(GPU雲服務器是基於異構計算提供的超強的浮點計算能力服務,適用於深度學習,智能視頻分析,醫療影像分析,語音識別,高性能計算等應用場景。

用戶可根據自身需求靈活搭配。讓您即刻擁有非凡的計算能力。)

 

思考:為什么在點雲上的鄰域問題很困難呢?

第一個原因就是點雲不規則

第二個原因是點雲可以是三維的,三維比二維高一維,但是三維的數據點是指數上升的。用網格處理並不是很高效。

 

 

##二叉樹

用於處理一維的數據

##八叉樹

專門為了三維數據設計的

##KD樹

可以任意維度,但是常用於二維來做例子

 

以上三點都有一個共同的核心思想:空間分割

空間分割:

分割完以后有一些小的空間不需要去查找,那此時如何跳過這些小區域呢?

如何更快地結束搜索?

 

 

二叉樹

 

要滿足左邊的數字都比核心主干的數字小(在圖中的核心主干數字是8)

右邊要比中間的大

左邊和右邊又是一個小的二叉樹

 

在計算機科學的開端就發明了(1960)

 

那么如何用代碼實現二叉樹呢?

 

 

結合上上圖,每一個圈就是一個節點,每一個節點都有一個key,用來表達key的特征

左邊的節點和右邊的節點有還是無

value是別的因素,例如節點的顏色和編號

 

首先搞定一個問題,首先給定我們一堆的數字,也就是一維數組

怎么構建二叉樹來表達我們的信息?

現在假設我們有一個一維數組【100, 20, 500, 10, 30, 40】

首先放100

總結起來,怎么把一個數據放到二叉樹里面呢?如果被占據就跟被占據的那個數比較

轉換成代碼就是如下:

 

 

##給定一個數據點,怎么去查找這個數據點是否存在於二叉樹里面?

查找可以用遞歸或者循環

以下代碼是用遞歸查找

 

 那么怎么用循環去實現呢?

首先要了解 堆棧 的概念,如果要避免遞歸問題,就要手動去實現一個棧。

 

 遞歸的好處:實現起來更容易和更理解,不用手動維護查到哪里了

壞處:不停壓棧,在內存的某些地方記錄了,有多少層就要放多少層棧的信息

循環的話,用一個變量來代表我現在在什么地方。

它可以用在GPU上面。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM