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函数进行球面拟合,拟合结果不唯一,每执行一次拟合,就得到一个不同的结果,但结果接近。
参考链接
以上是关于MATLAB点云处理(十五):球面拟合(RANSAC | MSAC)的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)
MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC)