Python open3d点云相关操作(持续更新)

Prerequisite

!pip install open3d
!pip install scipy
import open3d as o3d
from scipy.spatial.transform import Rotation as R
import numpy as np

读和写点云文件

point_cloud = o3d.io.read_point_cloud(file_path) # 支持的格式pcd、pts等
# type(point_cloud) == open3d.cpu.pybind.geometry.PointCloud

o3d.io.write_point_cloud(point_cloud, file_path)

读取点云对象中点的坐标

np.asarray(point_cloud.points)

将点坐标赋值到点云对象

# points = np.array([[...]])

point_cloud.points = o3d.utility.Vector3dVector(points)

创建点云对象

创建一个空的点云对象

pc = o3d.geometry.PointCloud()

合并点云对象

# 直接+
pc += point_cloud

点云平移

point_cloud.translate(translation)  # 应用平移,translation 是平移向量

点云旋转

point_cloud.rotate(rotation_matrix, center = (0,0,0))  # 应用旋转, rotation_matrix是旋转矩阵

这里需要注意第二个参数center是指定旋转中心,如果不传,默认旋转中心是点云的质心。

而一般来说,旋转中心为原点

点云上色

point_cloud.paint_uniform_color([0, 0, 1.0]) # 传入的三个值分别是rgb

点云展示

o3d.visualization.draw_geometries([point_cloud])

四元数转旋转矩阵

quaternion = np.array([ori_x, ori_y, ori_z, ori_w])  # 定义四元数
rotation_matrix = R.from_quat(quaternion).as_matrix()

注意四元数顺序是xyzw,在有些地方顺序是wxyz

点云下采样

point_cloud = point_cloud.voxel_down_sample()

这里需要注意

  1. 需要接收返回值
  2. 下采样是指只保留某一大小立方体内的一个点。voxel_down_sample方法有个默认值参数,为0.05。这个参数就表示立方体的大小,因此这个数越大,下采样的强度越强,保留的点就越少。

统计滤波

point_cloud.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)

该方法可以去掉距离点云密集处很远的点。该方法有两个参数

  1. nb_neighbors允许指定要考虑多少个邻居,以便计算给定点的平均距离。
  2. std_ratio允许基于跨点云的平均距离的标准偏差来设置阈值级别。此数字越低,过滤器将越具有攻击性。

筛选点云中的点

# indices_to_keep =[0,1,2...] 点的索引
point_cloud = point_cloud.select_by_index(indices_to_keep)
文章作者: Met Guo
文章链接: https://guoyujian.github.io/2023/09/16/Python-open3d%E7%82%B9%E4%BA%91%E7%9B%B8%E5%85%B3%E6%93%8D%E4%BD%9C%EF%BC%88%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%EF%BC%89/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Gmet's Blog