2.KDTree相关

1.理论:

k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。

详细介绍见【量化课堂】kd 树算法之详细篇 - JoinQuant量化课堂 - JoinQuant(侵删)

例如:特征点匹配通过距离函数在高维矢量之间进行相似性检索的问题。针对如何快速而准确地找到查询点的近邻,现在提出了很多高维空间索引结构和近似查询的算法,k-d树就是其中一种。

索引结构中相似性查询有两种基本的方式:一种是范围查询,另一种是K近邻查询:

  • 范围查询(range searches):给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据
  • K近邻查询(K-neighbor searches):给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询(nearest neighbor searches)。

kdtree的结构:kd树是一个二叉树结构,它的每一个节点记载了【特征坐标,切分轴,左指针,右枝指针】。

kd 树的构造以及 kd 树上的 kNN 算法见上方连接。

2.PCL中对于kdtree的支持:

PCL中类pcl::KdTree<PointT>是kd-tree数据结构的实现。并且提供基于FLANN进行快速搜索的一些相关子类与包装类。具体可以参考相应的API。下面给出2个类的具体用法。

pcl::search::KdTree < PointT >

pcl::search::KdTree<PointT>pcl::search::Search< PointT >的子类,是pcl::KdTree<PointT>的包装类。包含(1) k 近邻搜索;(2) 邻域半径搜索。

#pragma once
#include<pcl/search/kdtree.h>
#include<pcl/point_types.h>
#include<pcl/io/pcd_io.h>
#include<vector>
void kdtreeTest1()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile("do1.pcd", *cloud);

	pcl::search::KdTree<pcl::PointXYZ>tree;
	tree.setInputCloud(cloud);

	std::vector<int>indices;//存放查询到的索引
	std::vector<float>distance;//存放对应距离的平方
	//设一个查询点
	pcl::PointXYZ pointq = cloud->points[0];
	//查询离pointq最近的K个点
	int k = 3;
	int size = tree.nearestKSearch(pointq, k, indices, distance);

	std::cout << "k search result size is " << size<<std::endl;
	//查询pointq半径r范围领域内的点
	double r = 2.0;
	size = tree.radiusSearch(pointq, r, indices, distance);
	std::cout << "r search result size is " << size;

}

 

 搜索结果默认是按照距离point点的距离从近到远排序;如果InputCloud中含有point点,搜索结果的的第一个点是point本身。

pcl::KdTreeFLANN < PointT >

pcl::KdTreeFLANN<PointT>pcl::KdTree<PointT>的子类,可以实现同样的功能。

#pragma once
#include<pcl/kdtree/kdtree_flann.h>
#include<pcl/point_types.h>
#include<pcl/io/pcd_io.h>
#include<vector>
void kdtreeTest2()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile("do1.pcd", *cloud);

	//pcl::search::KdTree<pcl::PointXYZ>tree;
	pcl::KdTreeFLANN<pcl::PointXYZ>tree;
	tree.setInputCloud(cloud);

	std::vector<int>indices;
	std::vector<float>distance;
	//设一个查询点
	pcl::PointXYZ pointq = cloud->points[0];
	//查询离pointq最近的K个点
	int k = 3;
	int size = tree.nearestKSearch(pointq, k, indices, distance);

	std::cout << "k search result size is " << size<<std::endl;
	//查询pointq半径r范围领域内的点
	double r = 2.0;
	size = tree.radiusSearch(pointq, r, indices, distance);
	std::cout << "r search result size is " << size;

}

结果一样,略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值