Open3D OCtree 八叉树

简介: Open3D OCtree 八叉树

OCtree

octree 是一个树数据结构,其中每个内部节点有八个子节点。八叉树通常用于 3D 点云的空间分区。八叉树的非空叶节点包含一个或多个位于同一空间细分内的点。Octrees是对3D空间的有用描述,可用于快速查找附近的点。Open3D 具有Octree类型,可用于创建、搜索和遍历具有用户指定的最大树深度的八进制,max_depth.


From point cloud 从点云

可以使用convert_from_point_cloud方法从点云构造八叉树。每个

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

如果点云具有颜色,则相应的叶节点将采用最后插入点的颜色。参数size_expand增加根八叉节点的大小,使其略大于原始点云边界以容纳所有点。

import open3d as o3d
import numpy as np

print('input')
N = 2000

armadillo_path = r'../data/ArmadilloMesh.ply'
mesh = o3d.io.read_triangle_mesh(armadillo_path)
pcd = mesh.sample_points_poisson_disk(N)
# fit to unit cube
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])

print('octree division')
octree = o3d.geometry.Octree(max_depth=4)
octree.convert_from_point_cloud(pcd, size_expand=0.01)
o3d.visualization.draw_geometries([octree])

From voxel grid 从体素网格

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

print('voxelization')
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd,
                                                            voxel_size=0.05)
o3d.visualization.draw_geometries([voxel_grid])

print('octree division')
octree = o3d.geometry.Octree(max_depth=4)
octree.create_from_voxel_grid(voxel_grid)
o3d.visualization.draw_geometries([octree])

另外, Octree 可以通过to_voxel_grid转化为VoxelGrid。

Traversal 遍历

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

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

def f_traverse(node, node_info):
    early_stop = False

    if isinstance(node, o3d.geometry.OctreeInternalNode):
        if isinstance(node, o3d.geometry.OctreeInternalPointNode):
            n = 0
            for child in node.children:
                if child is not None:
                    n += 1
            print(
                "{}{}: 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 points
            early_stop = len(node.indices) < 250
    elif 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 skipped
    return early_stop

octree = o3d.geometry.Octree(max_depth=4)
octree.convert_from_point_cloud(pcd, size_expand=0.01)
octree.traverse(f_traverse)

Find leaf node containing point 查找包含点的叶节点

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

octree.locate_leaf_node(pcd.points[0])



相关文章
|
编解码 算法 数据处理
基于八叉树的空间划分及搜索操作
基于八叉树的空间划分及搜索操作
基于八叉树的空间划分及搜索操作
|
弹性计算 安全 Linux
【云服务器选型指南:五大关键】
【云服务器选型指南:五大关键】
1128 0
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
2290 62
|
4月前
|
存储 人工智能 安全
构建AI智能体:四十八、从单体智能到群体智能:A2A协议如何重塑人机协作新范式
本文介绍了基于A2A(Agent-to-Agent)协议的智能代理系统在篮球赛安排中的应用。该系统通过多代理协作(天气、场地、日历、通知代理)实现自动化决策,相比传统API具有动态发现、语义化描述和自主决策优势。文章详细阐述了单代理(天气查询)到多代理系统的演进过程,展示了A2A协议在服务发现、任务标准化和安全通信方面的核心技术特性。该系统采用分级决策机制,优先检查天气安全条件,再验证场地和参与者可用性,最后触发通知流程,体现了分布式智能的协同效应和业务敏捷性。
334 2
|
5月前
|
人工智能 文字识别 自然语言处理
一文带你读懂“医保智慧经办智能体”
医保智慧经办智能体融合AI、大数据与云计算,构建五层技术架构,实现智能咨询、审核、监管与决策支持,推动医保服务从“人找服务”向“服务找人”转变,提升效率、精准防控风险,助力医保治理现代化。
890 0
|
存储 API UED
鸿蒙特效教程02-微信语音录制动画效果实现教程
本教程适合HarmonyOS初学者,通过简单到复杂的步骤,一步步实现类似微信APP中的语音录制动画效果。
503 0
鸿蒙特效教程02-微信语音录制动画效果实现教程
|
JSON 安全 数据格式
7-6|python报错TypeError: can't pickle _thread.RLock objects
7-6|python报错TypeError: can't pickle _thread.RLock objects
|
移动开发 前端开发 网络协议
Python Web实时通信新纪元:基于WebSocket的前后端分离技术探索
【7月更文挑战第16天】WebSocket增强Web实时性,Python借助Flask-SocketIO简化实现。安装`flask`和`flask-socketio`,示例展示服务器端接收连接及消息并广播响应,前端HTML用Socket.IO库连接并监听事件。WebSocket开启双向通信新时代,助力动态Web应用开发。
303 1
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之遇到报错:Apache Kafka Connect错误如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
743 5
|
编解码 前端开发 JavaScript
【Web 前端】移动端适配方案有哪些?
【4月更文挑战第22天】【Web 前端】移动端适配方案有哪些?