open3d 将点云投影到平面

一、算法原理

假设点(x0, y0, z0), 平面方程为 mx + ny + sz + d = 0

过点(x0, y0, z0),且垂直平面的直线方程为
x − x 0 m = y − y 0 n = z − z 0 s \frac{x- x0}{m} = \frac{y- y0}{n}=\frac{z- z0}{s} mxx0=nyy0=szz0

点到平面的投影就是上述直线与平面的交点,注意到直线的参数方程为
x = m t + x 0 , y = n t + y 0 , z = s t + z 0 x = mt + x0,\quad y = nt + y0,\quad z = st + z0 x=mt+x0,y=nt+y0,z=st+z0
代入平面方程求解t
t = − m x + n y + s z + d m ∗ m + n ∗ n + s ∗ s t=-\frac{mx + ny + sz + d}{m*m + n*n + s*s} t=mm+nn+ssmx+ny+sz+d
将t带入到平面方程得到投影。。结合代码看易于理解。

二、代码

import numpy as np
import open3d as o3d


def plane(pcd, normal_vector):
    """
    Args:将点云投影到平面
        pcd:  点云数据
        normal_vector:  方程法向量 mx + ny + sz + d = 0  传入[m , n, s, d]
    Returns: 投影后的点云数据
    """
    plane_seeds = []   # 保存投影后的点云数据
    # 获取平面系数
    m = normal_vector[0]
    n = normal_vector[1]
    s = normal_vector[2]
    d = normal_vector[3]
    # 将点云转换为数组
    points = np.asarray(pcd.points)
    for xyz in points:
        x, y, z = xyz
        """
        t = -(m*x + n*y + s*z + d) / (m*m + n*n + s*s)  # 计算参数方程参数
        """
        t = -(m*x + n*y + s*z + d) / (m*m + n*n + s*s)  # 计算参数方程参数
        """
        xi = m*t + x    # 计算x的投影
        yi = b*t + y    # 计算y的投影
        zi = s*t + z    # 计算z的投影
        """
        xi = m * t + x  # 计算x的投影
        yi = n * t + y  # 计算y的投影
        zi = s * t + z  # 计算z的投影
        plane_seeds.append([xi, yi, zi])  # 将投影后的点云添加到数组中

    plane_cloud = o3d.geometry.PointCloud()  # 使用numpy生成点云
    plane_cloud.points = o3d.utility.Vector3dVector(plane_seeds)  # points numpy数组

    return plane_cloud


if __name__ == '__main__':
    # -------------------读取点云数据------------------------
    cloud_size = 1000
    a = np.random.ranf(cloud_size * 3).reshape(-1, 3) * 1024
    pcd = o3d.geometry.PointCloud()  # 使用numpy生成点云
    pcd.points = o3d.utility.Vector3dVector(a)  # points numpy数组
    # pcd = o3d.io.read_point_cloud('res/bunny.pcd')   # 读取兔子点云
    plane_cloud = plane(pcd, [1, 0, 1, 0])  # 获得投影后的点云数据
    # ------------------ 可视化点云 -----------------
    plane_cloud.paint_uniform_color([1, 0, 0.0])  # 渲染颜色
    o3d.visualization.draw_geometries([pcd, plane_cloud])

三、结果展示

1.原点云

在这里插入图片描述

2.点云数据向x + z = 0投影

在这里插入图片描述

四、相关数据

参考文章

pclpy 参数模型投影:pclpy 参数模型投影-CSDN博客

点到平面的投影:点到平面的投影 - 知乎 (zhihu.com)

Mac系统的软件卸载非常简单和方便。下面是使用Mac系统自带的方法来卸载软件的步骤: 1. 打开“应用程序”文件夹。你可以在屏幕上方的Dock栏找到应用程序文件夹图标,或者通过点击Finder中的“前往”菜单,选择“应用程序”来打开。 2. 在应用程序文件夹中找到要卸载的软件。你可以直接浏览文件夹,或者使用搜索功能来找到要卸载的软件。 3. 将要卸载的软件拖动到“废纸篓”(可以在Dock中找到废纸篓图标),或者在软件图标上点击右键,选择“将xxx移到废纸篓”。 4. 随后会出现一个确认提示框,询问你是否想要彻底删除该软件,以及与其关联的文件。如果确定,请点击“确定”。 5. 如果软件需要管理员权限才能卸载,系统可能会要求你输入管理员密码。请输入正确的密码,以完成卸载过程。 6. 在废纸篓中,右键点击软件图标,选择“安全清空废纸篓”,以彻底清除卸载软件的相关文件。 注意事项: - 卸载软件会删除与之关联的所有文件和数据,请在卸载前备份必要的文件。 - 某些软件可能在应用程序文件夹外,例如在“实用工具”文件夹中,你需要按照相同的步骤找到并卸载它们。 - 如果你不确定要卸载的软件是否会对系统造成影响,建议先进行一次简单的Google搜索,以获得其他用户的意见和建议。 使用以上方法,你可以轻松地卸载Mac系统中的软件。记住,及时清理不需要的软件能够提高系统性能和硬盘空间利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云杂项

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值