天天看点

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