当前位置: 首页 > news >正文

Open3D 点云的圆柱形邻域搜索

目录

一、概述

1.1原理

1.2应用

二、代码实现

2.1完整代码

2.2程序说明

三、实现效果

3.1原始点云

3.2搜索后点云


一、概述

1.1原理

        圆柱邻域搜索的基本思想是确定点云中的哪些点位于给定圆柱的内部。一个圆柱可以由以下几个参数定义:

  • 中心点:圆柱底面的中心。
  • 轴向量:圆柱的中心轴方向。
  • 半径:圆柱的半径。
  • 高度:圆柱的高度。

计算步骤:

1.2应用

        圆柱邻域搜索是一种几何查询方法,用于在点云数据中查找与给定圆柱相交的点。该方法广泛应用于以下领域:

  1. 三维形状分析:用于识别和分析点云数据中的圆柱形状特征,如管道、圆柱形建筑结构等。
  2. 机器人导航:帮助机器人理解其周围环境的几何结构,以便在复杂的三维空间中导航。
  3. 工业检测:用于检测和测量工业环境中的圆柱形物体,如管道的直径、表面缺陷等。
  4. 计算机视觉:在3D重建和场景理解中,圆柱邻域搜索可以帮助识别和分割特定的几何形状。

二、代码实现

2.1完整代码


import open3d as o3d
import numpy as np
import matplotlib.pyplot as pltdef cylinder_neighborhood_search(pcd, center, axis, radius, height):"""计算点云中位于指定圆柱形领域内的点。参数:- pcd: open3d.geometry.PointCloud 对象- center: 圆柱中心点(numpy数组)- axis: 圆柱轴向量(numpy数组)- radius: 圆柱半径- height: 圆柱高度返回:- cylinder_points: 位于圆柱形领域内的点的索引"""points = np.asarray(pcd.points)axis = axis / np.linalg.norm(axis)  # 规范化轴向量# 计算每个点到圆柱轴的距离vec = points - centerproj_len = np.dot(vec, axis)proj_points = center + np.outer(proj_len, axis)dist_to_axis = np.linalg.norm(points - proj_points, axis=1)# 计算每个点沿轴向的投影长度height_projection = np.dot(vec, axis)# 选择符合条件的点mask = (dist_to_axis <= radius) & (height_projection >= 0) & (height_projection <= height)cylinder_points = np.where(mask)[0]return cylinder_points# 读取点云数据
pcd = o3d.io.read_point_cloud("happy buddha.pcd")# 随机选择一个点作为圆柱中心点
points = np.asarray(pcd.points)
# random_index = np.random.randint(0, len(points))
center = points[1]
#
# 定义圆柱形领域的参数
axis = np.array([0, 1, 0])  # 圆柱轴向量
radius = 0.02  # 圆柱半径
height = 1000  # 圆柱高度# 获取圆柱形领域内的点
cylinder_indices = cylinder_neighborhood_search(pcd, center, axis, radius, height)# 提取圆柱形领域内的点云
cylinder_pcd = pcd.select_by_index(cylinder_indices)# 设置颜色用于区分原始点云和圆柱形领域点云
colors = np.zeros((len(pcd.points), 3))
colors[:, 0] = 1  # 原始点云颜色设为红色
colors[cylinder_indices, :] = [0, 1, 0]  # 圆柱形领域点云颜色设为绿色# 应用颜色到原始点云
pcd.colors = o3d.utility.Vector3dVector(colors)# 可视化原始点云和圆柱形领域点云
o3d.visualization.draw_geometries([pcd, cylinder_pcd])

2.2程序说明

  1. 圆柱形邻域搜索函数:cylinder_neighborhood_search函数接收点云、圆柱的中心、轴向量、半径和高度作为参数。通过计算每个点到圆柱轴的距离和点在轴向上的投影长度来判断点是否在圆柱形领域内。
  2. 读取点云数据:使用o3d.io.read_point_cloud函数读取点云数据。
  3. 定义圆柱形领域的参数:圆柱的中心、轴向量、半径和高度。
  4. 获取圆柱形领域内的点:使用自定义的圆柱形邻域搜索函数获取圆柱形领域内的点索引。
  5. 提取圆柱形领域内的点云:使用select_by_index函数提取圆柱形领域内的点云。
  6. 设置颜色用于区分原始点云和圆柱形领域点云:原始点云设置为红色,圆柱形领域内的点云设置为绿色。
  7. 可视化:使用o3d.visualization.draw_geometries函数同时可视化原始点云和圆柱形领域点云。

三、实现效果

3.1原始点云

3.2搜索后点云

http://www.lryc.cn/news/393939.html

相关文章:

  • python如何设计窗口
  • C语言获取当前时间
  • 【每日一练】python三目运算符的用法
  • CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路
  • Git 常用命令备忘
  • Ubuntu24.04安装Skynet环境
  • 【C++】cout.self()函数
  • VueQuill 富文本编辑器技术文档快速上手
  • 链式二叉树oj题
  • Curator 是一个开源工具为 Elasticsearch 集群设计,用于自动化索引的维护任务。
  • STM32-PWR和WDG看门狗
  • C++循环队列 经典示例
  • 【程序大侠传】大表分库分表切换数据库类型导致pagehelper生成sql语法报错
  • 7、Redis 队列与 Stream
  • FFT剖析
  • git clone报错RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly
  • Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库
  • SpringBoot 自定义异常返回数据格式
  • 【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!
  • 【Unity 3D角色移动】
  • 个人视角,社会影响力:自媒体的魅力所在
  • 算法训练营day70
  • EtherCAT转Profinet网关配置说明第二讲:上位机软件配置
  • 日志自动分析-Web---360星图GoaccessALBAnolog
  • 【面试八股文】java基础知识
  • ssrf结合redis未授权getshell
  • 魔法自如:精通 IPython %automagic 命令的切换艺术
  • 基于CentOS Stream 9平台搭建MinIO以及开机自启
  • shell-awk语法整理
  • 关于忠诚:忠于自己的良知、理想、信念