文章目录
-
- 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)');
输出结果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP350MVR0T1EkaOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLkljM2cTMhRWOzADN5IjYiJTOhRTM4IjN0MTZ5gTZ5I2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
model =
sphereModel - 属性:
Parameters: [-1.4571e-08 0 0 1]
Center: [-1.4571e-08 0 0]
Radius: 1
其中,
-
为球面参数,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为球半径Parameters
-
为球心 [ x o , y o , z o ] [x_o,y_o,z_o] [xo,yo,zo]Center
-
球半径 r r rRadius
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