MATLAB点云处理(十五):球面拟合(RANSAC | MSAC)

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB点云处理(十五):球面拟合(RANSAC | MSAC)相关的知识,希望对你有一定的参考价值。

1 球面拟合函数 pcfitsphere

pcfitsphere — 从点云中拟合球面

此函数使用M估计样本一致性(M-estimator SAmple Consensus,MSAC)算法来查找球体。MSAC算法是一种改进的 RANSAC 算法。

主要有 3 种重载方式

NO.1 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance,实现点云的RANSAC球面拟合,并返回模型系数model

model = pcfitsphere(ptCloudIn,maxDistance)

NO.2 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance,实现点云的RANSAC球面拟合,并返回模型系数model,内点索引inlierIndices、外点索引outlierIndices

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

NO.3 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance,实现点云的RANSAC球面拟合,并返回模型系数model,内点索引inlierIndices、外点索引outlierIndices以及模型拟合的平均误差meanError

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

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)');

输出结果:

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;

结果展示:

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

以上是关于MATLAB点云处理(十五):球面拟合(RANSAC | MSAC)的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB点云处理(十三):平面拟合(MASC方法)

MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)

MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC)

MATLAB点云处理(十七):最小二乘多项式曲线拟合

MATLAB点云处理(二十五):点云生成 DEM(pc2dem)

MATLAB点云处理(二十五):点云生成 DEM(pc2dem)