open3d八叉树:Octree

文章目录

Open3d快速上手💎点云对象详解

open3d实现

oc树是一种空间栅格化方法,其思路来自于二分法。

以一维空间举例,就是对一条线段不断地二分,得到一系列的子线段,如果子线段中包含的元素大于2,那么就继续分割,直到所有子线段中至多只有一个元素为止。

就一维而言是二分,二维空间是四分,三维空间就是八分了,故而是八叉树。考虑到本文主要介绍open3d中的八叉树,故而将更详细的解释放在后面。

open3d中,提供了Octree类用以创建八叉树,其创建方法为先建立对象,再注入点云数据。

pcd = o3d.io.read_point_cloud("rabbit.pcd")
octree = o3d.geometry.Octree(max_depth=6)
octree.convert_from_point_cloud(pcd, size_expand=0.01)
o3d.visualization.draw_geometries([octree])

直观感受一下大致是这种

在这里插入图片描述

其中,参数max_depth可以理解为八分的最多次数。这个东西很微妙,如果不设置,当一个小区域内有大量点的时候,就会不断地分割下去,很浪费性能。size_expand是一个微小的膨胀系数,从而让每个方块把点包裹进去。

除了通过点云生成八叉树,也可以通过体元生成八叉树

vxs = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size=0.01)
octree = o3d.geometry.Octree(max_depth=6)
octree.create_from_voxel_grid(vxs)
o3d.visualization.draw_geometries([octree])

其绘制结果和上面的图是一样的,故不再展示。

为了让这棵八叉树更加清晰,可以对点云上色

import numpy as np
colors = np.random.rand(len(pcd.points), 3)
pcd.colors = o3d.utility.Vector3dVector(colors)
octree = o3d.geometry.Octree(max_depth=5)
octree.convert_from_point_cloud(pcd, size_expand=0.01)
o3d.visualization.draw_geometries([octree])

效果为

在这里插入图片描述

原理

八叉树(octree)是一种空间中的栅格化方法,为了更直观地理解八叉树的思想,可通过其二维形式——四叉树来进行说明。仍以六个数据点作为研究对象:{(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)},如果以 [ 0 , 10 ) [0,10) [0,10)为坐标空间,那么通过对这个空间四等分,可得到下左图

在这里插入图片描述=》在这里插入图片描述

令所有的分割都是左闭右开的,那么被分割后的四个区间中,除了右下角的方块包含三个点之外,剩下三个方块都只有一个点。只有一个点的方块显然就没法继续分割了,而第四个方块则可继续分割,得到右图。

这样,右下角的方块被继续分成了四个小方块,且每个小方块的元素都不超过一个,所以无法继续再分,四叉树也就完成了。

八叉树就是按照同样的逻辑,对空间进行等间隔分割,由于三维坐标系有8个卦限,故而每一次都将产生8个立方体,如图所示。

在这里插入图片描述

### 如何在Open3D中使用点云创建或操作八叉树 #### 创建八叉树 为了基于给定的点云数据创建八叉树,在Open3D库中有专门的方法支持这一过程。首先,需要加载点云数据至`open3d.geometry.PointCloud`对象内;之后调用该对象上的`create_octree_from_point_cloud()`函数,并设置最大深度参数`max_depth`以控制八叉树细化程度[^4]。 ```python import open3d as o3d # 加载点云文件为例展示 pcd = o3d.io.read_point_cloud("path_to_your_pcd_file.ply") octree = o3d.geometry.Octree(max_depth=5) octree.convert_from_point_cloud(pcd, size_expand=0.01) print(octree) ``` 这段代码展示了如何读取外部存储的点云文件并将其转换成八叉树结构。这里设置了最大深度为5层,并指定了轻微扩展边界框大小以便更好地适应所有点的位置分布情况。 #### 遍历八叉树 一旦成功建立了八叉树实例,则可以通过遍历其节点来执行特定的任务,比如查询某个区域内的所有点或者查找最接近目标位置的那个点。下面的例子说明了怎样迭代访问整棵八叉树: ```python def traverse_octree(node, depth=0): indent = ' ' * depth + '-' if isinstance(node, o3d.geometry.OctreeNodeLeaf): print(f"{indent} Leaf node at level {depth}") else: print(f"{indent} Branch node at level {depth}") for child_idx in range(len(node.children)): if node.children[child_idx]: traverse_octree(node.children[child_idx], depth + 1) traverse_octree(octree.root_node) ``` 此递归函数会打印出每一级分支和叶子的信息,帮助理解当前所构建出来的层次化索引体系是如何组织起来的[^3]。 #### 可视化八叉树 最后还可以借助Open3D内置的功能将生成好的八叉树直观呈现出来供进一步研究之用。这不仅有助于确认构造无误,而且对于调试目的也十分有用: ```python o3d.visualization.draw_geometries([octree]) ``` 上述命令可以直接弹窗显示出带有颜色区分不同级别的单元格网格图样,使得观察者更容易把握整体布局特征[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值