kd-tree基本概念
-
kd-tree(k-dimensional tree)是一种用于组织表示 k 维空间中点集合的数据结构。
-
kd-tree是扩展的二叉排序树,K为空间的维度,通过一定规律将点云数据按树状分类。假设分类节点 A 用第 i 维作划分标准,则在第 i 维的值小于 A 的归到左边,大于 A 的归到右边。
-
kd-tree建立的关键在于确定怎样划分左子树和右子树,即一个K维数据是依据什么被划分到左子树或右子树的。
例:2-D(K=2)树的建立过程
对于由点A(51,56)、B(31,54)、C(61,41)、D(26,81)、E(91,11)、F(86,71)组成的集合:
B点的 X 值(31)< A(51),归到左边;C点的 X 值(61)>A(51),归到右边。 -
对于点云数据,树的每一级都在在一个维度上分开,所有维度用完后便回到第一个维度,直到最后一个分支上只有一个元素。
kd-tree对点云数据的应用
- 根据点云数据生成k-d树,建立点云的拓扑关系,实现基于邻域关系的快速查找。最近邻搜索是使用点云数据时的核心操作,可用于查找点组或特征描述符之间的对应关系或定义一个或多个点周围的局部邻域。
pcl中的kd-tree模块
pcl库中提供了kd-tree数据结构,基于FLANN进行快速最近邻检索。
- 类 class pcl ::KdTree< PointT > 为kd-tree数据结构的实现。
- 类 class pcl ::KdTreeFLANN< PointT, Dist > 具有近邻搜索实现功能。
基本函数
- void pcl::getApproximateIndices (const typename pcl::PointCloud< PointT >::ConstPtr &cloud_in, const typename pcl::PointCloud< PointT >::ConstPtr &cloud_ref, std::vector< int > &indices) 获取给定点云到参考点云的一组近似索引。