KDTree搜索树
//利用KDTree近邻搜索
//k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索
// (如:范围搜索和最近邻搜索)。
//K-D树是二进制空间分割树的特殊的情况。
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>
#include<pcl/search/kdtree.h>// 包含kdtree的头文件
using namespace std;
typedef pcl::PointXYZ PointT;
template <typename T>// 模板函数输出
void printVector(T& a) {
for (size_t i = 0; i < a.size(); i++)
{
cout << a[i] << endl;
}
}
int main() {
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
if (pcl::io::loadPCDFile("rabbit.pcd", *cloud) == -1) {
PCL_ERROR("打开文件失败");
return -1;
}
cout << "读取点云文件的大小为:" << cloud->size() << endl;
//定义KDTree对象
pcl::search::KdTree<PointT>::Ptr kdtree(new pcl::search::KdTree<PointT>);
//设置要搜索的点云
kdtree->setInputCloud(cloud);
// 存储查询近邻点的索引
vector<int> indices;
//存储近邻点对应距离的平方
vector<float> distances;
//初始化一个查询点
PointT point = cloud->points[0];
cout << "查询的初始点为:" << point << endl;
// 查询距离point最近的k个点
int k = 10;
int size = kdtree->nearestKSearch(point, k, indices, distances);
cout << "----------K近邻查询的结果为----------:" << size << endl;
printVector<vector<int>>(indices);
printVector<vector<float>>(distances);
//查询半径为r的邻域内的点
double r = 0.2;
size = kdtree->radiusSearch(point, r, indices, distances);
cout << "----------邻域查询的结果为-----------:" << size << endl;
printVector<vector<int>>(indices);
printVector<vector<float>>(distances);
system("pause");
return 0;
}
参考链接:https://github.com/MNewBie/PCL-Notes/blob/master/chapter2.md
https://zhuanlan.zhihu.com/p/268524083