Open3D 将点云投影到球面

目录

一、概述

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2投影后点云


前期试读,后续会将博客加入下列链接的专栏,欢迎订阅

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

一、概述

        将点云投影到球面是一个常见的几何操作,尤其在计算机视觉和3D图形学中。此篇博客将演示如何使用 Open3D 和 Python 将点云投影到一个给定的球面上。

        假设我们有一个点云,我们想要将其投影到一个半径为 R 的球面上。我们可以通过以下步骤来实现这一操作:

1.生成或读取点云数据:
        使用 Open3D 生成或读取点云数据。
2.计算投影向量:
        计算每个点到球心的向量,并将其归一化,使得其长度等于球的半径。
3.替换点云数据:
        用归一化后的向量替换原始点云的坐标。
4.可视化结果:
        使用 Open3D 可视化投影后的点云数据。

二、代码实现

2.1关键函数

        在 project_to_sphere 函数中,首先计算每个点到球心的向量,并将其归一化,使得其长度等于球的半径。具体来说,通过计算每个点的范数(即点到球心的距离),然后用每个点的坐标除以其范数,得到归一化的向量。

def project_to_sphere(pcd, radius):
    """
    将点云投影到给定半径的球面上。

    参数:
    pcd (open3d.geometry.PointCloud): 输入点云。
    radius (float): 球的半径。

    返回:
    open3d.geometry.PointCloud: 投影后的点云。
    """
    points = np.asarray(pcd.points)
    # 计算点到球心的向量并归一化
    norms = np.linalg.norm(points, axis=1, keepdims=True)
    projected_points = (points / norms) * radius

    # 创建新的点云
    projected_pcd = o3d.geometry.PointCloud()
    projected_pcd.points = o3d.utility.Vector3dVector(projected_points)
    return projected_pcd

2.2完整代码

import open3d as o3d
import numpy as np

def generate_random_point_cloud(num_points=1000):
    """
    生成随机点云数据。

    参数:
    num_points (int): 点的数量。

    返回:
    open3d.geometry.PointCloud: 生成的点云。
    """
    points = np.random.uniform(-1, 1, (num_points, 3))
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(points)
    return pcd

def project_to_sphere(pcd, radius):
    """
    将点云投影到给定半径的球面上。

    参数:
    pcd (open3d.geometry.PointCloud): 输入点云。
    radius (float): 球的半径。

    返回:
    open3d.geometry.PointCloud: 投影后的点云。
    """
    points = np.asarray(pcd.points)
    # 计算点到球心的向量并归一化
    norms = np.linalg.norm(points, axis=1, keepdims=True)
    projected_points = (points / norms) * radius

    # 创建新的点云
    projected_pcd = o3d.geometry.PointCloud()
    projected_pcd.points = o3d.utility.Vector3dVector(projected_points)
    return projected_pcd

# 生成随机点云
num_points = 1000
pcd = generate_random_point_cloud(num_points)

# 将点云投影到半径为1的球面上
radius = 1.0
projected_pcd = project_to_sphere(pcd, radius)

# 可视化原始点云和投影后的点云
o3d.visualization.draw_geometries([pcd], window_name="Original Point Cloud", width=800, height=600, left=50, top=50)
o3d.visualization.draw_geometries([projected_pcd], window_name="Projected Point Cloud on Sphere", width=800, height=600, left=850, top=50)

# 保存投影后的点云
# o3d.io.write_point_cloud("projected_sphere.pcd", projected_pcd)

三、实现效果

3.1原始点云

3.2投影后点云

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值