点云旋转平移(三)—python open3d点云旋转

 点云旋转平移介绍,请参考上一节:点云旋转平移(一)—基础知识介绍_Coding的叶子的博客-CSDN博客。

本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下载。

1 python open3d点云旋转函数

open3d中点云的平移函数为rotate。其函数原型如下所示:

pcd.rotate(R, center=(20, 0, 0))

        第二个参数是旋转中心,即围绕哪个点进行旋转。如果不指定center的值,默认为点云质心。围绕质心旋转后的点云质心保持不变,可以通过下面的get_center()来定义。

pcd.get_center()

        第一个参数R是旋转矩阵。open3d中点云的旋转仍然是通过矩阵运算来完成的,因而需要先获取旋转矩阵。旋转矩阵可以自己进行定义,也可以根据前面博客介绍的欧拉角、旋转向量和四元数计算得到,请参考点云旋转平移(一)—基础知识介绍_Coding的叶子的博客-CSDN博客。open3d提供了这种计算的函数。

1.1 根据欧拉角计算旋转矩阵

        根据欧拉角计算旋转矩阵的函数为pcd.get_rotation_matrix_from_xyz(α, β, γ)。如前面介绍的,欧拉角旋转与旋转轴的先后顺序有关。除xyz之外还有xzy、yxz、yzx、zxy和zyx等。

R = pcd.get_rotation_matrix_from_xyz((0, np.pi/2, 0))#绕y轴旋转90°

1.2 根据旋转向量(轴角)计算旋转矩阵

        旋转向量用3行1列的列向量(x, y, z).T来表示。那么旋转轴为向量方向,旋转角度为向量模长。根据旋转向量计算旋转矩阵的函数为get_rotation_matrix_from_quaternion(n)。

R = pcd.get_rotation_matrix_from_axis_angle(np.array([0, -np.pi/2, 0]).T)#向量方向为旋转轴,模长等于旋转角度,绕y轴旋转-90°

1.3 根据四元数计算旋转矩阵

        根据四元数计算旋转矩阵的函数为get_rotation_matrix_from_quaternion(n)。四元数用4行1列的列向量(w, x, y, z).T来表示。

R = pcd.get_rotation_matrix_from_quaternion(np.array([0, 0, 0, 1]).T)#绕x轴旋转180°

2 示例程序

        注意事项:使用rotate进行点云旋转后,原始点云数据会发生变化。如果要用到旋转之前的点云,那么需要复制一份原始点云进行旋转变换。

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""
import open3d as o3d
from copy import deepcopy
import numpy as np


if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
    print(pcd)
    print(pcd.get_center())

    pcd1 = deepcopy(pcd)
    #采用欧拉角进行旋转
    R = pcd.get_rotation_matrix_from_xyz((0, np.pi/2, 0))#绕y轴旋转90°
    pcd1.rotate(R, center=(20, 0, 0))#旋转点位于x=20处,若不指定则默认为原始点云质心。
    pcd1.paint_uniform_color([0, 0, 1])#指定显示为蓝色
    print(pcd1.get_center())
    print(R)

    #采用旋转向量(轴角)进行旋转
    pcd2 = deepcopy(pcd)
    R = pcd.get_rotation_matrix_from_axis_angle(np.array([0, -np.pi/2, 0]).T)#向量方向为旋转轴,模长等于旋转角度,绕y轴旋转-90°
    pcd2.paint_uniform_color([0, 1, 0])#指定显示为绿色
    pcd2.rotate(R, center=(20, 0, 0))#旋转点位于x=20处,若不指定则默认为原始点云质心。
    print(pcd2.get_center())
    print(R)
   
    #采用四元数进行旋转
    pcd3 = deepcopy(pcd)
    R = pcd.get_rotation_matrix_from_quaternion(np.array([0, 0, 0, 1]).T)#绕x轴旋转180°
    pcd3.paint_uniform_color([1, 0, 0])#指定显示为红色
    pcd3.rotate(R, center=(0, 10, 0))#旋转点位于y=10处,若不指定则默认为原始点云质心。
    print(pcd3.get_center())
    print(R)
    # 点云显示
    o3d.visualization.draw_geometries([pcd, pcd1, pcd2, pcd3], #点云列表
                                      window_name="点云旋转",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600)  # 窗口高度

3 旋转效果

点云旋转平移(一)—基础知识介绍_Coding的叶子的博客-CSDN博客点云旋转平移基础知识,下一节介绍示例程序。https://blog.csdn.net/suiyingy/article/details/124374486点云旋转平移(三)—python open3d点云旋转_第1张图片点云旋转平移(一)—基础知识介绍_Coding的叶子的博客-CSDN博客点云旋转平移基础知识,下一节介绍示例程序。https://blog.csdn.net/suiyingy/article/details/124374486

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716

 更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

你可能感兴趣的:(数据集,三维点云,python,点云旋转,点云,python,open3d)