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)
o3d.io.write_point_cloud(point_cloud, file_path)
|
读取点云对象中点的坐标
np.asarray(point_cloud.points)
|
将点坐标赋值到点云对象
point_cloud.points = o3d.utility.Vector3dVector(points)
|
创建点云对象
创建一个空的点云对象
pc = o3d.geometry.PointCloud()
|
合并点云对象
点云平移
point_cloud.translate(translation)
|
点云旋转
point_cloud.rotate(rotation_matrix, center = (0,0,0))
|
这里需要注意第二个参数center是指定旋转中心,如果不传,默认旋转中心是点云的质心。
而一般来说,旋转中心为原点
点云上色
point_cloud.paint_uniform_color([0, 0, 1.0])
|
点云展示
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()
|
这里需要注意
- 需要接收返回值
- 下采样是指只保留某一大小立方体内的一个点。voxel_down_sample方法有个默认值参数,为0.05。这个参数就表示立方体的大小,因此这个数越大,下采样的强度越强,保留的点就越少。
统计滤波
point_cloud.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
|
该方法可以去掉距离点云密集处很远的点。该方法有两个参数
- nb_neighbors允许指定要考虑多少个邻居,以便计算给定点的平均距离。
- std_ratio允许基于跨点云的平均距离的标准偏差来设置阈值级别。此数字越低,过滤器将越具有攻击性。
筛选点云中的点
point_cloud = point_cloud.select_by_index(indices_to_keep)
|