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 的,基於雜湊 ...