天天看點

MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)

文章目錄

    • 1 下采樣函數 pcdownsample
    • 2 代碼實作
      • 2.1 随機下采樣(random)
      • 2.2 均勻體素下采樣(gridAverage)
      • 2.3 非均勻體素下采樣(nonuniformGridSample)
      • 2.4 如何選擇下采樣方式

1 下采樣函數 pcdownsample

點雲下采樣,也稱點雲降采樣,目的是為了減少資料量,提高點雲處理效率。

MATLAB 提供了點雲下采樣函數 pcdownsample,有三種重載方式

随機下采樣,且不替換原始點。百分比為下采樣的比例,取值範圍 [ 0,1 ]
體素栅格下采樣,将體素中心代替體素内的所有點。gridStep 為體素栅格的步長大小
使用非均勻長方體栅格過濾器下采樣點雲。必須将體素内最大點數maxNumPoints 不能低于 6

下面将依次進行說明。

2 代碼實作

2.1 随機下采樣(random)

随機下采樣方法,指定為

random

random

方法比

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點雲
           

結果展示:

MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)
MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)

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點雲
           

結果展示:

MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)
MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)

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點雲
           

結果展示:

MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)
MATLAB點雲處理(十):點雲下采樣(random | gridAverage | nonuniformGridSample)

2.4 如何選擇下采樣方式

可根據下表進行選擇

度量标準 動态點雲下采樣法 靜态點雲下采樣法
pointToPoint random、gridAverage random、gridAverage
pointToPlane random、gridAverage gridAverage、nonuniformGridSample

相關連結

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