天天看点

MATLAB点云处理(十三):平面拟合(RANSAC | 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

— 从三维点云中拟合平面

该函数使用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)
           

点云展示:

MATLAB点云处理(十三):平面拟合(RANSAC | MASC)

输出结果:

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;
           

结果展示:

MATLAB点云处理(十三):平面拟合(RANSAC | MASC)
MATLAB点云处理(十三):平面拟合(RANSAC | MASC)
MATLAB点云处理(十三):平面拟合(RANSAC | MASC)
MATLAB点云处理(十三):平面拟合(RANSAC | MASC)

洋红色为平面拟合点云

值得注意的是,当设置平面参考法向量时,拟合的平面会无限延伸,与其相交的点都作为平面点。

代码:

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;

           

结果展示:

MATLAB点云处理(十三):平面拟合(RANSAC | MASC)

洋红色为平面拟合点云

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