Open3D 遍历八叉树

news2025/1/9 15:01:16

目录

一、概述

1.1原理

1.2实现步骤

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2数据显示


Open3D点云算法汇总及实战案例汇总的目录地址:

Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客


一、概述

        在三维空间中处理点云数据时,八叉树(Octree)是一种高效的数据结构,特别适用于空间分割和加速查询操作。通过将点云数据组织成八叉树,可以显著提高点云处理中各种操作的性能,如最近邻搜索、空间分割和可视化渲染等。

1.1原理

        八叉树的构建基于递归地将三维空间划分为更小的子空间。每个内部节点对应一个立方体空间,该空间被分割成八个子立方体,分别对应八个子节点。叶子节点包含点云数据。当查询或遍历八叉树时,我们可以从根节点开始递归访问每个节点,并根据节点的层次结构执行特定操作。

1.2实现步骤

  1. 加载点云:使用用户提供的点云数据,并将其加载到 Open3D 中。
  2. 构建八叉树:使用 Open3D 的 Octree 类构建八叉树,并指定最大深度。
  3. 查找并输出特定点的节点信息:在八叉树中查找与第0个点相关的节点,并输出该节点的详细信息。
  4. 遍历八叉树:递归遍历八叉树的所有节点,并在遍历过程中检查第0个点所在的节点。

二、代码实现

2.1关键函数

        locate_leaf_node(self, point) 函数的主要作用是查找并返回包含指定点 (point) 的八叉树叶子节点 (OctreeLeafNode)。

def locate_leaf_node(self, point):

输入参数:

  • point (np.ndarray): 一个包含三维坐标的数组,用于在八叉树中查找包含该点的叶子节点。

输出参数:

  • 返回值 (OctreeLeafNode): 返回包含指定点的叶子节点对象。如果该点不属于任何叶子节点,则返回 None。

2.2完整代码

import open3d as o3d
import numpy as np

def print_octree_node(node, depth=0, target_point=None, point_index=0):
    """
    递归打印八叉树的节点信息,并检查是否包含指定的点。

    参数:
    node (o3d.geometry.OctreeNode): 当前八叉树节点。
    depth (int): 当前节点的深度。
    target_point (np.ndarray): 目标点的坐标。
    point_index (int): 点的索引,用于识别和输出相关节点的信息。
    """
    indent = " " * depth * 4  # 控制缩进表示树的层级
    print(f"{indent}Depth {depth}: Node type: {type(node).__name__}")

    if isinstance(node, o3d.geometry.OctreeInternalNode):
        # 如果是内部节点,递归遍历子节点
        for i, child in enumerate(node.children):
            if child is not None:
                print(f"{indent}  Child {i}:")
                print_octree_node(child, depth + 1, target_point, point_index)
    elif isinstance(node, o3d.geometry.OctreeLeafNode):
        # 如果是叶子节点,打印节点中的点信息
        # print(f"{indent}  Leaf Node with {len(node.indices)} points")
        if target_point is not None:
            if point_index in node.indices:
                print(f"{indent}  >> Contains point {point_index}: {target_point}")

# 加载用户提供的点云
pcd = o3d.io.read_point_cloud("bunny.pcd")

# 构建八叉树,指定最大深度
octree = o3d.geometry.Octree(max_depth=3)
octree.convert_from_point_cloud(pcd, size_expand=0.01)

# 获取第0个点的坐标
target_point = np.asarray(pcd.points)[0]

# 遍历八叉树,并输出第0个点的八叉树信息
print("Octree traversal for point 0:")
print_octree_node(octree.root_node, target_point=target_point, point_index=0)

三、实现效果

3.1原始点云

3.2数据显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git安装包及怎么再windows上运行

第一步:下载git。 国内 Git for Windows. 国内镜像 感谢GitHub - waylau/git-for-win: Git for Windows. 国内直接从官网下载比较困难,需要翻墙。这里提供一个国内的下载站,方便网友下载 安装步骤: Git for Windows安装和基本…

VTK—vtkCutter截取平面数据

, 本例 vtkCutter可以配合隐式函数截取数据使用vtkPlane隐式函数配合vtkWidget截取任意平面。 1.读入数据 Create(vtkMultiBlockPLOT3DReader, reader);reader->SetXYZFileName("G:/Temp/vtkTest/combxyz.bin");reader->SetQFileName("G:/Tem…

Linux系统之部署轻量级Markdown文本编辑器

Linux系统之部署轻量级Markdown文本编辑器 一、项目介绍1.1 项目简介1.2 使用方法 二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源 四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看ap…

【题目/训练】:双指针

引言 我们已经在这篇博客【算法/学习】双指针-CSDN博客里面讲了双指针、二分等的相关知识。 现在我们来做一些训练吧 经典例题 1. 移动零 思路: 使用 0 当做这个中间点,把不等于 0(注意题目没说不能有负数)的放到中间点的左边,等于 0 的…

微服务设计原则——高性能:存储设计

文章目录 1.读写分离2.分库分表3.动静分离4.冷热分离5.重写轻读6.数据异构参考文献 任何一个系统,从单机到分布式,从前端到后台,功能和逻辑各不相同,但干的只有两件事:读和写。而每个系统的业务特性可能都不一样&#…

STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法 使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误,将导致所有中断优先级设置不对。 如果设置EXTI0中断优先级为10,在STM32CubeMX中配置如下: 生成的中断优先级配置代码为: 正确写法应该将中断优先级左移3位&…

python人工智能001:NumPy科学计算库说明与安装

1. NumPy说明 NumPy(Numerical Python)是Python的一个开源数值计算扩展库。它提供了一个强大的N维数组对象ndarray,以及用于对这些数组进行操作的函数。NumPy的数组和数组操作是Python数据分析、机器学习、科学计算等领域的基础。 NumPy的主…

web开发环境搭配与创建javaee项目

一.web开发 (1)web开发指的是前端,后端,以及数据库进行交互,前端发送请求到后端,后端经过程序处理后到达数据库,最后在进行后端处理响应回前端。 (2)一次三端交互的doget或者dopost简单请求流程 (3)web开发除了需要前端,后端,数据库开发工具…

Java之线程篇一

目录 如何理解进程? 进程和线程的区别 线程的优点 线程的缺点 线程异常 线程用途 创建线程 方法一:继承Thread类,重写run() 观察线程 小结 方法二: 实现Runnable接口,重写run() 方法三:继承Threa…

超越AnimateAnyone!Meta提出全身 3D虚拟人技术ExAvatar,可通过简短视频克隆人像并转化为3D数字形象

ExAvatar是由DGIST和Meta公司的Codec Avatars Lab联合研发的一项技术,能够通过捕捉视频中的动作和表情,转化为栩栩如生的3D数字形象。这项技术解决了以往技术中的难题,提高了动画的自然度和渲染效果。 什么是 ExAvatar? ExAvatar 是全新富有表现力的全身 3D 高斯化身。 结…

2.1 文件内容差异对比方法

2.1 文件内容差异对比方法 文件内容差异对比方法2.1.1 两个字符串的差异对比2.1.2 生成美观的HTML格式文档2.1.3 对比nginx 配置文件差异代码封装 文件内容差异对比方法 介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装,作用…

算法学习——树形DP——多叉树的最长路径

文章目录 引言正文0、题目的具体内容1、树的直径定理推导3、使用数组链表表示树使用数组表示链表数组表示单链表头插法演示数组表示单链表在索引k出插入一个数字数组表示链表实现代码链表表示树 4、树形DP的具体分析 总结 引言 这个问题,每一次都会痛击我&#xff…

养猫劝退?猫咪掉毛严重怎么办?用宠物空气净化器高效清理浮毛

不瞒大家说,养猫以来,我中途有无数次想要把它送人的想法,最终还是敌不过它的可爱留下来了。为什么会产生这样的念头呢?罪魁祸首就是猫毛问题。夏天是猫咪的换毛季,它们为了散热会脱去厚重的毛发,进入疯狂掉…

06结构型设计模式——代理模式

一、代理模式简介 代理模式(Proxy Pattern)是一种结构型设计模式(GoF书中解释结构型设计模式:一种用来处理类或对象、模块的组合关系的模式),代理模式是其中的一种,它可以为其他对象提供一种代…

依赖倒置原则详解

依赖倒置原则详解 一、引言 在大型系统架构设计中,依赖倒置原则(Dependency Inversion Principle,DIP)被广泛视为增强系统灵活性和可维护性的核心原则之一。最近在架构设计审查中,我们经常遇到由于依赖关系设计不当导…

叠Buff!经典麻雀优化算法+多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测

叠Buff!经典麻雀优化算法多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 叠Buff!经典麻雀优化算法多重双向深度学习!SSA-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matl…

P2858 [USACO06FEB] Treats for the Cows

题目描述 约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱。为此,约翰购置了 N 份美味的零食来卖给奶牛们。每天约翰售出一份零食。当然约翰希望这些零食全部售出后能得到最大的收益。这些零食有以下这些有趣的特性&…

(python)动态类型语言的灵活性和动态性

前言 一种具有动态类型,动态绑定,动态执行和灵活的对象模型的编程语言。它能够适应不断变化的编程需求的,是否会受欢迎? 动态语言的优点 灵活性高:开发过程更加灵活和快捷,不需要在编写代码前严格定义变量和对象的类型&#xff0…

linux之prometheus+grafana

Prometheus介绍 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合, 由go语言开发。 适合监控容器平台, 因为kubernetes(俗称k8s)的流行带动了prometheus的发展。 PS:由于目前还未学习容器,所以在今天的课程里使用prometheus监…

嵌入式Linux:proc文件系统

目录 1、使用 cat 命令读取 /proc 文件系统 2、在应用程序中使用 open() 和 read() 函数读取 /proc 文件系统 proc 文件系统是一个虚拟文件系统,它以文件系统的形式为应用层提供访问系统内核数据的接口。用户和应用程序可以通过 proc 文件系统获取系统信息和进程相…