目录
一、背景
二、代码实现
2.1 关键函数
2.2完整代码
三、实现效果
3.1原始点云
3.2下采样后点云
3.3数据对比
一、背景
在Open3D中,如果你想将点云随机采样到固定的点数,可以使用random_down_sample 函数并计算相应的采样比例。以下是如何实现这一功能的示例代码。
二、代码实现
2.1 关键函数
定义一个函数 random_sample_to_fixed_number,接受一个点云对象 pcd 和目标点数 target_num_points 作为参数。该函数首先检查原始点云是否已经小于或等于目标点数,如果是,则直接返回原始点云。否则,计算采样比例并进行随机采样。如果采样后的点数仍然超过目标点数,则通过减小采样比例来调整采样结果
def random_sample_to_fixed_number(pcd, target_num_points):
original_num_points = np.asarray(pcd.points).shape[0]
if original_num_points <= target_num_points:
return pcd
sampling_ratio = target_num_points / original_num_points
sampled_pcd = pcd.random_down_sample(sampling_ratio)
while len(sampled_pcd.points) > target_num_points:
sampling_ratio -= 0.01
sampled_pcd = pcd.random_down_sample(sampling_ratio)
return sampled_pcd
2.2完整代码
import open3d as o3d
import numpy as np
def random_sample_to_fixed_number(pcd, target_num_points):
# 获取原始点云的点数
original_num_points = np.asarray(pcd.points).shape[0]
# 如果原始点数小于或等于目标点数,则无需采样
if original_num_points <= target_num_points:
return pcd
# 计算采样比例
sampling_ratio = target_num_points / original_num_points
# 随机采样点云
sampled_pcd = pcd.random_down_sample(sampling_ratio)
# 检查采样后的点数并调整
while len(sampled_pcd.points) > target_num_points:
sampling_ratio -= 0.01 # 减小采样比例
sampled_pcd = pcd.random_down_sample(sampling_ratio)
return sampled_pcd
# 读取点云
pcd = o3d.io.read_point_cloud(r"E:\work\Open3D\open3d20231128\Blog_Cloud\standford_cloud_data\China dragon.pcd")
o3d.visualization.draw_geometries([pcd], window_name="原始点云")
# 打印原始点云信息
print("原始点云数量:", len(pcd.points))
# 设定目标点数
target_num_points = 10000
# 进行随机采样
sampled_pcd = random_sample_to_fixed_number(pcd, target_num_points)
# 打印采样后的点云信息
print("采样后的点云数量:", len(sampled_pcd.points))
# 可视化采样后的点云
o3d.visualization.draw_geometries([sampled_pcd], window_name="采样后的点云")
三、实现效果
3.1原始点云
3.2下采样后点云
3.3数据对比
原始点云数量: 437645
采样后的点云数量: 10000