天天看點

MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)

文章目錄

    • 1 平面拟合函數 pcfitplane
    • 2 代碼實作
      • 2.1 model = pcfitplane(ptCloudIn,maxDistance)
      • 2.2 model = pcfitplane(ptCloudIn,maxDistance,referenceVector)
      • 2.3 model = pcfitplane(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)
      • 2.4 [model,inlierIndices,outlierIndices] = pcfitplane(ptCloudIn,maxDistance) ★★★
      • 2.5 平面拟合誤差計算 [model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloudIn,maxDistance)
    • 3 注意

1 平面拟合函數 pcfitplane

pcfitplane

— 從三維點雲中拟合平面

該函數使用M估計樣本一緻性(M-estimator SAmple Consensus,MSAC)算法來尋找平面。MSAC算法是一種改進的RANSAC算法。

主要有 5 種重載方式

NO.1 給定點雲

ptCloudIn

,設定内點到模型的最大距離

maxDistance

,并傳回模型系數

model

NO.2 給定點雲

ptCloudIn

,設定内點到模型的最大距離

maxDistance

、平面法向量的參考向量

referenceVector

,并傳回模型系數

model

從點雲中拟合平面,平面參考法向量被指定為1×3的referenceVector,如 [ 0 , 0 , 1 ] [0,0,1] [0,0,1]

NO.3 給定點雲

ptCloudIn

,設定内點到模型的最大距離

maxDistance

、平面法向量的參考向量

referenceVector

、角度限制

maxAngularDistance

,并傳回模型系數

model

指定拟合平面法向量與平面參考法向量的最大角度距離maxAngularDistance。機關:角度(°),預設 5.0°

NO.4 給定點雲

ptCloudIn

,設定内點到模型的最大距離

maxDistance

,并傳回模型系數

model

、内點索引

inlierIndices

、外點索引

outlierIndices

NO.5 給定點雲

ptCloudIn

,設定内點到模型的最大距離

maxDistance

,并傳回模型系數

model

、内點索引

inlierIndices

、外點索引

outlierIndices

,以及模型内點距離的平均誤差meanError。

2 代碼實作

2.1 model = pcfitplane(ptCloudIn,maxDistance)

點雲平面拟合,當存在多個平面時,傳回點數最大的那個平面。

代碼:

clc;
clear;

ptCloud_in = pcread('table.pcd');

pcshow(ptCloud_in);
title('包含平面的點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');

% 設定點到平面的最小距離
maxDistance = 0.02;

% 執行平面拟合,并輸出平面方程ax+by+cz+d=0系數
model = pcfitplane(ptCloud_in,maxDistance)
           

點雲展示:

MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)

輸出結果:

model = 

  planeModel - 屬性:

    Parameters: [-0.9995 -0.0319 0.0058 -1.2376]
        Normal: [-0.9995 -0.0319 0.0058]
           

其中,

Parameters

為平面方程 a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0 的系數向量 [ a , b , c , d ] [a,b,c,d] [a,b,c,d],且 [ a , b , c ] [a,b,c] [a,b,c] 為平面法向量。

從model 輸出結果并結合點雲可以看出,拟合的平面為左側較大的平面。

2.2 model = pcfitplane(ptCloudIn,maxDistance,referenceVector)

當點雲中包含多個平面(其法向量差異明顯)時,可以指定平面參考法向量referenceVector,拟合特定平面,其法向量與referenceVector的夾角最小。

代碼:

clc;
clear;

ptCloud_in = pcread('table.pcd');

% 設定點到平面的最小距離
maxDistance = 0.02;

% 設定平面參考法向量
referenceVector = [0,0,1];

% 執行平面拟合
model = pcfitplane(ptCloud_in,maxDistance,referenceVector)
           

輸出結果:

model = 

  planeModel - 屬性:

    Parameters: [0.0023 0.0148 0.9999 1.1624]
        Normal: [0.0023 0.0148 0.9999]
           

2.3 model = pcfitplane(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)

進一步設定 拟合平面法向量與參考方向之間的最大絕對角距離

maxAngularDistance

,機關:角度(°),預設 5.0°

代碼:

clc;
clear;

ptCloud_in = pcread('table.pcd');

% 設定點到平面的最小距離
maxDistance = 0.02;

% 設定平面參考法向量
referenceVector = [0,0,1];

% 将最大角度距離設定為8.8度
maxAngularDistance = 8.8;

% 執行平面拟合
model = pcfitplane(ptCloud_in,maxDistance,referenceVector,maxAngularDistance)
           

輸出結果:

model = 

  planeModel - 屬性:

    Parameters: [0.0027 0.0152 0.9999 1.1625]
        Normal: [0.0027 0.0152 0.9999]
           

2.4 [model,inlierIndices,outlierIndices] = pcfitplane(ptCloudIn,maxDistance) ★★★

拟合平面點雲,并提取内點、外點

clc;
clear;

ptCloud_in = pcread('table.pcd');

% 設定點到平面的最小距離
maxDistance = 0.02;


% 執行平面拟合,并提取内點、外點索引
[model,inlier_Idx,outlier_Idx] = pcfitplane(ptCloud_in,maxDistance);

% 提取拟合平面點雲
cloud_plane = select(ptCloud_in,inlier_Idx);

% 提取外點點雲
cloud_outlier = select(ptCloud_in,outlier_Idx);

% 可視化
figure;
pcshow(ptCloud_in);
title('包含平面的點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;

figure;
pcshow(cloud_plane);
title('平面拟合點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;

figure;
pcshow(cloud_outlier);
title('外點點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;

figure;
pcshowpair(cloud_plane,cloud_outlier)
title('平面内點、外點比較')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold off;
           

結果展示:

MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)
MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)
MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)
MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)

洋紅色為平面拟合點雲

值得注意的是,當設定平面參考法向量時,拟合的平面會無限延伸,與其相交的點都作為平面點。

代碼:

clc;
clear;

ptCloud_in = pcread('table.pcd');

% 設定點到平面的最小距離
maxDistance = 0.02;

% 設定平面參考法向量
referenceVector = [0,0,1];

% 将最大角度距離設定為8.8度
maxAngularDistance = 8.8;

% 執行平面拟合,并提取内點、外點索引
[model,inlier_Idx,outlier_Idx] = pcfitplane(ptCloud_in,maxDistance,referenceVector,maxAngularDistance);

% 提取拟合平面點雲
cloud_plane = select(ptCloud_in,inlier_Idx);

% 提取外點點雲
cloud_outlier = select(ptCloud_in,outlier_Idx);

figure;
pcshow(ptCloud_in);
title('包含平面的點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;

figure;
pcshow(cloud_plane);
title('平面拟合點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;

figure;
pcshow(cloud_outlier);
title('外點點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;

figure;
pcshowpair(cloud_plane,cloud_outlier)
title('平面内點、外點比較')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold off;

           

結果展示:

MATLAB點雲處理(十三):平面拟合(RANSAC | MASC)

洋紅色為平面拟合點雲

2.5 平面拟合誤差計算 [model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloudIn,maxDistance)

meanError

— Mean square error

内部點到模型距離的平均誤差,作為标量值傳回。

代碼:

clc;
clear;

ptCloud_in = pcread('table.pcd');

% 設定點到平面的最小距離
maxDistance = 0.02;

% 執行平面拟合
[model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloud_in,maxDistance);

% 拟合平均誤差
meanError
           

輸出結果:

meanError =

  single

    0.0060
           

3 注意

使用pcfitplane函數進行平面拟合,拟合結果不唯一,每執行一次拟合,就得到一個不同的結果,但結果接近。

相關連結

https://ww2.mathworks.cn/help/vision/ref/pcfitplane.html#bus0jhx