目录
一、概述
二、代码实现
2.1实现原理
2.2完整代码
三、实现效果
3.1原始点云
3.2采样后点云
3.3数据对比
一、概述
最远点采样(Farthest Point Sampling, FPS)是一种有效的下采样方法,用于从大量点云数据中选择具有代表性的子集。它主要用于减少计算复杂度,同时保留几何特征。Open3D 提供了 farthest_point_down_sample 函数,它能够根据最远点采样选择点云的子集。
FPS能够比较好地保证采样后的点具有较好的覆盖率,因而在点云分割领域被广泛地使用在PointNet++、PointCNN、PointConv,、PointWeb中。然而,FPS的计算复杂度是计算量与输入点云的点数呈平方相关。这表明从FPS可能不适合用来处理大规模点云。举例来说,当输入一个具有百万量级点的大场景点云时,使用FPS将其降采样到原始规模的10%需要多达200秒。
二、代码实现
2.1实现原理
最远点采样的核心思想是迭代地选择距离当前已选择点集最远的点,从而保证采样点均匀覆盖整个点云。其步骤如下:
- 初始点选择:随机选择一个点作为第一个采样点。
- 距离计算:计算所有点到已选择采样点集合中最近点的距离。
- 选择最远点:选择距离最远的点作为下一个采样点。
- 重复步骤 2 和 3,直到选取到所需数量的采样点。
2.2完整代码
import open3d as o3d
import numpy as np
# 加载点云数据
pcd = o3d.io.read_point_cloud("path_to_your_point_cloud.ply")
# 打印原始点云信息
print(f"原始点云的点数: {len(pcd.points)}")
# 设置要采样的点的数量
num_samples = 2048 # 你可以根据需求调整
# 使用最远点采样
fps_downsampled_pcd = pcd.farthest_point_down_sample(num_samples)
# 打印下采样后的点云信息
print(f"下采样后的点数: {len(fps_downsampled_pcd.points)}")
# 保存下采样后的点云
o3d.io.write_point_cloud("fps_sampled_point_cloud.ply", fps_downsampled_pcd)
# 可视化原始点云和采样后的点云
o3d.visualization.draw_geometries([pcd], window_name='Original Point Cloud')
o3d.visualization.draw_geometries([fps_downsampled_pcd], window_name='FPS Sampled Point Cloud')
三、实现效果
3.1原始点云
3.2采样后点云
3.3数据对比
原始点云的点数: 367932
下采样后的点数: 2048