MATLAB点云处理(十三):平面拟合(MASC方法)

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB点云处理(十三):平面拟合(MASC方法)相关的知识,希望对你有一定的参考价值。

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)

MATLAB点云处理:点云法向量估计

matlab怎么将点云数据用最小二乘方法拟合出平面

MATLAB点云处理(十八):直线拟合(最小二乘 | RANSAC)

MATLAB点云处理(二十三):读写LAS点云(lasFileReader | lasFileWriter)