kdTree介紹以及PCL示例

2021-09-25 04:20:16 字數 2801 閱讀 6680

kdtree概念

kd-tree或者k維樹是電腦科學中使用的一種資料結構,用來組織表示k維空間中點的集合。它是一種帶有其他約束條件的二分查詢樹。kd-tree對於區間和近鄰搜尋十分有用。一般位於三維空間中的鄰域搜尋常用kd-tree,因此本文中所有的kd-tree都是三維的kd-tree。

圖一kd-tree也是二叉樹的一種,首先我們先選定乙個維度用於第一次分類,如圖一所示,我們先選擇x維度方向作為分類方向,隨機選取乙個值使得小於該值的點位於左邊,大於該值的點位於右邊。在左右區域分別再對第二個維度進行分類,這裡以y軸方向作為第二維度,同理根據y分類設定z軸方向為第三維度進行分類。

kd-tree資料結構定義

node-data:資料向量,資料集中某個資料點,是n維向量(總維度,unsigned int)

range:空間向量,該節點所代表的的空間範圍(二維陣列)

split:整數,垂直於分割超平面的方向軸序號(int)

left:k-d樹,由位於該節點分割超平面左側子空間內所有點構成的k-d樹(tuple)

right:k-d樹,由位於該節點分割超平面右側子空間內所有點構成的k-d樹(tuple)

parent:k-d樹,父節點(auto)

kd-tree優化

方案一:kd-tree通過不同維度劃分資料,節點的選擇顯得尤為重要。我們可以想象一組點雲,並不是完全隨機離散的,只在某一維度上點雲分布較為離散,其餘維度相對集中。以三維空間為例,一組類似球狀的點雲在求每個方向的子節點能保證效率是最高的,但是資料接近乙個平面時,在其中乙個維度的劃分就顯得十分困難。

解決方法:首先,對於點雲分布不集中的那一維度來說,方差較大,我們可以通過最大方差法選擇每次需要分類的維度,即在每次進行新的劃分之前,我們通過判斷方差選擇在哪個維度上進行劃分。

方案二:為了保證每次選擇的節點盡量位於中間位置,也就是讓二叉樹盡量為二叉平衡樹,從而保證節點兩側的點雲數目大致相等。

解決方法:在選取節點前,我們對資料進行排序,選取中位數作為節點,這樣就能保證兩側資料大致相等。

pcl示例:

#include #include #include #include #include int main(int argc, char**ar**)

pcl::kdtreeflannkdtree;//迴圈建立kd-tree物件

kdtree.setinputcloud(cloud); //設定搜尋空間即輸入點雲

pcl::pointxyz searchpoint; //定義查詢點,並隨機賦值

searchpoint.x = 1024.0f* rand() / (rand_max + 1.0f);

searchpoint.y = 1024.0f* rand() / (rand_max + 1.0f);

searchpoint.z = 1024.0f* rand() / (rand_max + 1.0f);

// k近鄰搜尋

int k = 10;

std::vectorpointidxnknsearch(k); //儲存查詢點近鄰索引

std::vectorpointnknsquareddistance(k);//儲存近鄰點對應平方距離

// 列印查詢點鄰域內的k個鄰近點

std::cout << "k nearest neighbor search at (" << searchpoint.x

<< " " << searchpoint.y

<< " " << searchpoint.z

<< ") with k=" << k << std::endl;

if (kdtree.nearestksearch(searchpoint, k, pointidxnknsearch, pointnknsquareddistance) > 0)

// 在半徑r內搜尋近鄰

std::vectorpointidxradiussearch; //儲存查詢點近鄰索引

std::vectorpointradiussquareddistance;//儲存近鄰點對應平方距離

float radius = 256.0f* rand() / (rand_max + 1.0f);

// 列印查詢點鄰域r範圍內的鄰近點

PCL的kdtree查詢的示例應用

首先使用系統時間初始化rand 函式的種子,然後用隨機資料填充點雲物件 srand time null pcl pointcloud ptr cloud new pcl pointcloud generate pointcloud data cloud width 1000 cloud height...

介紹KdTree演算法

入門,學習kdtree 首先,這是一種分割k維資料空間的資料結構,目的是能夠快速查詢某個資料,是一種帶有約束得二分查詢樹,能起到一種加速作用。首先插上這張圖,一張我看了n多部落格都用的經典圖 在此處用最簡單得二維資料來介紹,其餘同。假設有6個二維資料點,資料點 位於二維空間內 如圖1中黑點所示 k ...

PCL系列2 Kd Tree的使用

include kdtree近鄰搜尋 include 檔案輸入輸出 include 點型別相關定義 include 視覺化相關定義 include include int main 2.原始點雲著色 for size t i 0 i cloud points.size i 3.建立kd tree p...