Open3D Transformation 变形

简介: Open3D Transformation 变形

Transformation 变形

Open3D 的几何类型具有许多变换方法。在本教程中,我们将展示如何使用translate 、rotate 、scale 和 transform。

Translate

我们要查看的第一个转换方法是translatet 。平移方法采用单个 3D 矢量作为输入,并通过此矢量平移几何的所有点/顶点。vt=v+t。下面的代码显示了网格在 x方向 中转换一次,在 y 方向上转换一次。

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])

get_center方法返回TriangleMesh顶点的平均值。这意味着对于在原点创建的坐标系[0,0,0],get_center将返回[0.05167549 0.05167549 0.05167549]

该方法采用缺省设置为True的第二个参数relative。如果设置为False ,几何的中心将直接平移到第一个参数中指定的位置。

Rotation 旋转

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

从欧拉角转换为 get_rotation_matrix_from_xyz(其中xyz也可以是yzx ,zxy 、xzy ,zyx 和yxz)

从轴角表示转换为get_rotation_matrix_from_axis_angle

从四元数转换为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具有第二个参数center,默认情况下设置为True 。这表示对象在应用旋转之前首先居中,然后移回其先前的中心。如果将此参数设置为False,则将直接应用旋转,使得整个几何围绕坐标中心旋转。这意味着在旋转后可以更改网格中心。

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])

Scale 缩放

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

mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
mesh_s = copy.deepcopy(mesh).translate((2, 0, 0))
mesh_s.scale(0.5, center=mesh_s.get_center())
o3d.visualization.draw_geometries([mesh, mesh_s])

scale方法还具有默认设置为True的第二个参数。center。如果将其设置为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])

General transformation 一般变换

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

为什么是4x4的矩阵(而不是3x3)?可以参考https://xiaozhuanlan.com/topic/9285364071,仿射变换等解释。

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系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
14545 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
机器学习/深度学习 存储 编解码
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
10916 1
Open3d系列 | 3. Open3d实现点云上采样、点云聚类、点云分割以及点云重建
|
算法 数据可视化
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
2227 0
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
|
人工智能 算法 自动驾驶
使用OpenCV实现Halcon算法(2)形状匹配开源项目,shape_based_matching
使用OpenCV实现Halcon算法(2)形状匹配开源项目,shape_based_matching
3978 0
使用OpenCV实现Halcon算法(2)形状匹配开源项目,shape_based_matching
|
4月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
58 0
|
6月前
|
传感器 编解码 算法
Open3D Surface reconstruction 表面重建
Open3D Surface reconstruction 表面重建
207 4
|
7月前
Halcon基础系列之矩阵相关算子
Halcon基础系列之矩阵相关算子
105 0
|
C++ Python
C++ VS Open3D点云显示颜色渲染滤波
C++ VS Open3D点云显示颜色渲染滤波
161 0
|
机器学习/深度学习 存储 并行计算
【Pytorch】Tensor的分块、变形、排序、极值与in-place操作
【Pytorch】Tensor的分块、变形、排序、极值与in-place操作
592 0
|
安全 容器
Matrix Transformation(模拟)
题目描述 You have an integer matrix A, with R rows and C columns. That means it has R rows with each row containing C integers. Two integers are adjacent if their container cells share an edge.
112 0
Matrix Transformation(模拟)