MATLAB点云平面拟合(MASC方法)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1 平面拟合函数 pcfitplane
pcfitplane — 从三维点云中拟合平面

MATLAB提供了 6 种重载方式

model = pcfitplane(ptCloudIn,maxDistance)

从点云中拟合平面该点云具有从内点到平面的最大允许距离。函数返回描述平面的几何模型。

该函数使用M估计样本一致性M-estimator SAmple ConsensusMSAC算法来寻找平面。MSAC算法是RANSAC算法的一个变种。

model = pcfitplane(ptCloudIn,maxDistance,referenceVector)

从点云中拟合平面平面参考法向量被指定为1×3的referenceVector如 [1,0,0] [0,1,0] [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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6