PCL k d tree近鄰搜尋

2021-10-02 02:41:53 字數 2361 閱讀 1280

pcl中k-d tree庫提供看k-d tree資料結構,基於flann進行進行快速最近鄰搜尋,在匹配、特徵描述子計算、鄰域特徵提取中的基礎核心操作。

建立k-d tree樹的步驟:

建立根節點

選取方差最大的特徵作為分割特徵

選擇該特徵的中位數作為分割點

特徵《中位數放在左邊,>中位數放在右邊

遞迴2-4,所有資料被建立k-d tree

k-d tree 緊鄰搜尋

一種是範圍查詢,範圍查詢時給定查詢點和查詢距離閾值,從資料集中查詢所有與查詢點距離小於閾值的資料;

另一種是k近鄰查詢,就是給定查詢點及正整數k,從資料集中找到距離查詢點最近的k個資料,當k=1時,它就是最近鄰查詢。

步驟:建立kdtreeflann物件,將點雲設定成輸入;

建立乙個searchpoint變數作為查詢點;

建立乙個整數和兩個向量儲存搜尋的k近鄰;

同理建立乙個整數和兩個向量儲存搜尋的半徑範圍近鄰;

**實現

#include

#include

#include

#include

#include

intmain

(int argc,

char

** ar**)

//建立乙個kd_tree

pcl::kdtreeflann<:pointxyz> kdtree;

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);

// 最近鄰搜尋

int k =10;

std::vector<

int>

pointidxnknsearch

(k);

std::vector<

float

>

pointnknsquareddistance

(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)

// 按照範圍搜尋,按照給定的半徑進行搜尋

std::vector<

int> pointidxradiussearch;

std::vector<

float

> pointradiussquareddistance;

float radius =

256.0f

*rand()

/(rand_max +

1.0f);

std::cout <<

"neighbors within radius search at ("

<< searchpoint.x

<<

" "<< searchpoint.y

<<

" "<< searchpoint.z

<<

") with radius="

<< radius << std::endl;

if(kdtree.

radiussearch

(searchpoint, radius, pointidxradiussearch, pointradiussquareddistance)

>0)

return0;

}

結果:

PCL KD TREE搜尋R半徑鄰域內點雲

小 需要在pcl中選擇關鍵點一定鄰域內的點雲,在這裡記錄顯示單個點鄰域點雲的方法。搜尋source關鍵點周圍的點雲 建立kdtree 結構 pcl kdtreeflannkdtree 傳入點雲 source ransac keypoint trans kdtree.setinputcloud sou...

近鄰搜尋演算法

最近鄰搜尋 nearest neighbor search name of the problem 常見的近鄰搜尋庫包括ann,flnn,當然八叉樹也可以實現近鄰搜尋。也可以通過狄洛尼三角網實現近鄰的判斷。1.k近鄰搜尋 近似近鄰搜尋 2.k d樹 3.r樹 對應點的matlab顯示 fileid ...

最近鄰搜尋和近似最近鄰搜尋(NN和ANN)和庫

這樣查詢返回的前k個向量並不一定是最相似的k個向量,衡量ann演算法好不好的乙個依據是召回,每次ann請求返回的k個結果與使用暴力查詢的k個結果去比較,如果完全一致,說明是最好的。因為省了搜尋時間卻沒有影響效果。目前的ann演算法有基於圖 hnswlib 的,基於樹 pysparnn 的,基於雜湊 ...