Open3d之坐标变换
Open3d的几何类型有许多种坐标变换的方法。在本节教程中我们将会展示如何使用旋转(rotate),平移(translate),缩放(scale)和变换(transform)。
平移(translate)
这里我们展示的第一个算法是平移。平移是将单个3D矢量作为输入,并通过该矢量平移几何图形的所有点/顶点,。下面的代码展示了网格分别在x方向和y方向平移一次的结果。
# -*-coding:utf-8 -*-
import open3d as o3d
import copy# 在原点创建坐标框架网格
mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
# 往x方向平移1.3米
mesh_tx = copy.deepcopy(mesh).translate((1.3, 0, 0))
# 往y方向平移1.3米
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])
Center of mesh: [0.05167549 0.05167549 0.05167549]
Center of mesh tx: [1.35167549 0.05167549 0.05167549]
Center of mesh ty: [0.05167549 1.35167549 0.05167549]
Note:
get_center算法返回的是三角网格顶点的平均值。这就会导致原点在[0,0,0]处的坐标系,使用get_center返回的是[0.05167549 0.05167549 0.05167549]。
这个算法有第二个参数relative,默认为true。如果我们将其设为false,中心点就会被转换到第一个参数指定的位置。
# -*-coding:utf-8 -*-
import open3d as o3d
import copy# 在原点创建坐标框架网格
mesh = o3d.geometry.TriangleMesh.create_coordinate_frame()
# 往xyz方向平移2米
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])
Center of mesh: [0.05167549 0.05167549 0.05167549]
Center of translated mesh: [2. 2. 2.]
旋转(Rotation)
Open3d的几何体通过rotate来实现旋转。
它的第一个参数是一个旋转矩阵R。由于3D中的旋转可以用多种方式进行参数化,Open3D提供了不同的参数化方法,从而得到旋转矩阵:
- 使用get_rotation_matrix_from_xyz从欧拉角(Euler angles)转换为矩阵(这里xyz也可以是yzx,zxy,xzy,zyx和yxz)。
- 使用get_rotation_matrix_from_axis_angle从轴角(Axis-angle representation)转换
- 使用get_rotation_matrix_from_quaternion从四元数进行转换
下面的代码展示了从欧拉角进行转换。
# -*-coding:utf-8 -*-
import numpy as np
import open3d as o3d
import copy# 在原点创建坐标框架网格
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,则几何图像将直接围绕坐标中心旋转。这意味着网格中心可以在旋转之后改变。
# -*-coding:utf-8 -*-
import numpy as np
import open3d as o3d
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])
缩放(Scale)
# -*-coding:utf-8 -*-
import numpy as np
import open3d as o3d
import copy# 在原点创建坐标框架网格
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算法默认第二个参数center也是True。如果设置为False,对象在缩放前没有居中,这样就可以移动对象的中心。
# -*-coding:utf-8 -*-
import numpy as np
import open3d as o3d
import copy# 在原点创建坐标框架网格
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还支持通过通用的4 × 4的矩阵进行变换。接口为transform。
# -*-coding:utf-8 -*-
import numpy as np
import open3d as o3d
import copy# 在原点创建坐标框架网格
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])
[[ 3.06161700e-17 -5.00000000e-01 8.66025404e-01 1.00000000e+00]
[ 1.00000000e+00 6.12323400e-17 0.00000000e+00 1.30000000e+00]
[-5.30287619e-17 8.66025404e-01 5.00000000e-01 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
Open3d之坐标变换相关推荐
- open3d连续读取pcd文件及实现点云视角转换
目录 1.保存视角参数 2.加载pcd文件及视角转换 1.保存视角参数 save_view_point和load_view_point函数用于将所需视角下的参数写入到json文件. import op ...
- Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
如有错误,恳请指出. 从这一篇博客开始,开始利用Open3d来处理点云数据.之后将围绕点云数据的多种处理方式来记录笔记.本篇博客的内容包括点云的文件格式介绍,点云数据的读取,以及点云的配准与点云的法向 ...
- Open3d系列 | 2. Open3d实现点云数据增强
如有错误,恳请指出. 在计算机视觉领域中,基于图像已经提出了一系列的数据增强方法.常见图像数据增强方式有平移.缩放.旋转等仿射变换,还有对比度变换等等.那么,对于点云来说,同样可以进行平移缩放与旋转. ...
- Open3D o3dtut怎么导入才不报错
Open3D o3dtut 怎么导入才不报错 问题 解决 1. 导入o3dtut 2. 添加open3d_tutorial.py类 3. 构建目录结构 4. 运行成功 写这篇博客源于博友的提问,最初我 ...
- Open3D点云处理算法最全合集
Open3D点云处理算法最全合集,致力于搜集可运行,可视化较好的Open3D算法,持续更新中- 1. Open3D 点云读取及可视化.离群点去除 2. Open3D 点云体素格下采样 3. Open3 ...
- Open3D KdTree建立、3种近邻搜索及结果可视化
1. 点云索引 Open3D KdTree,可以快速的在无序的点云中建立空间拓扑结构,使得能迅速的进行近邻搜索: 2. 近邻方法分类: Open3D这边支持的近邻搜索方法由VTK实现: K近邻搜索(K ...
- Open3D DbScanClustering聚类算法
DBSCAN聚类算法,是基于密度的聚类算法.该算法需要两个参数. labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print ...
- Open3D 三维点云读取可视化、下采样、去除离群点、地面提取
Open3D:3D数据处理的现代库,是一个开放源代码库,支持快速开发处理3D数据的软件.Open3D在C ++和Python中公开了一组精心选择的数据结构和算法.后端经过高度优化,并支持并行化. 推荐 ...
- Open3d学习计划—高级篇 8(网格变形)
Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...
最新文章
- Alpha 冲刺报告(8/10)
- golang 请求带验证信息的坑
- C++(4)--初识变量、数据类型
- php中不让数组初始化,javascript中数组与php数组初始化差异
- UVA - 1605 Building for UN (联合国大楼)
- 考虑空气阻力的抛射体的matlab,考虑空气阻力的抛射体运动mtlab仿真
- HDU6273 Master of GCD【差分数组】
- 使用Kotlin的Android SeekBar
- android usb 开钱箱_USB打印机开钱箱
- 安装算量软件使用_鹏业安装算量软件常用按钮汇总(三)
- C#调用百度大脑API初探2
- 编码器输出:HTL、TTL
- 文献阅读_Radiogenomic analysis of vascular endothelial growth factor in patients with diffuse gliomas
- 专业学习经验交流会成功举行
- 服务器接上显示器后没信号,为什么显示器无信号电脑显示器无信号的解决办法...
- 使用Python查看sqlite3表结构
- Linux 安装httpd(apache)超详细教程
- 一名渗透工程师所必备的技能(一)
- 宏定义问题记录day2
- JavaScript 基础学习(三)