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

Posted 没事就要敲代码

tags:

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

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)的主要内容,如果未能解决你的问题,请参考以下文章

PCL中常用的高级采样方法

点云处理技术之PCL随机采样一致算法(Random sample consensus,RANSAC)

29 PCL配准问题调参

MATLAB点云处理(十九):点云合并(pcmerge)

MATLAB点云处理(二十五):点云生成 DEM(pc2dem)

MATLAB点云处理(二十五):点云生成 DEM(pc2dem)