PCL 点云索引方法K维树(KD-tree)和八叉树(octree)介绍

欢迎访问我的个人博客: z e n g z e y u . c o m zengzeyu.com zengzeyu.com

前言


通过雷达、激光扫描、立体摄像机等三维测量设备获取的点云数据,具有数据量大、分布不均匀等特点。作为三维领域中一个重要的数据来源,点云数据主要是表征目标表面的海量点集合,并不具备传统网格数据的集合拓扑信息。所以点云数据处理中最为核心的问题就是建立离散点间的拓扑关系,实现基于邻域关系的快速查找。
建立空间索引在点云数据处理中已被广泛应用,常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构,比较有代表性的包括 BSP树、 KD树、 KDB树、 R树、 R+树、 CELL树、四叉树和八叉树等索引结构,而在这些结构中KD树和八叉树在3D点云数据组织中应用较为广泛,PCL对上述两者进行了实现。

1. K维树(KD-tree)


1.1 KD-tree 概念简介

KD-tree 又称 K 维树是计算机科学中使用的一种数据结构,用来组织表示 K 维空间中点集合。它是一种带有其他约束条件的二分查找树。KD-tree对于区间和近邻搜索十分有用。我们为了达到目的,通常只在三个维度中进行处理,因此所有的 KD-tree 都将是三维 KD-tree。 如下图所示(动图,慢慢看), KD-tree 的每一级在指定维度上分开所有的子节点。在树的根部所有子节点是以第一个指定的维度上被分开(即如果第一维坐标小于根节点的点它将被分在左边的子树中,如果大于根节点的点它将分在右边的子树中)。

PCL 点云索引方法K维树(KD-tree)和八叉树(octree)介绍_第1张图片

树的每一级都在下一个维度上分开,所有其他的维度用完之后就回到第一个维度,建立 KD-tree 最高效的方法是像快速分类一样使用分割法,把指定维度的值放在根上,在该维度上包含较小数值的在左子树,较大的在右子树。然后分别在左边和右边的子树上重复这个过程,直到用户准备分类的最后一个树仅仅由一个元素组成。

PCL 点云索引方法K维树(KD-tree)和八叉树(octree)介绍_第2张图片

1.2 PCL中KD-tree使用

#include 
#include 

#include 
#include 
#include 

int
main (int argc, char** argv)
{
  srand (time (NULL));

  pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

  // Generate pointcloud data
  cloud-

你可能感兴趣的:(PCL,算法,CNN,分割地面点云,PCL,算法)