圆柱包围框-Bounding Cylinder-原理-代码实现

  • 定义:使用一个圆柱体包围点云的所有点,通常用于长柱状物体。

  • 优点:适合于柱状或长条形的点云。

  • 缺点:计算较为复杂,尤其是确定圆柱体的轴线方向和半径。

  • 找到圆柱尽量满足下面条件

    • 找到能够完全包围3D物体的最小圆柱体。
    • 这个圆柱体的轴线通常与物体的主轴对齐。
    • 圆柱体的半径要足够大以包含物体的所有点。
    • 圆柱体的高度要足够长以覆盖物体在轴向上的全部范围。

算法步骤

  • 计算物体的主轴:
    • 使用主成分分析(PCA)来确定物体的主要方向。
    • PCA会给出物体点云的协方差矩阵的特征向量,其中最大特征值对应的特征向量即为主轴方向。
  • 对齐坐标系:
    • 将物体旋转,使其主轴与坐标系的z轴对齐。
  • 计算圆柱半径:
    • 在xy平面上投影所有点。
    • 找出距离z轴最远的点,其到z轴的距离即为圆柱半径。
  • 计算圆柱高度:
    • 找出物体在z轴方向上的最大和最小值。
    • 圆柱高度为这两个极值之差。
  • 确定圆柱位置:
    • 圆柱底面中心的z坐标为物体在z轴上的最小值。
    • xy平面上的中心可以取物体质心的xy坐标。
  • 优化(可选):
    • 可以微调圆柱的位置和方向,以最小化圆柱体积。
  • 转换回原始坐标系:
    • 将计算得到的圆柱体从对齐后的坐标系转换回原始坐标系。
def bounding_cylinder(points):# 计算点云的协方差矩阵cov_mat = np.cov(points, rowvar=False)# 计算协方差矩阵的特征值和特征向量eigenvalues, eigenvectors = np.linalg.eig(cov_mat)# 找到最大特征值对应的特征向量,这就是圆柱的主轴major_axis = eigenvectors[:, np.argmax(eigenvalues)]# 将点投影到主轴上projected_points = np.dot(points, major_axis)# 计算圆柱的高度height = np.max(projected_points) - np.min(projected_points)# 计算圆柱的中心点center = np.mean(points, axis=0)# 计算点到主轴的距离distances = np.linalg.norm(np.cross(points - center, major_axis), axis=1)# 圆柱的半径是最大距离radius = np.max(distances)return {'center': center,'axis': major_axis,'radius': radius,'height': height}

完整代码

下面增加可视化的代码部分

import numpy as np
import plotly.graph_objects as godef bounding_cylinder(points):# 计算点云的协方差矩阵cov_mat = np.cov(points, rowvar=False)# 计算协方差矩阵的特征值和特征向量eigenvalues, eigenvectors = np.linalg.eig(cov_mat)# 找到最大特征值对应的特征向量,这就是圆柱的主轴major_axis = eigenvectors[:, np.argmax(eigenvalues)]# 将点投影到主轴上projected_points = np.dot(points, major_axis)# 计算圆柱的高度height = np.max(projected_points) - np.min(projected_points)# 计算圆柱的中心点center = np.mean(points, axis=0)# 计算点到主轴的距离distances = np.linalg.norm(np.cross(points - center, major_axis), axis=1)# 圆柱的半径是最大距离radius = np.max(distances)return {'center': center,'axis': major_axis,'radius': radius,'height': height}def create_cylinder_mesh(center, axis, radius, height, resolution=50):# 生成圆柱表面的点theta = np.linspace(0, 2*np.pi, resolution)z = np.linspace(-height/2, height/2, resolution)theta, z = np.meshgrid(theta, z)x = radius * np.cos(theta)y = radius * np.sin(theta)# 创建旋转矩阵rotation_matrix = np.eye(3)rotation_matrix[:, 2] = axisrotation_matrix[:, 0] = np.cross(axis, [0, 1, 0])rotation_matrix[:, 1] = np.cross(rotation_matrix[:, 2], rotation_matrix[:, 0])# 应用旋转coords = np.dot(np.array([x.flatten(), y.flatten(), z.flatten()]).T, rotation_matrix)# 平移到中心coords += centerreturn coords.T.reshape((3, resolution, resolution))def visualize_bounding_cylinder(points, cylinder):# 创建点云散点图scatter = go.Scatter3d(x=points[:, 0], y=points[:, 1], z=points[:, 2],mode='markers',marker=dict(size=2, color='blue', opacity=0.5),name='Point Cloud')# 创建圆柱体表面cylinder_mesh = create_cylinder_mesh(cylinder['center'], cylinder['axis'], cylinder['radius'], cylinder['height'])surface = go.Surface(x=cylinder_mesh[0], y=cylinder_mesh[1], z=cylinder_mesh[2],colorscale=[[0, 'red'], [1, 'red']],opacity=0.5,name='Bounding Cylinder')# 创建图形布局layout = go.Layout(scene=dict(xaxis_title='X',yaxis_title='Y',zaxis_title='Z',aspectmode='data'),title='点云和包围圆柱')# 创建图形fig = go.Figure(data=[scatter, surface], layout=layout)# 显示图形fig.show()# 主程序
if __name__ == "__main__":# 生成一些随机点np.random.seed(0)points = np.random.randn(1000, 3) * [1, 1, 3]  # 创建一个椭圆形的点云cylinder = bounding_cylinder(points)print("圆柱中心:", cylinder['center'])print("圆柱轴:", cylinder['axis'])print("圆柱半径:", cylinder['radius'])print("圆柱高度:", cylinder['height'])# 可视化结果visualize_bounding_cylinder(points, cylinder)

Pasted image 20240920221917

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

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

相关文章

户外无线麦克风哪个牌子好,降噪麦克风哪个牌子好,领夹麦推荐

对于热爱记录与户外直播的自媒体人来说,一款高性能的无线领夹麦克风决定了音频的质量。市场上虽有品牌如大疆、罗德、西圣等凭借技术创新引领潮流,但同时也存在一些产品,因设计缺陷在运动时声音捕捉不稳定。作为运动爱好者与音频设备测评师&a…

网络资源模板--Android Studio 图书借阅App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--图书借阅App 二、项目测试环境 三、项目详情 首页 这段代码是一个 Android 应用的 MainActivity 类,功能简要总结如下: 1. **界面设置**&#xf…

数据结构不再难懂:带你轻松搞定图

数据结构入门学习(全是干货)——图 1 图 1.1 什么是图 图是一种用于表示多对多关系的数学模型。它由一组顶点和一组边构成,用于描述事物之间的复杂关联。 顶点:通常用 V (Vertex) 表示,代表事物或对象。边&#xf…

2024华为杯研赛E题保姆级教程思路分析

E题题目:高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理,实际上,E题的难度相对来说较低,大家不用畏惧视频的处理,被这个吓到。实际上,这个不难,解决了视频的处理问题,…

华为---代理ARP工作过程示例分析

目录 1. 示例场景 2. 基本配置 3. 配置代码 4. 测试验证 5. 抓包分析 5.1 在代理ARP环境下PC1和PC2通信分析 5.2 取消代理ARP环境下PC1和PC2通信分析 【1】取消R1路由器GE 0/0/1端口ARP代理 【2】取消R2路由器GE 0/0/1端口ARP代理 1. 示例场景 如上图所示,…

windows环境下配置MySQL主从启动失败 查看data文件夹中.err发现报错unknown variable ‘log‐bin=mysql‐bin‘

文章目录 问题解决方法 问题 今天在windows环境下配置MySQL主从同步,在修改my.ini文件后发现MySQL启动失败了 打开my.ini检查参数发现没有问题 [mysqld] #开启二进制日志,记录了所有更改数据库数据的SQL语句 log‐bin mysql‐bin #设置服务id&#x…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda (总结全部的精华) 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找,学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

农业电商服务系统小程序的设计

管理员账户功能包括:系统首页,个人中心,会员管理,商家管理,商品分类管理,商品信息管理,农产品监督管理,助农信息管理,系统管理 微信端账号功能包括:系统首页…

使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI

目录 概述 1 系统框架介绍 1.1 模块功能介绍 1.2 UI页面功能 2 软件框架结构实现 2.1 软件框架图 2.1.1 应用层API 2.1.2 硬件驱动层 2.1.3 MCU底层驱动 2.2 软件流程图 4 软件功能实现 4.1 状态机功能核心代码 4.2 页面功能函数 4.3 源代码文件 5 功能测试 5.1…

AI字幕翻译器行业分析:前五大厂商占有大约29.5%的市场份额

AI 字幕翻译器正在彻底改变我们使用不同语言消费媒体的方式,使内容可以普遍访问。这些先进的技术利用机器学习和自然语言处理,将口语对话实时翻译成字幕。这一功能不仅打破了语言障碍,提升了观众的体验,而且还使内容创作者能够毫不…

火语言RPA流程组件介绍--获取关联元素

🚩【组件功能】:获取指定元素的父元素、子元素、相邻元素等关联信息 配置预览 配置说明 目标元素 支持T或# 默认FLOW输入项 通过自动捕获工具捕获(选择元素工具使用方法)或手动填写网页元素的css,xpath,指定对应网页元素作为操作目标 关联…

Arthas jvm(查看当前JVM的信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.3 jvm(查看当前JVM的信息) 二、命令列表 2.1 jvm相关命令 2.1.3 jvm(查看当前JVM的信息) 基础语法: jvm [arthas18139]$ jvmRUNTIME …

JUC 高并发编程的入门学习

课程内容概览 什么是 JUCLock 接口线程间通信集合的线程安全多线程锁Callable 接口JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore读写锁: ReentrantReadWriteLock阻塞队列ThreadPool 线程池Fork/Join 框架CompletableFuture 1 什么是 JUC 1.1 JUC 简介 在 Java …

小tips:MySQL中如何导出表中的数据(Navicat)

1.在Navicat中找出想要导出数据的表 2.将箭头放在目的表上,点击右键--->点击复制表--->点击结构和数据或者仅结构(根据需求选择需要复制的内容)

CertiK因发现Apple Vision Pro眼动追踪技术漏洞,第6次获苹果认可

​2024年9月20日,头部Web3.0安全机构CertiK自豪地宣布,CertiK的工程师因发现Apple Vision Pro MR(混合现实)头显设备中的关键漏洞而获得Apple公司认可,这已经是Apple公司第六次公开发布对CertiK的致谢,Cert…

JAVA自助高效安全无人台球茶室棋牌室系统小程序源码

​探索“自助高效安全无人台球茶室棋牌室系统”的奇妙之旅 🎱🍵🎲 🔍 初见惊艳:未来娱乐新体验 🔍 走进这家无人值守的台球茶室棋牌室,第一感觉就像是穿越到了未来!没有繁琐的前台登…

伊犁云计算22-1 ftp 配置

1 局域网搭建好 2 yum 编译好 开干 查看有没有安装vsftpd 加载iso 光盘

如何短期提高品牌声量?说几个有效策略

在如今竞争激烈的市场环境中,品牌声量成为了衡量一个品牌市场影响力的关键指标。一个强大的品牌声量不仅可以增加品牌的可见度,还能有效提升品牌的市场竞争力。但是,如何有效提升品牌声量,成为很多企业面临的挑战。首先我们要明确…

球形包围框-Bounding Sphere-原理-代码实现

定义:通过一个球体包围所有点云点,该球体的球心和半径由点云的分布决定,并且球体的半径尽可能小。优点:计算简单,通常用于快速粗略估计物体的范围。缺点:对于不规则形状的物体,包围不紧密&#…

VMware tools安装

1.安装VMware tools工具 2.将压缩文件拖到桌面再解压 3. 进入终端 4.输入sudo ./vmware-install.pl 5.等待即安装成功 6.可以选择自动调整大小 7.自行调试即可