八叉树是一种树数据结构,其中每个内部节点都有八个子节点。八叉树通常用于 3D 点云的空间划分。八叉树的非空叶节点包含一个或多个落入同一空间细分的点。八叉树是 3D 空间的有用描述,可用于快速找到附近的点。Open3D 具有几何类型八叉树,可用于创建、搜索和遍历具有用户指定的最大树深度 max_depth 的八叉树。
From point cloud
可以使用 convert_from_point_cloud 方法从点云构建八叉树。通过从根节点到深度为 max_depth 的适当叶节点的路径将每个点插入到树中。随着树深度的增加,内部(最终是叶)节点代表 3D 空间的较小分区。
如果点云有颜色,则对应的叶节点采用最后插入点的颜色。size_expand 参数增加了根八叉树节点的大小,使其略大于原始点云边界以容纳所有点。
open3d.geometry.Octree convert_from_point_cloud(self, point_cloud, size_expand=0.01) |
函数功能: 从点云转换为八叉树 |
参数: point_cloud (open3d.geometry.PointCloud):输入的点云 size_expand (float, optional, default=0.01):一个小的扩展尺寸,使得八叉树略大于原始点云边界以容纳所有点 |
返回: None |
From voxel grid
也可以使用方法 create_from_voxel_grid(在笔记6中已经做过笔记) 从 Open3D VoxelGrid 几何构造八叉树。输入 VoxelGrid 的每个体素都被视为 3D 空间中的一个点,其坐标对应于体素的原点。每个叶节点采用其对应体素的颜色。
open3d.geometry.Octree create_from_voxel_grid(self) |
函数功能: |
参数: |
返回: None |
此外,可以使用 to_voxel_grid 将八叉树转换为 VoxelGrid。
open3d.geometry.Octree to_voxel_grid(self) |
函数功能: 转换为体素网格 |
参数: |
返回: open3d.geometry.VoxelGrid |
遍历(Traversal)0
可以遍历八叉树,这对于搜索或处理 3D 几何的子部分很有用。通过为 traverse 方法提供回调,每次访问节点(内部或叶子)时,都可以执行额外的处理。
提前停止标准用于仅处理具有超过一定数量的点的内部/叶节点。这种早期停止能力可用于有效处理满足某些条件的空间区域。
class open3d.geometry.OctreeInternalNode |
介绍: OctreeInternalNode 类,包含 OctreeNode 子级。 |
方法: __init__(*args, **kwargs):重载功能 1. __init__(self):默认构造函数 2. __init__(self, arg0):复制构造函数 arg0 (open3d.geometry.OctreeInternalNode) get_init_function()→Callable[], open3d.geometry.OctreeInternalNode]:获取用于初始化 OctreeInternalNode 的 lambda 函数。调用 init 函数时,会创建一个空的 OctreeInternalNode get_update_function()→Callable[[open3d.geometry.OctreeInternalNode], None]:获取用于更新 OctreeInternalNode 的 lambda 函数。这个更新函数什么都不做 |
属性: children:子节点列表 |
class open3d.geometry.OctreePointColorLeafNode |
介绍: OctreePointColorLeafNode 类是一个包含颜色的 OctreeLeafNode。 |
方法: __init__(*args, **kwargs):重载功能 1.__init__(self:open3d.cpu.pybind.geometry.OctreePointColorLeafNode) -> None :默认构造函数 2. __init__(self: open3d.geometry.OctreePointColorLeafNode, arg0: open3dgeometry.OctreePointColorLeafNode) -> None:复制构造函数 get_init_function()→Callable[], open3d.geometry.OctreeLeafNode]:获取用于初始化 OctreeLeafNode 的 lambda 函数。调用 init 函数时,会创建一个空的 OctreePointColorLeafNode。 get_update_function(idx: int, color: numpy.ndarray[numpy.float64[3, 1]]) → Callable[[open3d.geometry.OctreeLeafNode], None]:获取用于更新 OctreeLeafNode 的 lambda 函数。调用时,更新函数使用新的点索引和输入颜色更新相应的节点。 |
属性: color:节点颜色 indices:此叶节点中包含的点云点索引列表 |
open3d.geometry.Octree traverse(self: open3d.geometry.Octree, f: Callable[[open3d.geometry.OctreeNode, open3d.geometry.OctreeNodeInfo], bool])→None |
函数功能: DFS从根开始遍历八叉树,每个节点调用一个回调函数f |
参数: |
返回: |
查找包含点的叶节点
上述遍历机制,可以快速搜索八叉树中包含给定点的叶子节点。此功能是通过 locate_leaf_node 方法提供的。
open3d.geometry.Octree locate_leaf_node(self, point) |
函数功能: 返回查询点应驻留的叶子 OctreeNode 和 OctreeNodeInfo |
参数: point (numpy.ndarray[numpy.float64[3, 1]]):点坐标 |
返回: Tuple[open3d.geometry.OctreeLeafNode,open3d.geometry.OctreeNodeInfo] |