3D Vision--生成空间任意圆柱及任意直线

2023-11-02

写在前面

1、内容:
如何生成空间任意圆柱体点云及其轴线,任意直线的生成也就是本文轴线的生成方式。
2、环境:
open3d
2、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/121482141

几何原理

圆柱的方程,用于拟合已有圆柱:

圆柱上的点到轴线的距离等于圆柱的底面半径
( x − x 0 ) 2 + ( y − y 0 ) 2 + ( z − z 0 ) 2 − [ a ( x − x 0 ) + b ( y − y 0 ) + c ( z − z 0 ) ] 2 = r 0 2 (x-x_0)^2+(y-y_0)^2+(z-z_0)^2-[a(x-x_0)+b(y-y_0)+c(z-z_0)]^2={r_0}^2 (xx0)2+(yy0)2+(zz0)2[a(xx0)+b(yy0)+c(zz0)]2=r02
在这里插入图片描述

参考:
https://blog.csdn.net/qq_30815237/article/details/90405087

圆柱空间参数方程,用于生成圆柱:

x = x 0 + r B A 2 + B 2 cos ⁡ u + r A C A 2 + B 2 A 2 + B 2 + C 2 sin ⁡ u + A A 2 + B 2 + C 2 v y = y 0 − r B A 2 + B 2 cos ⁡ u + r B C A 2 + B 2 A 2 + B 2 + C 2 sin ⁡ u + B A 2 + B 2 + C 2 v z = z 0 − r A 2 + B 2 A 2 + B 2 + C 2 sin ⁡ u + C A 2 + B 2 + C 2 v 0 ≤ u ≤ 2 π , v m i n < v < v m a x \begin{aligned} x & =x_0+r\frac{B}{\sqrt{A^2+B^2}}\cos{u}+r\frac{AC}{\sqrt{A^2+B^2}\sqrt{A^2+B^2+C^2}}\sin{u}+\frac{A}{\sqrt{A^2+B^2+C^2}}v\\ y & = y_0-r\frac{B}{\sqrt{A^2+B^2}}\cos{u}+r\frac{BC}{\sqrt{A^2+B^2}\sqrt{A^2+B^2+C^2}}\sin{u}+\frac{B}{\sqrt{A^2+B^2+C^2}}v\\ z & = z_0-r\frac{\sqrt{A^2+B^2}}{\sqrt{A^2+B^2+C^2}}\sin{u}+\frac{C}{\sqrt{A^2+B^2+C^2}}v\\ & 0\le{u}\le2\pi, v_{min}<v<v_{max} \end{aligned} xyz=x0+rA2+B2 Bcosu+rA2+B2 A2+B2+C2 ACsinu+A2+B2+C2 Av=y0rA2+B2 Bcosu+rA2+B2 A2+B2+C2 BCsinu+A2+B2+C2 Bv=z0rA2+B2+C2 A2+B2 sinu+A2+B2+C2 Cv0u2π,vmin<v<vmax
参考:
https://blog.csdn.net/inerterYang/article/details/111998278

python代码

import open3d as o3d
import numpy as np

def create_cylinder(cylinder_coefficients, height=5, step=0.5, vis=False):
    """

    Args:
        cylinder_coefficients: A dictionary containing cylindrical coefficients:
                                (r,x0,y0,z0,a,b,c
                                r the radius of the cylinder
                                x0,y0,z0 the Starting center of the cylinder
                                a, b, c: axis coefficient of the cylinder)
        height: height_ of the cylinder
        step: Density of cylinder point cloud
        vis: whether to visualize the cylinder

    Returns:
        numpy form of the cylinder point cloud: n x 3
    References:
        https://blog.csdn.net/inerterYang/article/details/111998278
        https://blog.csdn.net/inerterYang/article/details/111304307

    @Author: Carlos_Lee 202111

    """
    r = cylinder_coefficients['r']
    x0 = cylinder_coefficients['x0']
    y0 = cylinder_coefficients['y0']
    z0 = cylinder_coefficients['z0']
    a = cylinder_coefficients['a']
    b = cylinder_coefficients['b']
    c = cylinder_coefficients['c']

    angle_ = np.arange(0, 2 * np.pi, step / 10).reshape(-1, 1)

    v = np.arange(0, height, step)
    npy = []
    for i in v:
        x = x0 + r * b / np.power(a * a + b * b, 0.5) * np.cos(angle_) + \
            r * a * c / np.power(a * a + b * b, 0.5) / np.power(a * a + b * b + c * c, 0.5) * \
            np.sin(angle_) + a / np.power(a * a + b * b + c * c, 0.5) * i

        y = y0 - r * a / np.power(a * a + b * b, 0.5) * np.cos(angle_) + \
            r * b * c / np.power(a * a + b * b, 0.5) / np.power(a * a + b * b + c * c, 0.5) * \
            np.sin(angle_) + b / np.power(a * a + b * b + c * c, 0.5) * i

        z = z0 - r * np.power(a * a + b * b, 0.5) / np.power(a * a + b * b + c * c, 0.5) * np.sin(angle_) + \
            c / np.power(a * a + b * b + c * c, 0.5) * i

        npy.append(np.concatenate([x, y, z], axis=-1))

    npy = np.concatenate(npy, axis=0)
    if vis:
        coordinate_ = o3d.geometry.TriangleMesh.create_coordinate_frame(size=height / 2., origin=[0.0, 0.0, 0.0])
        pcd_ = o3d.geometry.PointCloud()
        pcd_.points = o3d.utility.Vector3dVector(npy)
        o3d.visualization.draw_geometries([coordinate_, pcd_], window_name="generate cylinder",
                                          width=960, height=900, left=960, top=100)
    return npy

if __name__ == "__main__":
    cylinder_coefficients = {'r': 2.0, 'x0': 0, 'y0': 0, 'z0': 0, 'a': 1, 'b': 1, 'c': 0}
    cylinder_npy = create_cylinder(cylinder_coefficients=cylinder_coefficients, height=5, step=0.05, vis=True)

完整测试代码在GitHub:
https://github.com/Noel-Gallagher-Highflyingbirds/geometry

生成结果

测试
在这里插入图片描述

在这里插入图片描述

--------------------------------------------------------------------------------------------诺有缸的高飞鸟202111

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3D Vision--生成空间任意圆柱及任意直线 的相关文章

随机推荐

  • spring文件上传

    spring文件上传 在pom xml文件中加入
  • 不受环境干扰,这套声学全息方案实现了虚实交互

    一谈到全息显示 大家默认想到的就是光学全息方案 比如需要将光投射到某样东西上 比如视网膜 或是烟雾等介质上 才能成像 市面上一些常见的2D 3D全息方案 如全息风扇 Voxon全息系统等等 分别采用高速移动的条状光源或是平面介质 利用人眼视
  • show_bytes函数

    show bytes打印出每个以十六进制表示的字节 这段代码使用强制转换来访问和打印不同程序对象的字节表示 用typedef将数据结构类型byte pointer定义为一个指向类型 unsigned char 的对象的指针 typedef
  • 使用PicGo搭建github图床时出现图片上传失败(加载栏红色)的解决方法

    问题 使用PicGo搭建github图床 出现图片上传失败 加载栏红色 具体 图片上传失败 加载栏红色 解决后又发现图片可以用但是没法显示的问题 解决方案 解决方案 设定分支名改为main就好了 而不是master 最后重启一下就可以了 图
  • php网页能实现飘窗吗,网站飘窗广告的实现方法

    原标题 网站飘窗广告的实现方法 效果 代码 以上 在background url里设置飘窗广告图片的外链地址 其他参数也可以自己调整 像width height 关闭 以上 在a href里设置需要跳转的页面 lt language jav
  • 参考椭球体与大地水准面的区别

    转载 https www propelleraero com geoids vs ellipsoids whats the difference https support virtual surveyor com support solu
  • 结合机器学习的人口模型能够提高心理健康测量的准确性

    结合机器学习的人口模型能够提高心理健康测量的准确性 导语 关键术语解释 方法 Software Workflow Fig 1 Methods workflow https img blog csdnimg cn eea5b06d071242
  • 编译器(GNU & GCC & clang & llvm)

    前言 很多时候 出现一些类似GNU GCC CLANG LLVM等与编译器有关的名词的时候 都不太清楚它到底是干嘛的 理解这些东西后 对于xcode中很多配置型的需求修改起来都会得心应手 因此有必要了解透彻他们直接的关系与区别 1 GNU
  • 关于影视后期制作的就业市场调查报告

    关于影视后期制作的就业市场调查报告 21电商王绮悦 目 录 一 简介及发展前景 二 技能要求 三 工作内容 四 用人单位类型 五 发展路径及其所需具体技能 六 行业优势 七 行业劣势 八 自身分析 九 对暑期实践的规划 十 学习材料 十一
  • 2023暑期实习历程总结

    一 前言 Hello 大家好久不见 已经三个月左右没有更新了 那我这三个月在干什么呢 自2023年3月中旬开始到现在五月底这期间接近三个月的时间里 我一直在进行2023暑期实习的投递和面试 这期间投递了包括各大中厂 阿里 腾讯 蚂蚁 美团
  • Jmter的安装及使用

    Jmter的安装 浏览器下载安装解压 解压后控制台输入控制命令cmd 将解压后的jmter bin文件夹下的jmter bat拖入控制台 打开jmter 使用Jmter 在jmter中可以添加各种测试 这是一个抗压测试 各种功能测试可以百度
  • SIP协议-02 原理讲解

    文章目录 1 SIP实现机制 2 SIP网络元素 2 1 用户代理 2 2 代理服务器 2 3 重定向服务器 2 4 位置服务器 2 5 注册服务器 3 SIP中的几个重要概念 3 1 Messages 消息 3 2 Dialog 对话 3
  • PLSQL Developer安装配置教程(超详细)

    前言 首先要有oracle数据库或者有oracle服务器 才可以实现使用PLSQL Developer 工具连接到oracle数据库进行开发 1 下载 PLSQL Developer 链接 https pan baidu com s 1zV
  • 是科研人就要快!加速你的算法!

    在科研中 大多数论文其实还是看精度和效果的 对于速度其实没有那么高的追求 很多人用速度评价自己算法的复杂度很低 但实际上这是不准确的 当然在精度占优的情况下 能够提高速度 给自己的实验结果增彩 关于算法程序的加速 在动手前先要按照如下流程进
  • Linux下的iptables防火墙管理方法

    Linux下的iptables防火墙管理方法 文章目录 Linux下的iptables防火墙管理方法 1 什么是iptables 2 iptables命令参数 3 iptables策略 4 iptables地址转发 5 iptables端口
  • VUE中使用RSA加密

    一 安装 npm install jsencrypt save 二 在main js中引用依赖 导入RSA加密 import JSEncrypt from jsencrypt Vue prototype getRsaCode functio
  • 6种延时队列的实现方案

    延时队列的应用 什么是延时队列 顾名思义 首先它要具有队列的特性 再给它附加一个延迟消费队列消息的功能 也就是说可以指定队列中的消息在哪个时间点被消费 延时队列在项目中的应用还是比较多的 尤其像电商类平台 订单成功后 在30分钟内没有支付
  • 一级二级菜单slideToggle

  • 最短路径之迪克斯特拉(Dijkstra)算法

    何谓最短路径 顾名思义就是在一个图中 一个顶点到另外一个顶点的最短距离拉 那么这里有一点要注意 就是在网图中 边的权值各不相同 最短路径指的是俩点之间的连线权值最小 在非网图 边的权值都默认为1 中最短路径指的是边数最少的 从一个顶点到其余
  • 3D Vision--生成空间任意圆柱及任意直线

    contents 写在前面 几何原理 圆柱的方程 用于拟合已有圆柱 圆柱空间参数方程 用于生成圆柱 python代码 生成结果 完 写在前面 1 内容 如何生成空间任意圆柱体点云及其轴线 任意直线的生成也就是本文轴线的生成方式 2 环境 o