简介

八叉树是一种树数据结构,其中每个内部节点都有八个子节点。八叉树通常用于三维点云的空间划分。 八叉树的非空叶节点包含一个或多个属于同一空间细分的点。 八叉树是一个有用的三维空间描述,可以用来快速找到附近的点。 Open3D的几何类型Octree,可用于创建,搜索和遍历具有用户指定的最大树深度max_depth的八叉树。

从点云中构造八叉树

可以使用convert_from_point_cloud方法从点云中构造八叉树。通过沿着从根节点到深度max_depth处的相应叶节点的路径将每个点插入到树中。 随着树的深度增加,内部(最终是叶子)节点表示3D空间的较小划分。

如果点云具有颜色,则相应的叶节点采用最后插入的点的颜色。 size_expand参数增加了根八叉树节点的大小,因此它比原始点云边界稍大以容纳所有点。

# -*- coding: UTF-8 -*-
import numpy as np
import open3d as o3d
import Open3D.examples.python.open3d_tutorial as o3dtut# 加载点云,并采样2000个点
N = 2000
pcd = o3dtut.get_armadillo_mesh().sample_points_poisson_disk(N)
# 点云归一化
pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),center=pcd.get_center())
# 点云着色
pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3)))
# 可视化
o3d.visualization.draw_geometries([pcd])# 创建八叉树, 树深为4
octree = o3d.geometry.Octree(max_depth=4)
# 从点云中构建八叉树,适当扩展边界0.01m
octree.convert_from_point_cloud(pcd, size_expand=0.01)
# 可视化
o3d.visualization.draw_geometries([octree])

从体素网格中构造八叉树

也可以使用create_from_voxel_grid方法从Open3DVoxelGrid几何结构中构造八叉树。 输入VoxelGrid的每个体素都被视为3D空间中的一个点,其坐标对应于该体素的原点。 每个叶节点都采用其相应体素的颜色。

# 从点云中创建体素网格, 体素大小为0.05m
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size=0.05)
# 体素可视化
o3d.visualization.draw_geometries([voxel_grid])# 创建八叉树, 树深为4
octree = o3d.geometry.Octree(max_depth=4)
# 从体素网格中构建八叉树
octree.create_from_voxel_grid(voxel_grid)
# 可视化
o3d.visualization.draw_geometries([octree])

另外,可使用to_voxel_gridOctree转变为VoxelGrid

遍历八叉树

可以遍历八叉树,这对于搜索或处理3D几何体的子部分很有用。通过向traverse方法提供回调,每次访问节点(内部或叶)时,都可以执行额外的处理。

在下面的示例中,提前停止标准仅用于处理具有超过特定点数的内部/叶节点。这种提前停止能力可以有效地处理满足一定条件的空间区域。

def f_traverse(node, node_info):early_stop = Falseif isinstance(node, o3d.geometry.OctreeInternalNode):if isinstance(node, o3d.geometry.OctreeInternalPointNode):n = 0for child in node.children:if child is not None:n += 1print("{}{}: Internal node at depth {} has {} children and {} points ({})".format('    ' * node_info.depth,node_info.child_index, node_info.depth, n,len(node.indices), node_info.origin))# we only want to process nodes / spatial regions with enough pointsearly_stop = len(node.indices) < 250elif isinstance(node, o3d.geometry.OctreeLeafNode):if isinstance(node, o3d.geometry.OctreePointColorLeafNode):print("{}{}: Leaf node at depth {} has {} points with origin {}".format('    ' * node_info.depth, node_info.child_index,node_info.depth, len(node.indices), node_info.origin))else:raise NotImplementedError('Node type not recognized!')# early stopping: if True, traversal of children of the current node will be skippedreturn early_stop# 创建八叉树, 树深为4
octree = o3d.geometry.Octree(max_depth=4)
# 从点云中创建体素网格, 体素大小为0.01m
octree.convert_from_point_cloud(pcd, size_expand=0.01)
# 遍历
octree.traverse(f_traverse)

查找包含点的叶节点

使用上述遍历机制,可以快速地在八叉树中搜索包含给定点的叶节点。 通过locate_leaf_node方法提供此功能。

octree.locate_leaf_node(pcd.points[0])

Open3d之八叉树(Octree)相关推荐

  1. PCL点云处理之基于八叉树的三种邻近点搜索接口详细解释(八十九)

    提示:体素内邻近点搜索,K个邻近点搜索,R半径邻域点搜索 ,是基于八叉树的三种点云邻近关系搜索方法,具体使用哪种要看具体的应用场景选择合适的 PCL点云处理之八叉树的三种邻近点搜索方法(八十九) 前言 ...

  2. 爆肝5万字❤️Open3D 点云数据处理基础(Python版)

    Open3D 点云数据处理基础(Python版) 文章目录 1 概述 2 安装 2.1 PyCharm 与 Python 安装 2.3 Anaconda 安装 2.4 Open3D 0.13.0 安装 ...

  3. open3D源码解读第四篇

    2021SC@SDUSC 文章目录 open3D体素化 VoxelGrid.h VoxelGridIO 小结 open3D体素化 本篇解读voxel(体元/体素)的基本类Voxel,以及VoxelGr ...

  4. Open3D o3dtut怎么导入才不报错

    Open3D o3dtut 怎么导入才不报错 问题 解决 1. 导入o3dtut 2. 添加open3d_tutorial.py类 3. 构建目录结构 4. 运行成功 写这篇博客源于博友的提问,最初我 ...

  5. Open3D点云处理算法最全合集

    Open3D点云处理算法最全合集,致力于搜集可运行,可视化较好的Open3D算法,持续更新中- 1. Open3D 点云读取及可视化.离群点去除 2. Open3D 点云体素格下采样 3. Open3 ...

  6. Open3D KdTree建立、3种近邻搜索及结果可视化

    1. 点云索引 Open3D KdTree,可以快速的在无序的点云中建立空间拓扑结构,使得能迅速的进行近邻搜索: 2. 近邻方法分类: Open3D这边支持的近邻搜索方法由VTK实现: K近邻搜索(K ...

  7. Open3D DbScanClustering聚类算法

    DBSCAN聚类算法,是基于密度的聚类算法.该算法需要两个参数. labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print ...

  8. Open3D 三维点云读取可视化、下采样、去除离群点、地面提取

    Open3D:3D数据处理的现代库,是一个开放源代码库,支持快速开发处理3D数据的软件.Open3D在C ++和Python中公开了一组精心选择的数据结构和算法.后端经过高度优化,并支持并行化. 推荐 ...

  9. Open3d学习计划—高级篇 8(网格变形)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

最新文章

  1. 使用C++实现一套简单的状态机模型——原理解析
  2. 比特币是什么,看这篇就懂了
  3. 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图
  4. cross_compile = arm-linux-,cross compile grpc for arm
  5. java反射 Method
  6. Chrome谷歌插件开发-01
  7. 在Linux上安装Elasticsearch Kibaba.md
  8. js变量后面加问号是什么_JS变量生命周期:为什么 let 没有被提升
  9. Struts2类型转换--浪曦视频第三讲
  10. ViewPage2+TabLayout小记
  11. 网站视频倍速播放和进度自定义调整
  12. 预售┃让苹果CEO库克折服的程序员仅10岁!?
  13. 单幅散焦图像的深度恢复
  14. python注释第一行_python第一行注释是什么意思?
  15. 最全Python绘制饼形图(饼状图)
  16. 10分钟搞懂蚁群算法
  17. 数字万用表数字多用表软件下载安装教程
  18. flasgger手写phpwind接口文档
  19. UI设计、海报、建模
  20. 互联网金融数据分析体系

热门文章

  1. (转) Lua: 给 Redis 用户的入门指导
  2. Java中类、抽象类、接口之间的区别和联系。
  3. MediaElement 播放本地视频文件
  4. 关于javascript 中的defer 属性介绍
  5. Springboot,log文件配置时,logging.file.name与logging.file
  6. js代码测试。【一定要在真实工程下来测试是否好用】
  7. 关于使用Navicat
  8. 网络管理与维护作业5
  9. linux配置MYSQL慢查询的一些错误解决方案
  10. VS2010解决闪退的方法