You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中为ICP算法均匀选取点云随机初始点

点云均匀采样实现方案(用于ICP初始点选取)

网格划分是实现点云均匀采样的高效且可靠的方法,完全适配你的ICP需求,下面是具体的实现思路和Python代码:

核心步骤

  • 计算点云的空间边界:遍历点云,获取x、y、z三个轴的最小/最大值,确定点云的包围盒。
  • 设定网格分辨率:根据你需要采样的目标点数,计算合适的网格大小。比如要采样M个点,就把包围盒分成约M个单元格(可根据点云密度微调)。
  • 点云分配到网格:给每个点计算所属的网格索引,把同网格的点归为一组。
  • 网格内随机采样:对每个非空的网格,随机挑选一个点作为该网格的代表点,最终得到的采样点就会均匀分布在整个点云空间。

Python代码实现

假设你的点云是一个形状为(N, 3)的numpy数组(N是总点数,每一行是x,y,z坐标):

import numpy as np

def uniform_sample_point_cloud(points, num_samples):
    # 1. 计算点云边界
    min_coords = np.min(points, axis=0)
    max_coords = np.max(points, axis=0)
    ranges = max_coords - min_coords

    # 2. 计算网格大小:假设网格是立方体,根据采样数估算边长
    grid_counts = np.ceil(np.power(num_samples, 1/3)).astype(int)
    grid_size = ranges / grid_counts

    # 3. 计算每个点的网格索引
    grid_indices = ((points - min_coords) / grid_size).astype(int)
    # 处理边界点,避免索引超出范围
    grid_indices = np.clip(grid_indices, 0, grid_counts - 1)

    # 4. 将三维索引转为一维唯一标识,方便分组
    grid_ids = grid_indices[:,0] * grid_counts[1] * grid_counts[2] + \
               grid_indices[:,1] * grid_counts[2] + \
               grid_indices[:,2]
    
    # 每个网格随机选一个点
    sampled_points = []
    for grid_id in np.unique(grid_ids):
        mask = grid_ids == grid_id
        grid_points = points[mask]
        random_idx = np.random.choice(grid_points.shape[0])
        sampled_points.append(grid_points[random_idx])
    
    # 调整到目标采样数
    sampled_points = np.array(sampled_points)
    if len(sampled_points) > num_samples:
        sampled_points = sampled_points[np.random.choice(len(sampled_points), num_samples, replace=False)]
    return sampled_points

补充说明

  • 网格分辨率可灵活调整:若采样点分布不够均匀,调小网格大小(增加网格数量);若想减少计算量,调大网格大小即可。
  • 快速开发替代方案:如果使用Open3D库,可直接调用voxel_down_sample函数,本质也是基于体素的均匀采样,代码更简洁:
import open3d as o3d

def o3d_uniform_sample(points, voxel_size):
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(points)
    downsampled_pcd = pcd.voxel_down_sample(voxel_size=voxel_size)
    return np.asarray(downsampled_pcd.points)

内容的提问来源于stack exchange,提问作者ABh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:40:26