Open3D 点云按xyz轴等距切片

news2024/11/23 2:57:30

目录

一、概述

1.1原理

1.2实现步骤

1.3应用

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2按x轴切片

3.3按y轴切片

3.4按z轴切片


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

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


一、概述

        在Open3D中实现按xyz轴等距切片点云的功能,并提取特定范围内的点云数据。点云切片在点云分析、数据处理、特征提取、可视化和检测测量等方面具有广泛的应用。通过定义切片参数、提取切片点云并进行可视化,可以更好地处理和分析点云数据。

1.1原理

        点云切片的基本原理是通过在指定轴上按等距间隔提取点云中的点,使每个切片仅包含在特定范围内的点云数据。这种方法有助于分析点云数据的分布和局部特征。

1.切片间距(slice interval):
        切片间距是指切片之间的距离。确定切片间距可以帮助我们将点云等距分割成多个部分。
2.切片厚度(slice thickness):
        切片厚度是指每个切片的范围。切片厚度决定了每个切片包含的点云数据的范围。

1.2实现步骤

  1. 读取点云数据:从文件中读取点云数据。
  2. 计算点云范围:确定点云在每个坐标轴上的最小值和最大值。
  3. 定义切片参数确定切片的间距和厚度。
  4. 按坐标轴切片:对点云进行等距切片,提取每个切片的点云子集。
  5. 可视化切片结果:使用Open3D可视化切片后的点云。

1.3应用

1.点云分析:
        - 切片可以帮助我们从点云中提取感兴趣的部分,进行更细致的分析和处理。例如,提取建筑物的某一层或某一部分,进行结构分析。
2.数据处理:
        - 在点云处理过程中,切片可以用于过滤掉不需要的部分,提高处理效率。例如,仅处理特定范围内的点云数据,减少计算量。
3.特征提取:
        - 通过对点云进行切片,可以提取特定区域的几何特征,用于3D建模、对象识别和分类等任务。
4.可视化:
        - 切片可以用于点云数据的可视化,展示特定范围内的点云细节,帮助更好地理解和分析点云数据。
5.检测与测量:
        - 在工业检测和测量中,切片可以用于检测产品的某一部分是否满足规格要求,或测量某一层的厚度和形状。

二、代码实现

2.1关键函数

  • 使用自定义函数 slice_point_cloud 对点云进行等距切片。该函数接受点云对象、切片轴、切片间距和切片厚度作为参数。
  • 在函数内部,通过判断每个点的坐标值是否在切片范围内,提取满足条件的点云子集。
def slice_point_cloud(pcd, axis='z', slice_interval=0.1, slice_thickness=0.1):
    points = np.asarray(pcd.points)
    if axis == 'x':
        min_value, max_value = points[:, 0].min(), points[:, 0].max()
        axis_index = 0
    elif axis == 'y':
        min_value, max_value = points[:, 1].min(), points[:, 1].max()
        axis_index = 1
    else:  # 'z'
        min_value, max_value = points[:, 2].min(), points[:, 2].max()
        axis_index = 2

    sliced_pcds = []
    for i in np.arange(min_value, max_value, slice_interval):
        mask = (points[:, axis_index] >= i) & (points[:, axis_index] < i + slice_thickness)
        slice_points = points[mask]

        if len(slice_points) > 0:
            sliced_pcd = o3d.geometry.PointCloud()
            sliced_pcd.points = o3d.utility.Vector3dVector(slice_points)

            if pcd.has_colors():
                colors = np.asarray(pcd.colors)[mask]
                sliced_pcd.colors = o3d.utility.Vector3dVector(colors)

            if pcd.has_normals():
                normals = np.asarray(pcd.normals)[mask]
                sliced_pcd.normals = o3d.utility.Vector3dVector(normals)

            sliced_pcds.append(sliced_pcd)

    return sliced_pcds

2.2完整代码

import open3d as o3d
import numpy as np


def slice_point_cloud(pcd, axis='z', slice_interval=0.1, slice_thickness=0.1):
    """
    对点云进行等距切片,提取指定轴上的点云子集。

    参数:
    pcd (open3d.geometry.PointCloud): 输入点云。
    axis (str): 切片的轴,'x'、'y'或'z'。
    slice_interval (float): 切片间距。
    slice_thickness (float): 切片厚度。

    返回:
    list of open3d.geometry.PointCloud: 切片后的点云子集列表。
    """
    points = np.asarray(pcd.points)

    # 获取指定轴的最小值和最大值
    if axis == 'x':
        min_value, max_value = points[:, 0].min(), points[:, 0].max()
        axis_index = 0
    elif axis == 'y':
        min_value, max_value = points[:, 1].min(), points[:, 1].max()
        axis_index = 1
    else:  # 'z'
        min_value, max_value = points[:, 2].min(), points[:, 2].max()
        axis_index = 2

    # 初始化切片点云列表
    sliced_pcds = []

    # 按间距切片
    for i in np.arange(min_value, max_value, slice_interval):
        mask = (points[:, axis_index] >= i) & (points[:, axis_index] < i + slice_thickness)
        slice_points = points[mask]

        if len(slice_points) > 0:
            sliced_pcd = o3d.geometry.PointCloud()
            sliced_pcd.points = o3d.utility.Vector3dVector(slice_points)

            if pcd.has_colors():
                colors = np.asarray(pcd.colors)[mask]
                sliced_pcd.colors = o3d.utility.Vector3dVector(colors)

            if pcd.has_normals():
                normals = np.asarray(pcd.normals)[mask]
                sliced_pcd.normals = o3d.utility.Vector3dVector(normals)

            sliced_pcds.append(sliced_pcd)

    return sliced_pcds


# 读取点云数据
pcd = o3d.io.read_point_cloud("bunny.pcd")

# 定义切片参数
slice_interval = 0.05  # 切片间距
slice_thickness = 0.01  # 切片厚度

# 按xyz轴分别进行切片
sliced_pcds_x = slice_point_cloud(pcd, axis='x', slice_interval=slice_interval, slice_thickness=slice_thickness)
sliced_pcds_y = slice_point_cloud(pcd, axis='y', slice_interval=slice_interval, slice_thickness=slice_thickness)
sliced_pcds_z = slice_point_cloud(pcd, axis='z', slice_interval=slice_interval, slice_thickness=slice_thickness)

# 可视化切片后的点云
o3d.visualization.draw_geometries(sliced_pcds_x, window_name="Sliced Point Cloud along X-axis")
o3d.visualization.draw_geometries(sliced_pcds_y, window_name="Sliced Point Cloud along Y-axis")
o3d.visualization.draw_geometries(sliced_pcds_z, window_name="Sliced Point Cloud along Z-axis")

三、实现效果

3.1原始点云

3.2按x轴切片

3.3按y轴切片

3.4按z轴切片

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

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

相关文章

计算机网络通信基础概念

目录 1、网络通信的本质 2、网络的发展 3、网络协议&#xff08;TCP\IP协议&#xff09; 3.1 协议实现通信的原理 3.2 协议的具体概念 3.3 协议的模型 4、数据链路层 5、网络协议栈和操作系统的关系 6、网络协议通信过程 6.1 通信过程的封装与解包 7、以太网通信…

助力樱桃智能自动化采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建果园种植采摘场景下樱桃成熟度智能检测识别系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;再到医疗健康&#xff0c;其影响力无处不在。然而&#xff0c;当我们把目光转向中国的农业领域时&#xff0c;一个令人惊讶的…

【AI】SpringCloudAlibaba AI 学习

Spring Cloud Alibaba AI 简介 Spring Cloud Alibaba AI 以 Spring AI 为基础&#xff0c;并在此基础上提供阿里云通义系列大模型全面适配&#xff0c;让用户在 5 分钟内开发基于通义大模型的 Java AI 应用。 官网&#xff1a; https://sca.aliyun.com/ https://sca.aliyun.co…

理解 HTTP 请求中 Query 和 Body 的异同

本文将深入探讨HTTP请求中的两个关键要素&#xff1a;查询参数&#xff08;Query&#xff09;和请求体&#xff08;Body&#xff09;。我们将阐明它们之间的差异&#xff0c;并讨论在何种情况下使用每一种。 HTTP 请求概述 HTTP 请求是客户端&#xff08;如浏览器&#xff09…

知道秘密的人

一、力扣题目&#xff1a; 二、理论分析 由于 天数是一天一天变化的&#xff0c;用 数组的下标代表天数i, 数组中的 数据代表知道秘密在第i天的人数 假设在某个人在知道秘密的第3天开始传播&#xff0c;在第6天忘记&#xff0c;由于 第1天1个人发现了秘密 spread为能传播秘密的…

MATLAB-bode图编程

num[1 1];den [2 1];tf(num,den)bode(tf(num,den));hold on

【QT】TCP

目录 核心API 示例&#xff1a;服务器和客户端信息互发 服务器代码实现 第一步&#xff1a;创建QTcpServer对象的实例 第二步&#xff1a;绑定信号槽&#xff0c;处理新的连接 第三步&#xff1a;绑定并监听端口号 客户端代码实现 第一步&#xff1a;创建socket对象的实…

【计算机网络】WireShark和简单http抓包实验

一&#xff1a;实验目的 1&#xff1a;熟悉WireShark的安装流程和界面操作流程。 2&#xff1a;学会简单http的抓取和过滤&#xff0c;并分析导出结果。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a; Windows 2019操作系统的计算机等。 软件&#xff1a;WireShark、…

智能PDF转markdown

嘿&#xff0c;各位技术大咖们&#xff0c;今天我要给大家带来一个超酷的项目——“智能PDF转Markdown”&#xff0c;这可是数字化办公的神器&#xff0c;基于Marker技术&#xff0c;让PDF文档秒变Markdown&#xff0c;轻松应对RAG知识库构建等任务的挑战&#xff01; 打造了一…

Python | Leetcode Python题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; class Solution:def getHint(self, secret: str, guess: str) -> str:bulls 0cntS, cntG [0] * 10, [0] * 10for s, g in zip(secret, guess):if s g:bulls 1else:cntS[int(s)] 1cntG[int(g)] 1cows sum(min(s, g) for s, g in z…

学习笔记 韩顺平 零基础30天学会Java(2024.7.22)

P407 接口使用细节2 P407 接口课堂练习 对于最后一个的输出&#xff1a;B因为实现了A的接口&#xff0c;所以和继承一样&#xff0c;B可以访问A的变量 P409 接口VS继承 接口对单继承机制&#xff08;是指只能继承一个类&#xff09;进行了补充 也可以理解为&#xff0c;子类通过…

IndexError: list index out of range

IndexError: list index out of range 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.net、C、python开发&#xff0c; 如果遇到技术问题&#xff0c;即…

锅总介绍CNCF主要目标、全景图及发展历史

一、CNCF简介 云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;简称 CNCF&#xff09;是一个成立于 2015 年的非营利性组织&#xff0c;隶属于 Linux 基金会。CNCF 的主要目标是通过开源软件推动云原生计算技术的发展和普及&#xff0c;帮助企业更…

【C语言篇】C语言数据类型和变量

文章目录 C语言数据类型和变量1. 数据类型介绍1.1 字符型1.2 整形1.3 浮点型1.4 布尔类型1.5 各种类型数据长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof表达式不计算 2. signed和unsigned3. 数据类型的取值范围4. 变量4.1变量的创建4.2 变量的分类 5.强制类型转换 C语…

Redis:快速键值存储的入门指南

一、什么是Redis&#xff1f; Redis&#xff0c;全称为Remote Dictionary Server&#xff0c;是一种开源的、高性能的键值&#xff08;Key-Value&#xff09;存储系统。与传统的关系型数据库不同&#xff0c;Redis将数据主要存储在内存中&#xff0c;因此能够提供极低延迟的数…

网络传输层——UDP与TCP

前言&#xff1a; 1.国际网络体系结构&#xff1a; OSI模型: open system interconnect 理论模型 1977 国际标准化组织 各种不同体系结构的计算机能在世界范围内互联成网。 应用层:要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等…

【C语言】宏定义常量加 ; 的错误

我在使用宏定义常量定义二维数组的时候&#xff0c;编译器报错&#xff1a;应输入“]”&#xff0c;如下&#xff1a; 原因是宏定义不是C语言规定的语句&#xff0c;它的结尾不加 ; 。在上图的 int mine[EASY_ROWS][EASY_COLS]; 中&#xff0c;把 EASY_ROWS 替换为了 9;2; &…

Typora 以 Github 作为图床使用 PicGo 上传图片

本文简练快速介绍如标题所述的操作流程 文章目录 1.前言1.1 图床简述1.2 Github图床的优缺点1.2.1 优点1.2.2 缺点 2.下载PicGo3.Github访问加速4.用github创建图床服务器4.1 注册4.2 创建仓库 4.3 生成TOKEN令牌5.设置PicGo6.设置Typora7.完成 1.前言 1.1 图床简述 图床&…

车载音频记录

一、车载音频总线 2.8车载音频总线A2B Automotive Audio Bus_a2b总线-CSDN博客 传统的车载音频接口采用的是点对点模式&#xff0c;车身数字音频总线采用环型或者菊花链型总线。 A2B&#xff1a;Automotive Audio Bus 支持串联拓扑&#xff0c;即单个主机最多连接10个…