PCL专栏目录及须知
注意:KD树常用来进行K邻域搜索、半径搜索。
本文章中3.注意事项的内容为工作中常犯的错误,需留意。
1.原理
1.1 KD树数据结构
(1)又称K维树,用来组织表示K维空间中的点集合。是一种带有约束条件的二分查找树。在PCL中,通常只使用三个维度(xyz),因此PCL中的KD树可直接看做三维KD树。
(2)构造KD树时,如下图所示,不断使用垂直于坐标轴的超平面将K维空间一分为二,切分之后,节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。

1.2 构造KD树
如:我们需对二维平面上的一些点组织KD树。点位如下:(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)。
(1)组织结果如下图:

(2)组织步骤:
1)将上述六个点的点集按照二维平面的第一维(x轴)对数据进行排序,排序结果为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)
2)取得上述点集的中位数处的点,偶数个数的中位数一般取大的那个,在上述点集中取到的为(7,2),在该点处对平面进行划分,如图1中(7,2)位置画上一条竖线
3)将由(7,2)划分的左右两平面中的剩余点按照二维平面的第二维(y轴)对数据排序,排序结果为左枝:(2,3),(5,4),(4,7)和右枝(8,1),(9,6)
4)将左枝和右枝分别取中位数点作为新的节点,按照第一维继续排序,直致每一个子枝上只剩一个点,这个点被称作叶子。
5)得到KD树。
组织步骤图如下:

1.3 KD树的最邻近查找
以查询数据Q举例:
(1)将查询数据Q从根结点开始,按照Q与各个结点的比较结果向下访问Kd-Tree,直至达到叶子结点。
Q与结点的比较:将Q对应于结点中的k维度上的值与中值m进行比较,若Q(k) < m,则访问左子树,否则访问右子树。达到叶子结点时,计算Q与叶子结点上保存的数据之间的距离,记录下最小距离对应的数据点,记为当前最近邻点nearest和最小距离dis。
(2)进行回溯操作,已查询是是否有离Q更近的“最近邻点”。即判断未被访问过的分支里是否还有离Q更近的点,它们之间的距离小于dis。
1)如果Q与其父结点下的未被访问过的分支之间的距离小于dis,则认为该

最低0.47元/天 解锁文章
1354

被折叠的 条评论
为什么被折叠?



