MATLAB点云处理(十三):平面拟合(MASC方法)
Posted 没事就要敲代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB点云处理(十三):平面拟合(MASC方法)相关的知识,希望对你有一定的参考价值。
文章目录
- 1 平面拟合函数 pcfitplane
- 2 代码实现
- 2.1 model = pcfitplane(ptCloudIn,maxDistance)
- 2.2 model = pcfitplane(ptCloudIn,maxDistance,referenceVector)
- 2.3 model = pcfitplane(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)
- 2.4 [model,inlierIndices,outlierIndices] = pcfitplane(ptCloudIn,maxDistance) ★★★
- 2.5 平面拟合误差计算 [model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloudIn,maxDistance)
- 3 注意
1 平面拟合函数 pcfitplane
pcfitplane
— 从三维点云中拟合平面
MATLAB提供了 6 种重载方式
model = pcfitplane(ptCloudIn,maxDistance)
从点云中拟合平面,该点云具有从内点到平面的最大允许距离。函数返回描述平面的几何模型。
该函数使用M估计样本一致性(M-estimator SAmple Consensus,MSAC)算法来寻找平面。MSAC算法是RANSAC算法的一个变种。
model = pcfitplane(ptCloudIn,maxDistance,referenceVector)
从点云中拟合平面,平面参考法向量被指定为1×3的referenceVector,如 [ 0 , 0 , 1 ] [0,0,1] [0,0,1]
model = pcfitplane(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)
指定拟合平面法向量与平面参考法向量的最大角度距离。单位:角度(°),默认 5.0°
[model,inlierIndices,outlierIndices] = pcfitplane(ptCloudIn,maxDistance)
从点云中拟合平面,该点云具有从内点到平面的最大允许距离。函数返回描述平面的几何模型、内点和外点的线性索引。
[model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloudIn,maxDistance)
从点云中拟合平面,该点云具有从内点到平面的最大允许距离。函数返回描述平面的几何模型、内点和外点的线性索引。同时 返回模型内点距离的平均误差meanError。
[___] = pcfitplane(ptCloudIn,maxDistance,Name,Value)
使用由一个或多个名称、值对参数指定的其他选项。
2 代码实现
2.1 model = pcfitplane(ptCloudIn,maxDistance)
点云平面拟合,当存在多个平面时,返回点数最大的那个平面。
代码:
clc;
clear;
ptCloud_in = pcread('table.pcd');
pcshow(ptCloud_in);
title('包含平面的点云')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
% 设置点到平面的最小距离
maxDistance = 0.02;
% 执行平面拟合,并输出平面方程ax+by+cz+d=0系数
model = pcfitplane(ptCloud_in,maxDistance)
点云展示:
输出结果:
model =
planeModel - 属性:
Parameters: [-0.9995 -0.0319 0.0058 -1.2376]
Normal: [-0.9995 -0.0319 0.0058]
其中,Parameters
为平面方程
a
x
+
b
y
+
c
z
+
d
=
0
ax+by+cz+d=0
ax+by+cz+d=0 的系数向量
[
a
,
b
,
c
,
d
]
[a,b,c,d]
[a,b,c,d],且
[
a
,
b
,
c
]
[a,b,c]
[a,b,c] 为平面法向量。
从model 输出结果并结合点云可以看出,拟合的平面为左侧较大的平面。
2.2 model = pcfitplane(ptCloudIn,maxDistance,referenceVector)
当点云中包含多个平面(其法向量差异明显)时,可以指定平面参考法向量referenceVector,拟合特定平面,其法向量与referenceVector的夹角最小。
代码:
clc;
clear;
ptCloud_in = pcread('table.pcd');
% 设置点到平面的最小距离
maxDistance = 0.02;
% 设置平面参考法向量
referenceVector = [0,0,1];
% 执行平面拟合
model = pcfitplane(ptCloud_in,maxDistance,referenceVector)
输出结果:
model =
planeModel - 属性:
Parameters: [0.0023 0.0148 0.9999 1.1624]
Normal: [0.0023 0.0148 0.9999]
2.3 model = pcfitplane(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)
进一步设置 拟合平面法向量与参考方向之间的最大绝对角距离 maxAngularDistance
,单位:角度(°),默认 5.0°
代码:
clc;
clear;
ptCloud_in = pcread('table.pcd');
% 设置点到平面的最小距离
maxDistance = 0.02;
% 设置平面参考法向量
referenceVector = [0,0,1];
% 将最大角度距离设置为8.8度
maxAngularDistance = 8.8;
% 执行平面拟合
model = pcfitplane(ptCloud_in,maxDistance,referenceVector,maxAngularDistance)
输出结果:
model =
planeModel - 属性:
Parameters: [0.0027 0.0152 0.9999 1.1625]
Normal: [0.0027 0.0152 0.9999]
2.4 [model,inlierIndices,outlierIndices] = pcfitplane(ptCloudIn,maxDistance) ★★★
拟合平面点云,并提取内点、外点
clc;
clear;
ptCloud_in = pcread('table.pcd');
% 设置点到平面的最小距离
maxDistance = 0.02;
% 执行平面拟合,并提取内点、外点索引
[model,inlier_Idx,outlier_Idx] = pcfitplane(ptCloud_in,maxDistance);
% 提取拟合平面点云
cloud_plane = select(ptCloud_in,inlier_Idx);
% 提取外点点云
cloud_outlier = select(ptCloud_in,outlier_Idx);
% 可视化
figure;
pcshow(ptCloud_in);
title('包含平面的点云')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;
figure;
pcshow(cloud_plane);
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_plane,cloud_outlier)
title('平面内点、外点比较')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold off;
结果展示:
洋红色为平面拟合点云
值得注意的是,当设置平面参考法向量时,拟合的平面会无限延伸,与其相交的点都作为平面点。
代码:
clc;
clear;
ptCloud_in = pcread('table.pcd');
% 设置点到平面的最小距离
maxDistance = 0.02;
% 设置平面参考法向量
referenceVector = [0,0,1];
% 将最大角度距离设置为8.8度
maxAngularDistance = 8.8;
% 执行平面拟合,并提取内点、外点索引
[model,inlier_Idx,outlier_Idx] = pcfitplane(ptCloud_in,maxDistance,referenceVector,maxAngularDistance);
% 提取拟合平面点云
cloud_plane = select(ptCloud_in,inlier_Idx);
% 提取外点点云
cloud_outlier = select(ptCloud_in,outlier_Idx);
figure;
pcshow(ptCloud_in);
title('包含平面的点云')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold on;
figure;
pcshow(cloud_plane);
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_plane,cloud_outlier)
title('平面内点、外点比较')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold off;
结果展示:
洋红色为平面拟合点云
2.5 平面拟合误差计算 [model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloudIn,maxDistance)
meanError
— Mean square error
内部点到模型距离的平均误差,作为标量值返回。
代码:
clc;
clear;
ptCloud_in = pcread('table.pcd');
% 设置点到平面的最小距离
maxDistance = 0.02;
% 执行平面拟合
[model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloud_in,maxDistance);
% 拟合平均误差
meanError
输出结果:
meanError =
single
0.0060
3 注意
使用pcfitplane函数进行平面拟合,拟合结果不唯一,每执行一次拟合,就得到一个不同的结果。
参考链接
https://ww2.mathworks.cn/help/vision/ref/pcfitplane.html#bus0jhx
以上是关于MATLAB点云处理(十三):平面拟合(MASC方法)的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB点云处理(二十八):基于格网法与平面拟合的道路点云与非道路点云分割
MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC)