如何查看Open3D中每个体素网格包含的原始点云点并输出
获取体素网格对应的原始点云点并打印
Open3D的VoxelGrid对象不会自动存储每个体素关联的原始点云数据,需要手动计算每个点所属的体素索引,建立映射关系后才能获取并打印对应点。
实现步骤与代码
- 将原始点云转换为numpy数组,方便批量处理
- 遍历每个点,通过
get_voxel()方法获取其所属体素的索引 - 用字典建立体素索引到对应点列表的映射
- 遍历字典打印每个体素包含的点
import open3d as o3d import numpy as np # 假设你已完成以下初始化 # pcd = o3d.io.read_point_cloud("your_cloud.pcd") # voxel_size = 0.1 # voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size) # 提取原始点云的numpy数组 points = np.asarray(pcd.points) # 初始化体素-点映射字典 voxel_point_map = {} for point_idx, point in enumerate(points): # 获取当前点的体素索引(整数坐标元组) voxel_idx = tuple(voxel_grid.get_voxel(point)) # 将点添加到对应体素的列表中 if voxel_idx not in voxel_point_map: voxel_point_map[voxel_idx] = [] # 可选:存储点坐标或原始点索引(索引可用于关联颜色、法向量等属性) voxel_point_map[voxel_idx].append(point.tolist()) # 存储坐标 # voxel_point_map[voxel_idx].append(point_idx) # 存储原始点索引 # 打印每个体素的点信息 for voxel_idx, points_in_voxel in voxel_point_map.items(): print(f"体素索引 {voxel_idx} 包含 {len(points_in_voxel)} 个点:") for p in points_in_voxel: print(f" {p}") print("-" * 40)
优化方案(大规模点云)
如果点云数量较多,循环遍历效率较低,可使用numpy向量化操作提升速度:
# 批量计算所有点的体素索引 voxel_indices = np.array([voxel_grid.get_voxel(p) for p in points]) # 获取唯一体素索引及分组标记 unique_voxels, group_ids = np.unique(voxel_indices, axis=0, return_inverse=True) # 遍历每个唯一体素,提取对应点 for voxel in unique_voxels: # 筛选属于当前体素的点 mask = (voxel_indices == voxel).all(axis=1) target_points = points[mask].tolist() print(f"体素索引 {tuple(voxel)} 包含 {len(target_points)} 个点:") print(target_points) print("-" * 40)
内容的提问来源于stack exchange,提问作者hello-jo
相关产品推荐
相关产品推荐

