Octree

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

Octree的用途
八叉树是一种用于描述三维空间的树状数据结构。

Octree的结构:
八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,将八个子节点所表示的体积元素加在一起就等于父节点的体积。
完整的八叉树,每个中间节点都有八个子节点,所有叶节点都有相同的树深度D,叶节点数为8的D次幂


八叉树构建原理如下:
(1). 设定最大递归深度

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

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

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

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

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

:构建八叉树的时候,要区分插入的各点云,将各点云进行编号,插入时主要通过递归的方式寻找无数据的child,生成的八叉树可以是是增长式的,即哪里有点云则往哪里插入栅格,无点云的地方不插入栅格。也可以是上图中的固定体素构建形式

空间栅格划分完成之后,去重叠的方法:
一种为只保留体素中心点,将体素中的其他点删除,这样的到的采样点云比较均匀,但在特征的保留上效果不是很好

一种为,计算体素中的点距离体素中心点的长度,然后计算距离的均值,大于(或小于)均值的点即删除,这种方法保留了原始点云数据,但重叠区域的点仍然会比较密集,因此,最好要将法向量、曲率等因素考虑在内,增加细节部分的显示,但还要均衡处理速度

一种为,通过K-Dtree搜索各点近邻的方式来判断各部分点云的密度,然后,遍历各体素,保留体素中密度较大的点云来达到去重叠的效果,但处理后会发现,各点云的交接处会有缝隙出现。解决办法:各交接点云去除时保留不带边缘的点云。最后,会有一个问题待解决,计算点云密度耗时较多。主要耗时部分为构建K-Dtree的时候。另外,这种处理方法会频繁计算点云密度,所以可以考虑以各体素中的点数来判断密度的方式替代。

另外,PCL中的octree框架中,每一个体素都产生了对应的编号,所以在查找体素和查找体素中对应点的时候方便且不会出错。 这一方法的主要优点在于可以非常方便地实现有广泛用途的集合运算(例如可以求两个物体的并、交、差等运算),而这些恰是其它表示方法比较难以处理或者需要耗费许多计算资源的地方。不仅如此,由于这种方法的有序性及分层性,因而对显示精度和速度的平衡、隐线和隐面的消除等,带来了很大的方便,特别有用。

最后,
奉上octree的源码:https://codeload.github.com/brandonpelfrey/SimpleOctree/zip/master
(要不要考虑点个赞!!!!!)

代码的主要部分:

void insert(OctreePoint* point)
{if(isLeafNode()) {if(data==NULL) {data = point;return;}else {OctreePoint *oldPoint = data;data = NULL;for(int i=0; i<8; ++i) {Vec3 newOrigin = origin;newOrigin.x += halfDimension.x * (i&4 ? .5f : -.5f);newOrigin.y += halfDimension.y * (i&2 ? .5f : -.5f);newOrigin.z += halfDimension.z * (i&1 ? .5f : -.5f);children[i] = new Octree(newOrigin, halfDimension*.5f);}children[getOctantContainingPoint(oldPoint->getPosition())]->insert(oldPoint);children[getOctantContainingPoint(point->getPosition())]->insert(point);}else {int octant = getOctantContainingPoint(point->getPosition());children[octant]->insert(point);}
}

点云的降采样:八叉树采样(Octree)相关推荐

  1. 【PCL自学:ocTree】八叉树(octree)的原理及应用案例(点云压缩,搜索,空间变化)

    PCL中八叉树(octree)的原理及应用案例 一.什么是八叉树ocTree? 1.八叉树原理 二.八叉树应用案例 1.点云压缩 2.用八叉树进行空间划分和搜索操作 3.无序点云数据的空间变化检测 一 ...

  2. 三维点云学习(1)下-点云体素降采样

    三维点云学习(1)下 点云体素降采样(Voxel Filter Downsampling) 代码参考网址秦乐乐CSDN博客 理论参考知乎博主:WALL-E 1.方法 Centroid 均值采样 Ran ...

  3. 【腾讯云原生降本增效大讲堂】云原生降本增效优秀实践案例分享

    ​嘉宾 | 孟凡杰 出品 | CSDN云原生 CNCF云原生计算基金会2021年<FinOps Kubernetes Report>显示,迁移至 Kubernetes 平台后,68%的受访 ...

  4. 线性八叉树_基于三维点云数据的线性八叉树编码压缩算法(权毓舒, 何明一,).pdf...

    基于三维点云数据的线性八叉树编码压缩算法(权毓舒, 何明一,) ·70 · 计算机应用研究 2005 年 基于三维点云数据的线性八叉树编码压缩算法 * 权毓舒, 何明一 ( 西北工业大学 电子信息学院 ...

  5. 三维点云学习(2)下-Octree

    三维点云学习(2)下-Octree Octree(八叉树)的基本结构 思想:立体空间的分割 二维平面的展示 Octree(八叉树)的构建 #extent:立方体中心点到面的距离 #Center of ...

  6. 八叉树(Octree)

    转自:http://www.cnblogs.com/21207-iHome/p/7098000.html 八叉树(Octree)是一种用于描述三维空间的树状数据结构.想象一个立方体,我们最少可以切成多 ...

  7. 八叉树 java_八叉树(Octree)

    转载自:http://www.cnblogs.com/21207-iHome/p/7098000.html 八叉树(Octree)是一种用于描述三维空间的树状数据结构.想象一个立方体,我们最少可以切成 ...

  8. 英特尔内存革新助平安云 Redis 云服务降本增效

    英特尔内存革新助平安云 Redis 云服务降本增效 英特尔® 傲腾™ 数据中心级持久内存的引入,为平安云的降本增效开启了一条新的道路.通过对平安云 Redis 数据库产品的支持,用户能享受到性能优异且 ...

  9. 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )

    文章目录 I . AAudio 音频流 采样 缓冲 播放 的连续机制 II . AAudio 音频流 数据回调函数 函数指针类型定义 III . AAudio 音频流 数据回调函数 实现 IV . A ...

  10. Oracle优化07-分析及动态采样-动态采样

    思维导图 07系列文章 Oracle优化07-分析及动态采样-直方图 Oracle优化07-分析及动态采样-DBMS_STATS 包 Oracle优化07-分析及动态采样-动态采样 动态采样Dynam ...

最新文章

  1. linux打开没有图形界面,linux无法打开图形界面
  2. 素数计算之埃氏筛法、欧拉筛法
  3. 无盘服务器怎么修改ip,怎么进入无盘服务器修改IP地址呢
  4. 如何在IE地址栏显示自己的小图标
  5. 如何修改myeclipse中web项目的工作路径或默认路径
  6. python我的世界服务器_Python取Minecraft服务器信息
  7. 一步一步学Ruby(二):变量,常量
  8. Type Dynamic Web Module 4.0 requires Java 1.8 or newer----彻底杀死Bug
  9. python调整屏幕缩放比例_python实现按长宽比缩放图片 python的turtle怎样缩放界面吧...
  10. es 多索引联合查询_HBase二级索引设计思想
  11. PMP考试重点总结二——启动过程组
  12. ROLLUP函数问题
  13. AMOS从零到基本操作入门(转载)
  14. 【论文写作】投稿心路
  15. 手机esn不可用怎么解决_什么是ESN,为什么我不担心它是否干净?
  16. matlab在axis,matlab中axis的用法
  17. Unity RayCast容易忽视的地方
  18. Ubuntu16.04安装armadillo库
  19. COOX基础培训之SCADA Manufacture
  20. 推荐好的学习资源网站

热门文章

  1. SVG defs元素
  2. html注册页面连接mysql_注册界面连接数据库
  3. 一致性检验Kappa 与 混淆矩阵
  4. mysql的tps是什么意思_Mysql数据库的QPS和TPS的意义和计算方法
  5. 域名管理系统DNS(Domain Name System)
  6. 「python爬虫之路day9」:实战之使用正则表达式爬取抓狂网,古诗文网信息
  7. 《重构》笔记---坏代码的味道与处理
  8. 影子卫士 Shadow Defender 2011
  9. Entire Space Multi-Task Model: An Effective Approach for Estimating Post-CVR (ESSM)
  10. rancher报错Not using `--random-fully` in the MASQUERADE rule for iptables because the local version of