指点成金-最美分享吧

登录

MATLAB点云处理:点云下采样(random | gridAverage | nonuniformGridSample)

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了MATLAB点云处理:点云下采样(random | gridAverage | nonuniformGridSample)相关的知识,希望对你有一定的参考价值。

文章目录

    • 1 下采样函数 pcdownsample
    • 2 代码实现
      • 2.1 随机下采样(random)
      • 2.2 均匀体素下采样(gridAverage)
      • 2.3 非均匀体素下采样(nonuniformGridSample)
      • 2.4 如何选择下采样方式
    • 3 参考链接

1 下采样函数 pcdownsample

点云下采样,也称点云降采样,目的是为了减少数据量,提高点云处理效率。

MATLAB 提供了点云下采样函数 pcdownsample,有三种重载方式

ptCloudOut = pcdownsample(ptCloudIn,"random",percentage)

随机下采样,且不替换原始点。百分比为下采样的比例,取值范围 [ 0,1 ]

ptCloudOut = pcdownsample(ptCloudIn,"gridAverage",gridStep)

体素栅格下采样,将体素中心代替体素内的所有点。gridStep 为体素栅格的步长大小

ptCloudOut = pcdownsample(ptCloudIn,"nonuniformGridSample",maxNumPoints)

使用非均匀长方体栅格过滤器下采样点云。必须将体素内最大点数maxNumPoints 不能低于 6

下面将依次进行说明。

2 代码实现

2.1 随机下采样(random)

随机下采样方法,指定为randomrandom方法比gridAverage下采样方法更有效,尤其是在点云配准之前应用时。

代码:

clc;clear;% 加载点云ptCloud_in = pcread("bunny.pcd");% 下采样percentage = 0.2;ptCloud_random= pcdownsample(ptCloud_in,"random",percentage);% 可视化figure;pcshow(ptCloud_in);title("原始点云");xlabel("X(m)");ylabel("Y(m)");zlabel("Z(m)");hold on;figure;pcshow(ptCloud_random);title("下采样点云");xlabel("X(m)");ylabel("Y(m)");zlabel("Z(m)");hold on;% 保存下采样点云pcwrite(ptCloud_random,"ptCloud_random.pcd","Encoding","binary");%保存为binary形式的PCD点云

结果展示:

2.2 均匀体素下采样(gridAverage)

G均匀体素下采样,指定为gridAverage。将体素重心代替体素内的点。它们的颜色和法向量性质是相应的平均值。这种方法比random下采样方法更好地保留了点云的形状。

代码:

clc;clear;% 加载点云ptCloud_in = pcread("bunny.pcd");% 下采样gridStep = 0.003;ptCloud_grid = pcdownsample(ptCloud_in,"gridAverage",gridStep);% 可视化figure;pcshow(ptCloud_in);title("原始点云");xlabel("X(m)");ylabel("Y(m)");zlabel("Z(m)");hold on;figure;pcshow(ptCloud_grid);title("下采样点云");xlabel("X(m)");ylabel("Y(m)");zlabel("Z(m)");hold on;% 保存下采样点云pcwrite(ptCloud_grid,"ptCloud_grid.pcd","Encoding","binary");%保存为binary形式的PCD点云

结果展示:

2.3 非均匀体素下采样(nonuniformGridSample)

非均匀体素下采样,指定为nonuniformGridSample随机保留体素内的一点,而不是用体素重心代替。 且法线将在降采样之前在原始数据上计算,能够保留更精确的法线。

使用“pointToPlane”度量时,此方法的最佳用途是将其作为预处理步骤应用于点云注册的pcregistericp函数。

代码:

clc;clear;% 加载点云ptCloud_in = pcread("bunny.pcd");% 下采样maxNumPoints = 8;ptCloud_nonuniformgrid = pcdownsample(ptCloud_in,"nonuniformGridSample",maxNumPoints);% 可视化figure;pcshow(ptCloud_in);title("原始点云");xlabel("X(m)");ylabel("Y(m)");zlabel("Z(m)");hold on;figure;pcshow(ptCloud_nonuniformgrid);title("下采样点云");xlabel("X(m)");ylabel("Y(m)");zlabel("Z(m)");hold on;% 保存下采样点云pcwrite(ptCloud_nonuniformgrid,"bunny_nonuniformgrid.pcd","Encoding","binary");%保存为binary形式的PCD点云

结果展示:


2.4 如何选择下采样方式

可根据下表进行选择

度量标准动态点云下采样法静态点云下采样法
pointToPointrandom、gridAveragerandom、gridAverage
pointToPlanerandom、gridAveragegridAverage、nonuniformGridSample

3 参考链接

https://ww2.mathworks.cn/help/vision/ref/pcdownsample.html

以上是关于MATLAB点云处理:点云下采样(random | gridAverage | nonuniformGridSample)的主要内容,如果未能解决你的问题,请参考以下文章