KdTree背景知识
KdTree(也称k-d树)是一种用来分割k维数据空间的高维空间索引结构,其本质就是一个带约束的二叉搜索树,基于KdTree的近似查询的算法可以快速而准确地找到查询点的近邻,经常应用于特征点匹配中的相似性算法。
而索引结构中相似性查询算法有两种基本的方式:一种是范围查询(radius searches),另一种是K近邻查询(K-neighbor searches)。范围查询就是给定查询点和查询距离的阈值(以查询点为圆心,查询距离为半径),从数据集中找出所有与查询点距离小于阈值的数据(半径内的数据);K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询(nearest neighbor searches)
对于三维的点云来说,所有的K-D树都是三维的,构建k-d树是一个逐级展开的递归过程,在每一级展开时都使用垂直于相应轴的超平面沿特定维度分割所有剩下数据集。在KdTree的根节点上,所有数据都将根据第一个维度进行拆分(如果第一个维度坐标小于根节点数据,则子数据将位于左子树中,如果子数据大于根节点数据,则子元素显然位于右子树中)。KdTree中的下一层在下一个维度上进行划分,当所有其他维度都用尽后,将返回到第一个维度。构建K-D树最有效的方法是使用一种类似于快速排序的分区方法,将中间点放在根节点上,然后比中间点小的数值放在左子树上,比中间点大的数值放在右子树上,最后在左右子树上重复此过程,直到分割至最后一个元素。