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提供了不同的参数化方法,从而得到旋转矩阵:

# -*-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)

Open3d里面的顶点和点可以应用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之坐标变换相关推荐

  1. open3d连续读取pcd文件及实现点云视角转换

    目录 1.保存视角参数 2.加载pcd文件及视角转换 1.保存视角参数 save_view_point和load_view_point函数用于将所需视角下的参数写入到json文件. import op ...

  2. Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算

    如有错误,恳请指出. 从这一篇博客开始,开始利用Open3d来处理点云数据.之后将围绕点云数据的多种处理方式来记录笔记.本篇博客的内容包括点云的文件格式介绍,点云数据的读取,以及点云的配准与点云的法向 ...

  3. Open3d系列 | 2. Open3d实现点云数据增强

    如有错误,恳请指出. 在计算机视觉领域中,基于图像已经提出了一系列的数据增强方法.常见图像数据增强方式有平移.缩放.旋转等仿射变换,还有对比度变换等等.那么,对于点云来说,同样可以进行平移缩放与旋转. ...

  4. Open3D o3dtut怎么导入才不报错

    Open3D o3dtut 怎么导入才不报错 问题 解决 1. 导入o3dtut 2. 添加open3d_tutorial.py类 3. 构建目录结构 4. 运行成功 写这篇博客源于博友的提问,最初我 ...

  5. Open3D点云处理算法最全合集

    Open3D点云处理算法最全合集,致力于搜集可运行,可视化较好的Open3D算法,持续更新中- 1. Open3D 点云读取及可视化.离群点去除 2. Open3D 点云体素格下采样 3. Open3 ...

  6. Open3D KdTree建立、3种近邻搜索及结果可视化

    1. 点云索引 Open3D KdTree,可以快速的在无序的点云中建立空间拓扑结构,使得能迅速的进行近邻搜索: 2. 近邻方法分类: Open3D这边支持的近邻搜索方法由VTK实现: K近邻搜索(K ...

  7. Open3D DbScanClustering聚类算法

    DBSCAN聚类算法,是基于密度的聚类算法.该算法需要两个参数. labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print ...

  8. Open3D 三维点云读取可视化、下采样、去除离群点、地面提取

    Open3D:3D数据处理的现代库,是一个开放源代码库,支持快速开发处理3D数据的软件.Open3D在C ++和Python中公开了一组精心选择的数据结构和算法.后端经过高度优化,并支持并行化. 推荐 ...

  9. Open3d学习计划—高级篇 8(网格变形)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

最新文章

  1. Alpha 冲刺报告(8/10)
  2. golang 请求带验证信息的坑
  3. C++(4)--初识变量、数据类型
  4. php中不让数组初始化,javascript中数组与php数组初始化差异
  5. UVA - 1605 Building for UN (联合国大楼)
  6. 考虑空气阻力的抛射体的matlab,考虑空气阻力的抛射体运动mtlab仿真
  7. HDU6273 Master of GCD【差分数组】
  8. 使用Kotlin的Android SeekBar
  9. android usb 开钱箱_USB打印机开钱箱
  10. 安装算量软件使用_鹏业安装算量软件常用按钮汇总(三)
  11. C#调用百度大脑API初探2
  12. 编码器输出:HTL、TTL
  13. 文献阅读_Radiogenomic analysis of vascular endothelial growth factor in patients with diffuse gliomas
  14. 专业学习经验交流会成功举行
  15. 服务器接上显示器后没信号,为什么显示器无信号电脑显示器无信号的解决办法...
  16. 使用Python查看sqlite3表结构
  17. Linux 安装httpd(apache)超详细教程
  18. 一名渗透工程师所必备的技能(一)
  19. 宏定义问题记录day2
  20. JavaScript 基础学习(三)

热门文章

  1. Win7系统C盘空间不足
  2. web.config的问题
  3. Smartmontools检测硬盘坏道
  4. 关于【结合测试票】写法的总结。
  5. Linux 的 ps 命令 查看系统进程
  6. JSON使用时,注意0件和空。
  7. 【PL/SQL】触发器示例:记录加薪
  8. 微服务架构的分布式事务解决方案
  9. session跨域共享解决方案
  10. iOS开发过程中常见错误问题及解决方案