主要内容

本页采用了机器翻译。点击此处可查看英文原文。

pcdownsample

对三维点云进行降采样

说明

ptCloudOut = pcdownsample(ptCloudIn,"random",percentage) 返回一个经过降采样的点云。若要进行不放回的随机抽样,请使用此语法。percentage 输入指定要返回至输出的输入部分。

ptCloudOut = pcdownsample(ptCloudIn,"gridAverage",gridStep) 使用盒式网格滤波器返回一个下采样后的点云。gridStep 输入指定了一个三维盒子的大小。

示例

ptCloudOut = pcdownsample(ptCloudIn,"gridNearest",gridStep) 通过使用盒式网格滤波器,在每个网格中选取最接近质心的点,从而返回一个下采样后的点云。gridStep 输入指定了一个三维盒子的大小。

ptCloudOut = pcdownsample(ptCloudIn,"nonuniformGridSample",maxNumPoints) 使用非均匀箱形网格滤波器返回一个下采样后的点云。您必须将网格框中的最大点数 maxNumPoints 设置为至少 6

[ptCloudOut,indices] = pcdownsample(___) 返回降采样点云中包含的各点的线性索引。此语法仅在使用 "random""gridNearest""nonuniformGridSample" 降采样方法时适用。

___ = pcdownsample(___,Name=Value) 支持上述语法中的任何参量组合,且可使用一个或多个名称-值参量指定选项。例如,pcdownsample(PtCloud,"random",percentage,PreserveStructure=true) 能够保留点云的有序结构。

示例

全部折叠

读取点云数据。

ptCloud = pcread("teapot.ply");

将三维分辨率设置为 (0.1 × 0.1 × 0.1)。

gridStep = 0.1;
ptCloudA = pcdownsample(ptCloud,'gridAverage',gridStep);

对下采样后的数据进行可视化。

figure
pcshow(ptCloudA);

Figure contains an axes object. The axes object contains an object of type scatter.

将点云与使用固定步长进行降采样的数据进行比较。

stepSize = floor(ptCloud.Count/ptCloudA.Count);
indices = 1:stepSize:ptCloud.Count;
ptCloudB = select(ptCloud,indices);

对下采样后的点云进行可视化。

figure
pcshow(ptCloudB);

Figure contains an axes object. The axes object contains an object of type scatter.

创建一个所有点坐标均相同的点云。

ptCloud = pointCloud(ones(100,3));

将 三维分辨率设置为较小的值。

gridStep = 0.01;

输出现在只包含一个唯一的点。

ptCloudOut = pcdownsample(ptCloud,'gridAverage',gridStep)
ptCloudOut = 
  pointCloud with properties:

     Location: [1 1 1]
        Count: 1
      XLimits: [1 1]
      YLimits: [1 1]
      ZLimits: [1 1]
        Color: [0×3 uint8]
       Normal: [0×3 double]
    Intensity: [0×1 double]

从已保存的 MAT 文件中加载一个已整理的点云。

ld = load('drivingLidarPoints.mat');
orgPtCloud = ld.ptCloud;

对点云进行降采样。生成的点云保留了有序的结构。其位置属性的大小为 M×N×3。

gridStep = 2;
orgPtCloudOut = pcdownsample(orgPtCloud,'gridNearest',gridStep,PreserveStructure=true)
orgPtCloudOut = 
  pointCloud with properties:

     Location: [32×1083×3 double]
        Count: 34656
      XLimits: [-86.7523 90.5514]
      YLimits: [-85.8353 70.7870]
      ZLimits: [-8.2440 13.9009]
        Color: []
       Normal: []
    Intensity: [32×1083 double]

对下采样后的点云进行可视化。

figure
pcshow(orgPtCloudOut)

Figure contains an axes object. The axes object contains an object of type scatter.

输入参数

全部折叠

点云,指定为 pointCloud 对象。

随机降采样方法,指定为 "random"。与 "gridAverage" 降采样方法相比,"random" 方法效率更高,尤其是在将其应用于点云配准之前时。

输入的百分比,指定为取值范围在 [0, 1] 内的非负标量。percentage 输入指定了该函数应返回的输入部分。

网格平均降采样方法,指定为 "gridAverage"。同一体素内的点在输出体素中会被合并为一个点。其颜色和常规属性将据此进行平均计算。与 "random" 下采样方法相比,该方法能更好地保留点云的形状。

该函数计算整个点云的轴对齐边界框。边界框被划分为由 gridStep 指定的大小的体素网格。每个体素内的点通过对其位置、颜色和法线进行求平均值来合并。

“最接近质心”下采样方法,指定为 "gridNearest"。在每个体素中,选取距离质心最近的点。使用 gridNearest 降采样技术,以在降采样后的点云中更精确地呈现颜色、强度和法线数据。

该函数计算整个点云的轴对齐边界框。边界框被划分为由 gridStep 指定的大小的体素网格。

网格滤波器的三维盒子尺寸,以值形式指定。当资源不足以构建大型细粒度体素网格时,请增大 gridStep 的尺寸。

数据类型: single | double

非均匀网格采样方法,指定为 "nonuniformGridSample"。使用 "nonuniformGridSample" 算法时,法线是在下采样之前基于原始数据计算的。降采样后的输出保留了更精确的法线。

网格体素中的最大点数,指定为一个大于 6 的整数。该方法从每个体素中随机选取一个点。如果输入点云中未提供法线信息,该方法会自动在 ptCloudOut 输出中填充法线属性。

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: PreserveStructure=true 保留了点云的有序结构。

保留点云的有序结构,指定为 truefalse。该表根据 PreserveStructure 的值描述了点云的结构。

PreserveStructure该函数返回
true

一个经过组织和降采样的点云。

描述点云结构的 Location 属性包含一个 M×N×3 的矩阵。

在降采样后的点云中未被选中的点将填充为 NaN,且对应的颜色设置为 [0 0 0]

要返回一个经过整理的点云,输入必须是经过整理的点云,且下采样方法必须为 "random""nonuniformGridSample""gridNearest"

false

一个未组织、已降采样的点云。

描述点云结构的 Location 属性包含一个 M×3 的矩阵。

输出参量

全部折叠

经过降采样的点云,以 pointCloud 对象的形式返回。

下采样点云中各点的坐标,以 N 元素向量的形式返回。

参考

[1] Pomerleau, F., F. Colas, R. Siegwart, and S. Magnenat. “Comparing ICP variants on real-world data sets.” Autonomous Robots. Vol. 34, Issue 3, April 2013, pp. 133–148.

扩展功能

全部展开

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2015a 中推出

全部展开