PCL学习笔记Day2

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

猜你喜欢

转载自blog.csdn.net/weixin_44135909/article/details/121371753