8.Open3D教程——变换

Open3D的几何类型有许多转换方法。在本教程中,我们将演示如何使用平移、旋转、缩放和变换。

1. 平移

我们要看的第一种转换方法是平移。平移方法将单个3D向量t作为输入,并通过该向量(vt=v+t)来转换几何体的所有点/顶点。下面的代码显示了如何在x方向和y方向上转换网格一次。

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut
import copy

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_tx = copy.deepcopy(mesh).translate((1.3, 0, 0))
mesh_ty = copy.deepcopy(mesh).translate((0, 1.3, 0))
print(f'Center of mesh: {mesh.get_center()}')
print(f'Center of mesh tx: {mesh_tx.get_center()}')
print(f'Center of mesh ty: {mesh_ty.get_center()}')
o3d.visualization.draw_geometries([mesh, mesh_tx, mesh_ty])

该方法采用默认设置为True的第二个相对参数。如果设置为False,几何图形的中心将直接转换到第一个参数中指定的位置。

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut
import copy

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_mv = copy.deepcopy(mesh).translate((2, 2, 2), relative=False)
print(f'Center of mesh: {mesh.get_center()}')
print(f'Center of translated mesh: {mesh_mv.get_center()}')
o3d.visualization.draw_geometries([mesh, mesh_mv])
2. 旋转

Open3D的几何类型也可以使用旋转方法进行旋转。它将旋转矩阵R作为第一个参数。由于3D中的旋转可以通过多种方式参数化,Open3D提供了方便的函数,可以将不同的参数化转换为旋转矩阵:

  • Euler angles 转换,用方法get_rotation_matrix_from_xyz (xyz 也可以是 yzx, zxy, xzy, zyx, 和yxz的形式)

  • Axis-angle representation 转换,使用 get_rotation_matrix_from_axis_angle

  • Quaternions 转换,使用 get_rotation_matrix_from_quaternion

在下面的代码中我们使用欧拉角。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_r = copy.deepcopy(mesh)
R = mesh.get_rotation_matrix_from_xyz((np.pi / 2, 0, np.pi / 4))
mesh_r.rotate(R, center=(0, 0, 0))
o3d.visualization.draw_geometries([mesh, mesh_r])

函数rotate的第二个参数中心默认设置为True。这表示对象在应用旋转之前首先居中,然后移回其上一个中心。如果此参数设置为False,则将直接应用旋转,从而使整个几何体围绕坐标中心旋转。这意味着旋转后可以更改网格中心。

import open3d as o3d
import numpy as np
import open3d_tutorial as o3dtut
import copy

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_r = copy.deepcopy(mesh).translate((2, 0, 0))
mesh_r.rotate(mesh.get_rotation_matrix_from_xyz((np.pi / 2, 0, np.pi / 4)),
              center=(0, 0, 0))
o3d.visualization.draw_geometries([mesh, mesh_r])
3. 缩放

Open3D几何体类型的顶点和点也可以使用scale,vs=s⋅v进行缩放。

scale方法还有一个默认设置为True的第二个参数中心。如果设置为False,则对象在缩放之前不会居中,因此对象的中心可以由于缩放操作而移动。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_s = copy.deepcopy(mesh).translate((2, 1, 0))
mesh_s.scale(0.5, center=(0, 0, 0))
o3d.visualization.draw_geometries([mesh, mesh_s])
4. 一般变换

通用变换open3d还支持使用transform方法由4×4齐次变换矩阵定义的通用变换。

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
T = np.eye(4)
T[:3, :3] = mesh.get_rotation_matrix_from_xyz((0, np.pi / 3, np.pi / 2))
T[0, 3] = 1
T[1, 3] = 1.3
print(T)
mesh_t = copy.deepcopy(mesh).transform(T)
o3d.visualization.draw_geometries([mesh, mesh_t])
open3d是一个用于处理三维数据(点云、三维模型等)的开源库。点云配准是将两个或多个点云数据进行对齐的过程,以便在一个全局坐标系下进行比较、分析或重建。其,四元数法是一种常用的点云配准方法。 四元数是一种用四个实数表示的扩充复数,可以用于描述旋转变换。在点云配准,使用四元数法是因为其具有以下优势: 第一,四元数具有紧凑的表示形式,只需要四个实数即可表示旋转变换,相较于旋转矩阵的九个实数表示方式节省了存储空间,降低了计算复杂度。 第二,四元数法能够有效地避免了“万向锁”问题。万向锁是指在使用欧拉角进行坐标变换时,由于旋转过程会出现奇点,导致旋转角度无法精确表示的问题。而四元数法不会出现这个问题,具有更好的数值稳定性。 在open3d,点云配准的四元数法通常有以下几个步骤: 首先,计算两个点云之间的特征描述子,例如FPFH(Fast Point Feature Histograms)或SHOT(Signature of Histograms of Orientations)。这些描述子能够表示点云的局部几何信息。 然后,根据特征描述子的相似性,寻找初始的点对应关系。 接下来,通过最小化点云之间的误差指标,例如最小化点到平面的距离或最小化点到点的距离,来优化点对应关系,并计算出旋转矩阵。 将旋转矩阵转换为四元数表示,即可完成点云的配准过程。 四元数法是open3d常用的点云配准方法之一,其能够高效地实现点云的准确对齐。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值