open3d 点云变换Transformation

point_cloud_transformation.py

1. 平移

import open3d as o3d
import numpy as np
import copy


def translate():
    """平移"""

    # 1. read pcd
    armadillo_data = o3d.data.ArmadilloMesh()
    pcd = o3d.io.read_triangle_mesh(armadillo_data.path).sample_points_poisson_disk(5000)
    # 2. translate
    pcd_tx = copy.deepcopy(pcd).translate((150, 0, 0))  # xyz
    pcd_ty = copy.deepcopy(pcd).translate((0, 200, 0))
    # 3. view
    print('Displaying original and translated geometries ...')
    o3d.visualization.draw([{
        "name": "Original Geometry",
        "geometry": pcd
    }, {
        "name": "Translated (in X) Geometry",
        "geometry": pcd_tx
    }, {
        "name": "Translated (in Y) Geometry",
        "geometry": pcd_ty
    }],
                           show_ui=True)

2. 旋转

def rotate():
    """旋转xyz轴"""

    # 1. read pcd
    armadillo_data = o3d.data.ArmadilloMesh()
    pcd = o3d.io.read_triangle_mesh(
        armadillo_data.path).sample_points_poisson_disk(5000)
    pcd_r = copy.deepcopy(pcd).translate((200, 0, 0))  # 沿着x平移
    # 2. rotate
    R = pcd.get_rotation_matrix_from_xyz((np.pi / 2, 0, np.pi / 4))  # 绕着x旋转90,再绕着z旋转45
    pcd_r.rotate(R)  # R: 3x3
    # 3. view
    print('Displaying original and rotated geometries ...')
    o3d.visualization.draw([{
        "name": "Original Geometry",
        "geometry": pcd
    }, {
        "name": "Rotated Geometry",
        "geometry": pcd_r
    }],
                           show_ui=True)

 

 3. 缩放

def scale():
    """缩放"""

    # 1. read pcd
    armadillo_data = o3d.data.ArmadilloMesh()
    pcd = o3d.io.read_triangle_mesh(armadillo_data.path).sample_points_poisson_disk(5000)
    pcd_s = copy.deepcopy(pcd).translate((200, 0, 0))  # 沿着x平移

    # 2. scale: 点个数不变,改变的是点之间的距离
    pcd_s.scale(scale=0.5, center=pcd_s.get_center())  # pcd2.scale(2.0, (40, 0, 0))#点云放大两倍,质心平移至(-40, 0, 0)
    # # numpy 方式实现 scale
    # points = np.array(pcd_s.points)
    # points = points / 2.0  # 缩小到原来的一半
    # points[:, 0] = points[:, 0] + 40  # 质心平移到x=40处

    # 3. view
    print('Displaying original and scaled geometries ...')
    o3d.visualization.draw([{
        "name": "Original Geometry",
        "geometry": pcd
    }, {
        "name": "Scaled Geometry",
        "geometry": pcd_s
    }],
                           show_ui=True)

 

 4. 变换

旋转+平移

def transform():
    """transform: 平移 + 旋转"""

    # 1. read pcd
    armadillo_data = o3d.data.ArmadilloMesh()
    pcd = o3d.io.read_triangle_mesh(
        armadillo_data.path).sample_points_poisson_disk(5000)
    # 2.
    T = np.eye(4)  # T: 4x4
    T[:3, :3] = pcd.get_rotation_matrix_from_xyz((0, np.pi / 3, np.pi / 2))  # 先绕着y旋转60,绕着z旋转90
    T[0, 3] = 150  # 再沿着x轴平移150
    T[1, 3] = 200  # 再沿着y轴平移200
    print(T)
    pcd_t = copy.deepcopy(pcd).transform(T)

    # 3. view
    print('Displaying original and transformed geometries ...')
    o3d.visualization.draw([{
        "name": "Original Geometry",
        "geometry": pcd
    }, {
        "name": "Transformed Geometry",
        "geometry": pcd_t
    }],
                           show_ui=True)

T4x4变换矩阵:前面3x3控制旋转,最后一列控制平移。 

[[ 3.06161700e-17 -5.00000000e-01  8.66025404e-01  1.50000000e+02]
 [ 1.00000000e+00  6.12323400e-17  0.00000000e+00  2.00000000e+02]
 [-5.30287619e-17  8.66025404e-01  5.00000000e-01  0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Open3D是一个强大的开源库,用于处理和可视化3D数据。在Open3D中,点配准是一项重要的任务,可以将多个点数据对齐,以便进行后续的处理和分析。 要进行点配准,您可以使用Open3D的配准模块,它提供了多种配准算法和工具。配准的目标是找到最佳的变换,将两个或多个点对齐,使它们在空间中尽可能重合。 在Open3D中,可以使用ICP(最近点迭代法)算法进行点配准。ICP算法通过迭代的方式,将目标点的每个点与参考点中最近的点进行匹配,并计算出最佳的刚性变换参数,以最小化点之间的距离。 以下是使用Open3D进行点配准的基本步骤: 1. 读取点数据:可以使用Open3D的函数来读取点数据,可以是PCD、PLY、TXT或BIN格式的文件。 2. 进行配准:使用Open3D的ICP算法或其他配准算法来对点进行配准。您可以选择不同的参数和策略来获得最佳的配准结果。 3. 可视化结果:使用Open3D的可视化工具,可以将配准后的点数据进行可视化,以便进行进一步的分析和处理。 下面是一个示例代码,展示了如何使用Open3D进行点配准: ```python import open3d as o3d # 读取目标点和参考点 target_pcd = o3d.io.read_point_cloud("target.pcd") source_pcd = o3d.io.read_point_cloud("source.pcd") # 进行点配准 transformation = o3d.registration.registration_icp( target_pcd, source_pcd, max_correspondence_distance, estimation_method=o3d.registration.TransformationEstimationPointToPoint()) # 将参考点根据配准结果进行变换 transformed_source_pcd = source_pcd.transform(transformation.transformation) # 可视化配准结果 o3d.visualization.draw_geometries([target_pcd, transformed_source_pcd]) ``` 请注意,上述代码仅提供了一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和优化。 综上所述,Open3D可以通过使用ICP算法来实现点配准,并提供了方便的函数和工具来读取、处理和可视化点数据。123 #### 引用[.reference_title] - *1* *2* *3* [Open3d系列 | 1. Open3d实现点数据读写、点配准、点法向量计算](https://blog.csdn.net/weixin_44751294/article/details/127631360)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值