通过雷达、激光扫描、立体摄像机等三维测量设备获取的点云数据,具有数据量大、分布不均匀等特点。作为三维领域中一个重要的数据来源,点云数据主要是表征目标表面的海量点集合,并不具备传统网格数据的集合拓扑信息。所以点云数据处理中最为核心的问题就是建立离散点间的拓扑关系,实现基于邻域关系的快速查找。

建立空间索引在点云数据处理中已被广泛应用,常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构,比较有代表性的包括 BSP树、 KD树、 KDB树、 R树、 R+树、 CELL树、四叉树和八叉树等索引结构,而在这些结构中KD树和八叉树在3D点云数据组织中应用较为广泛,PCL对上述两者进行了实现。

1、八叉树的描述

八叉树结构是由 Hunter 博士于1978年首次提出的一种数据模型。八叉树结构通过对三维空间的几何实体进行体元剖分,每个体元具有相同的时间和空间复杂度,通过循环递归的划分方法对大小为 (2n∗2n∗2n)(2n∗2n∗2n) 的三维空间的几何对象进行剖分,从而构成一个具有根节点的方向图。在八叉树结构中如果被划分的体元具有相同的属性,则该体元构成一个叶节点;否则继续对该体元剖分成8个子立方体,依次递剖分,对于 (2n∗2n∗2n)(2n∗2n∗2n)大小的空间对象,最多剖分 nn 次,如下示意图所示。

八叉树结构示意图

八叉树(Octree)是一种用于描述三维空间的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点作为节点的分叉中心。八叉树若不为空树的话,树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。

八叉树叶子节点代表了分辨率最高的情况。例如分辨率设成0.01m,那么每个叶子就是一个1cm见方的小方块。

那么,这要用来做什么?想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币找出来,聪明的你会怎么做?我们可以把房间当成一个立方体,先切成八个小立方体,然后排除掉没有放任何东西的小立方体,再把有可能藏金币的小立方体继续切八等份….如此下去,平均在Log8(房间内的所有物品数)的时间内就可找到金币。因此,Octree就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。

2、实现Octree的原理

(1). 设定最大递归深度

(2). 找出场景的最大尺寸,并以此尺寸建立第一个立方体

(3). 依序将单位元元素丢入能被包含且没有子节点的立方体

(4). 若没有达到最大递归深度,就进行细分八等份,再将该立方体所装的单位元元素全部分担给八个子立方体

(5). 若发现子立方体所分配到的单位元元素数量不为零且跟父立方体是一样的,则该子立方体停止细分,因为跟据空间分割理论,细分的空间所得到的分配必定较少,若是一样数目,则再怎么切数目还是一样,会造成无穷切割的情形。

(6). 重复3,直到达到最大递归深度。

3、Octree的存储结构

本例中Octree的存贮结构用一个有(若干+八)个字段的记录来表示树中的每个结点。其中若干字段用来描述该结点的特性(本例中的特性为:节点的值和节点坐标),其余的八个字段用来作为存放指向其八个子结点的指针。此外,还有线性存储和1托8式存储。

4、BSP Tree和Octree对比

a) BSP Tree将场景分割为1个面,而Octree分割为3个面。

b) BSP Tree每个节点最多有2个子结点,而Octree最多有8个子结点

5、八叉树和k-d树比较

因此BSP Tree可以用在不论几唯的场景中,而Octree则常用于三维场景

八叉树算法的算法实现简单,但大数据量点云数据下,其使用比较困难的是最小粒度(叶节点)的确定,粒度较大时,有的节点数据量可能仍比较大,后续查询效率仍比较低,反之,粒度较小,八叉树的深度增加,需要的内存空间也比较大(每个非叶子节点需要八个指针),效率也降低。而等分的划分依据,使得在数据重心有偏斜的情况下,受划分深度限制,其效率不是太高。

k-d在邻域查找上比较有优势,但在大数据量的情况下,若划分粒度较小时,建树的开销也较大,但比八叉树灵活些。在小数据量的情况下,其搜索效率比较高,但在数据量增大的情况下,其效率会有一定的下降,一般是线性上升的规律。

也有将八叉树和k-d树结合起来的应用,应用八叉树进行大粒度的划分和查找,而后使用k-d树进行细分,效率会有一定的提升,但其搜索效率变化也与数据量的变化有一个线性关系。

6、八叉树的C++实现

https://my.oschina.net/u/4338729/blog/3399283

线性八叉树_octree八叉树数据结构原理与实现相关推荐

  1. 线性八叉树_八叉树模型(体素)分解简易程序

    八叉树 维基释义:八叉树(Octree)是一种用于描述三维空间的树状数据结构.八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点, 这八个子节点所表示的体积元素加在一起就等于父节点的体积. ...

  2. 线性八叉树_八叉树 - chunlinge - 博客园

    (一)基本原理 用八叉树来表示三维形体,并研究在这种表示下的各种操作及应用是在进入80年代后才比较全面地开展起来的.这种方法,既可以看成是四叉树方法在三维空间的推广,也可以认为是用三维体素阵列表示形体 ...

  3. redis的zset的底层实现_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理...

    前言 今天来说下Redis中hash.set.zset的底层数据结构原理! Redis-哈希对象(hash) hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两 ...

  4. 顺序表中有效元素的长度_图解线性表,启动数据结构的大门,深刻理解链式存储和顺序存储!...

    数据结构之线性表 前言 ❝ 提到数据结构,可能会有很多人马上联想到栈,队列,树,哈希表,图等各种经常提到的数据结构,但是我们去忽略了本质,这些都是抽象的逻辑结构,追本溯源,数据结构中的存储方式只有两种 ...

  5. set列表对象去重_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理

    前言 今天来说下Redis中hash.set.zset的底层数据结构原理! Redis-哈希对象(hash) hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两 ...

  6. redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理

    原标题:Redis存储总是心里没底?你大概漏了这些数据结构原理 上一篇文章<Redis存储总用String?你大概错过了更优的使用方法>我们了解了Redis的数据类型特点与适用场景,本期内 ...

  7. MySQL索引底层数据结构原理剖析

    一. 前言 1. 说明 我们平时所说的:聚集索引(主键索引),次要索引,覆盖索引,复合索引,前缀索引,唯一索引在MySQL5.7和 8.0版本默认都是使用B+Tree索引,除此之外还有 Hash索引. ...

  8. octree八叉树数据结构原理与实现

    通过雷达.激光扫描.立体摄像机等三维测量设备获取的点云数据,具有数据量大.分布不均匀等特点.作为三维领域中一个重要的数据来源,点云数据主要是表征目标表面的海量点集合,并不具备传统网格数据的集合拓扑信息 ...

  9. 线性八叉树_八叉树OcTree

    在描述三维场景的过程中常常用到一种名为八叉树的数据结构.描述三维空间的八叉树和描述二维空间的四叉树有相似之处,二维空间中正方形可以被分为四个相同形状的正方形,而三维空间中正方体可以被分为八个形状相同的 ...

最新文章

  1. python如何控制mysql_python如何操作mysql
  2. ant 修改组件默认样式属性
  3. 过分!高校实验动物被学生私自放走,实验兔刚缝完针,连线都没拆......
  4. windows server 驱动精灵_大神教你如何在Win10中检查磁盘驱动器错误
  5. 无废话-SQL Server 2005新功能(1) - TSQL
  6. 【Qt】Qt中QJsonDocument 类
  7. gorm软删除_gorm的简单使用和注意事项
  8. 概率图模型笔记(二) 隐马尔科夫模型(Hidden Markov Model)
  9. Angular Js 判断对象不为空对象的三种方法
  10. isag java_ISAG - WEB源码|JSP源码/Java|源代码 - 源码中国
  11. 【语音加密】基于matlab GUI语音信号加密解密【含Matlab源码 295期】
  12. 软件安装 | 神器VAX Patch VA_X.DLL 安装位置的问题 for VS2008 , VS2010 , VS2011
  13. 【win10】设置电脑固定IP,解除固定IP
  14. 35岁的程序员真的到头了么?国外的大龄程序员在干什么?
  15. 网络流行语“不作不死”英文入选美国词典
  16. Chapter6 CMOS组合逻辑门设计
  17. win10 常用快捷键
  18. 【DeepLearning笔记】python规范书写
  19. Shamir秘密共享协议
  20. 关于 pd.Series 排序后用索引和行号取值要注意的问题

热门文章

  1. abap CA CO CS等操作符
  2. 刘烨:家里官方语言是中文 听不懂娘仨说法语
  3. 00后都选哪些大厂?数据盘点00后入职情况,字节跳动门槛低?
  4. 用“龙头”促发展,以“立体”筑生态,长沙生物医药产业集群跑出“加速度”
  5. X会员“圈养”长沙胃,盒马鲜生“有备而来”的会员制
  6. 苹果备忘录怎么调字体大小_苹果手机备忘录误删了怎么恢复?分享几个新技能...
  7. mysql查询嵌套where_MySQL-10(where /from 嵌套查询)
  8. CTF(pwn)堆利用 之 off by one
  9. CTF(pwn) 堆利用 之 unlink 介绍
  10. php 提交表单跳转页面,form表单页面跳转方式提交练习