文章目录
-
- 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
— 从三维点云中拟合平面
该函数使用M估计样本一致性(M-estimator SAmple Consensus,MSAC)算法来寻找平面。MSAC算法是一种改进的RANSAC算法。
主要有 5 种重载方式
NO.1 给定点云
ptCloudIn
,设置内点到模型的最大距离
maxDistance
,并返回模型系数
model
NO.2 给定点云
ptCloudIn
,设置内点到模型的最大距离
maxDistance
、平面法向量的参考向量
referenceVector
,并返回模型系数
model
从点云中拟合平面,平面参考法向量被指定为1×3的referenceVector,如 [ 0 , 0 , 1 ] [0,0,1] [0,0,1]
NO.3 给定点云
ptCloudIn
,设置内点到模型的最大距离
maxDistance
、平面法向量的参考向量
referenceVector
、角度约束
maxAngularDistance
,并返回模型系数
model
指定拟合平面法向量与平面参考法向量的最大角度距离maxAngularDistance。单位:角度(°),默认 5.0°
NO.4 给定点云
ptCloudIn
,设置内点到模型的最大距离
maxDistance
,并返回模型系数
model
、内点索引
inlierIndices
、外点索引
outlierIndices
NO.5 给定点云
ptCloudIn
,设置内点到模型的最大距离
maxDistance
,并返回模型系数
model
、内点索引
inlierIndices
、外点索引
outlierIndices
,以及模型内点距离的平均误差meanError。
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