#include //kdtree近鄰搜尋
#include //檔案輸入輸出
#include //點型別相關定義
#include //視覺化相關定義
#include #include int main()
//2.原始點雲著色
for (size_t i = 0; i < cloud->points.size(); ++i)
//3.建立kd-tree
pcl::kdtreeflannkdtree; //建立kdtree物件
kdtree.setinputcloud(cloud); //設定需要建立kdtree的點雲指標
近鄰搜尋
pcl::pointxyzrgb searchpoint = cloud->points[1000]; //設定查詢點
int k = 900; //設定需要查詢的近鄰點個數
std::vectorpointidxnknsearch(k); //儲存每個近鄰點的索引
std::vectorpointnknsquareddistance(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::cout << "k = 900近鄰點個數:" << pointidxnknsearch.size() << endl;
半徑搜尋
pcl::pointxyzrgb searchpoint1 = cloud->points[3500]; //設定查詢點
std::vectorpointidxradiussearch; //儲存每個近鄰點的索引
std::vectorpointradiussquareddistance; //儲存每個近鄰點與查詢點之間的歐式距離平方
float radius = 0.03; //設定查詢半徑範圍
std::cout << "neighbors within radius search at (" << searchpoint.x
<< " " << searchpoint.y
<< " " << searchpoint.z
<< ") with radius=" << radius << std::endl;
if (kdtree.radiussearch(searchpoint1, radius, pointidxradiussearch, pointradiussquareddistance) > 0) }
std::cout << "半徑0.03近鄰點個數: " << pointidxradiussearch.size() << endl;
//6.顯示點雲
pcl::visualization::cloudviewer viewer("cloud viewer");
viewer.showcloud(cloud);
system("pause");
return 0;
}
官方文件:如何使用kdtree進行搜尋 KNN的優化演算法2 KD tree
傳統knn缺點 資料量特別大時,需要計算參考點和每個樣本點的距離,計算量非常大,所以提出一種優化演算法 kd tree.為了提高knn搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。kd樹 k dimension tree 是一種對k維空間中的例項點進行儲存以便對其進行快速檢索...
PCL的kdtree查詢的示例應用
首先使用系統時間初始化rand 函式的種子,然後用隨機資料填充點雲物件 srand time null pcl pointcloud ptr cloud new pcl pointcloud generate pointcloud data cloud width 1000 cloud height...
PCL系列3 Octree的使用
1.octree原理介紹 八叉樹 octree 的定義是 若不為空樹的話,樹中任一節點的子節點恰好只會有八個,或零個,也就是子節點不會有0與8以外的數目。那麼,這要用來做什麼?想象乙個立方體,我們最少可以切成多少個相同等分的小立方體?答案就是8個。再想象我們有乙個房間,房間裡某個角落藏著一枚金幣,我...