Open3D 体素化下采样
参考笔记:Open3D: 3D点云的体素下采样技术-CSDN博客
目录
一、算法原理
二、计算过程
三、代码实现
一、算法原理
体素化下采样是一种点云数据下采样方法,通常在点云处理任务的预处理步骤,体素化下采样分为两大步:
① 把点云装进体素网格
② 把每个体素网格中的所有点做平均,只保留一个代表点
二、计算过程
① 依据点云数据坐标集合,求取 、
、
三个坐标值上的最大值
、
、
和最小值
、
、
② 根据 、
、
三个坐标轴上的最大值、最小值求得点云的最小包围盒边长
、
、
,公式如下:
③ 设置体素网格的边长 voxel_size,为了方便,记为 r
④ 计算体素网格的数量:
其中, 指的是
轴方向有多少个体素网格,
、
同理。所以总体素网格数量为:
。
指的是向下取整
⑤ 计算每个体素网格的质心作为该体素网格的代表点,替代其他的所有点,完成下采样
质心算法:已知一个非空体素网格 ,包含
个点,则该体素网格的质心
为:
注:质心说白了就是求平均值。如果点还有其他属性,比如RGB、法线等也是取平均值
三、代码实现
主要函数:
def voxel_down_sample(self, voxel_size):
voxel_size:体素网格的边长
我们用经典的兔子点云做一下对比
import open3d as o3d
import numpy as nppcd = o3d.io.read_point_cloud("rabbit.txt",format="xyz")#读取点云
print("原始点云中点的个数为:", np.asarray(pcd.points).shape[0])
o3d.visualization.draw_geometries([pcd])#原始点云可视化print("使用边长为0.5的体素对点云进行下采样")
downpcd = pcd.voxel_down_sample(voxel_size=0.5)
print("体素下采样后点的个数为:", np.asarray(downpcd.points).shape[0])#可视化体素下采样后的点云
o3d.visualization.draw_geometries([downpcd], window_name="体素滤波",width=1200, height=800,left=50, top=50,mesh_show_back_face=False)
运行结果
原始点云中点的个数为: 35947
使用边长为0.5的体素对点云进行下采样
体素下采样后点的个数为: 3023