天天看點

MATLAB點雲處理(十五):球面拟合(RANSAC | MSAC)

文章目錄

    • 1 球面拟合函數 pcfitsphere
    • 2 代碼實作
      • 2.1 model = pcfitsphere(ptCloudIn,maxDistance)
      • 2.2 [model,inlierIndices,outlierIndices] = pcfitsphere(ptCloudIn,maxDistance) ★★★
      • 2.3 [model,inlierIndices,outlierIndices,meanError] = pcfitsphere(ptCloudIn,maxDistance)
    • 3 注意

1 球面拟合函數 pcfitsphere

pcfitsphere

— 從點雲中拟合球面

此函數使用M估計樣本一緻性(M-estimator SAmple Consensus,MSAC)算法來查找球體。MSAC算法是一種改進的 RANSAC 算法。

主要有 3 種重載方式

NO.1 給定點雲

ptCloudIn

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

maxDistance

,實作點雲的RANSAC球面拟合,并傳回模型系數

model

NO.2 給定點雲

ptCloudIn

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

maxDistance

,實作點雲的RANSAC球面拟合,并傳回模型系數

model

,内點索引

inlierIndices

、外點索引

outlierIndices

NO.3 給定點雲

ptCloudIn

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

maxDistance

,實作點雲的RANSAC球面拟合,并傳回模型系數

model

,内點索引

inlierIndices

、外點索引

outlierIndices

以及模型拟合的平均誤差

meanError

2 代碼實作

2.1 model = pcfitsphere(ptCloudIn,maxDistance)

拟合并傳回模型系數

代碼:

clc;
clear;

% 加載點雲
ptCloud_in = pcread('test.pcd');

% 設定内點到模型的最大距離
maxDistance = 0.05;

% 執行MSAC球拟合
model = pcfitsphere(ptCloud_in,maxDistance)

% 可視化
pcshow(ptCloud_in);
title('包含球體的點雲')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
           

輸出結果:

MATLAB點雲處理(十五):球面拟合(RANSAC | MSAC)
model = 

  sphereModel - 屬性:

    Parameters: [-1.4571e-08 0 0 1]
        Center: [-1.4571e-08 0 0]
        Radius: 1
           

其中,

  • Parameters

    為球面參數,1×4向量 [ x o , y o , z o , r ] [x_o,y_o,z_o,r] [xo​,yo​,zo​,r] , [ x o , y o , z o , ] [x_o,y_o,z_o,] [xo​,yo​,zo​,]為球心, r r r為球半徑
  • Center

    為球心 [ x o , y o , z o ] [x_o,y_o,z_o] [xo​,yo​,zo​]
  • Radius

    球半徑 r r r

2.2 [model,inlierIndices,outlierIndices] = pcfitsphere(ptCloudIn,maxDistance) ★★★

拟合球面并傳回内點、外點

代碼:

clc;
clear;

% 加載點雲
ptCloud_in = pcread('test.pcd');

% 設定内點到模型的最大距離
maxDistance = 0.05;

% 執行MSAC球拟合,并提取内點、外點索引
[model,inlierIndices,outlierIndices] = pcfitsphere(ptCloud_in,maxDistance);

% 提取拟合球面點雲
cloud_sphere = select(ptCloud_in,inlierIndices);

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

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

figure;
pcshow(cloud_sphere);
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_sphere,cloud_outlier)
title('球面内點、外點比較')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold off;
           

結果展示:

MATLAB點雲處理(十五):球面拟合(RANSAC | MSAC)
MATLAB點雲處理(十五):球面拟合(RANSAC | MSAC)
MATLAB點雲處理(十五):球面拟合(RANSAC | MSAC)
MATLAB點雲處理(十五):球面拟合(RANSAC | MSAC)

2.3 [model,inlierIndices,outlierIndices,meanError] = pcfitsphere(ptCloudIn,maxDistance)

拟合球面并計算平均誤差

代碼:

clc;
clear;

% 加載點雲
ptCloud_in = pcread('test.pcd');

% 設定内點到模型的最大距離
maxDistance = 0.05;

% 執行MSAC球拟合,并計算拟合的平均誤差
[model,inlierIndices,outlierIndices,meanError] = pcfitsphere(ptCloud_in,maxDistance);

% 輸出拟合的平均誤差
meanError
           

輸出結果:

meanError =

  single

  9.0224e-09
           

3 注意

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

相關連結

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