MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)相关的知识,希望对你有一定的参考价值。

1 圆柱体拟合函数 pcfitcylinder

pcfitcylinder — 从三维点云中拟合圆柱体

此函数使用M-估计样本一致性( M-estimator SAmple Consensus ,MSAC)算法来查找圆柱体。MSAC算法是一种改进的RANSAC算法

主要有 5 种重载方式

NO.1 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance,并返回模型系数model

model = pcfitcylinder(ptCloudIn,maxDistance)

NO.2 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance、圆柱体参考方向向量referenceVector [ l , m , n ] [l,m,n] [l,m,n],并返回模型系数model

model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector)

NO.3 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance、圆柱体参考方向向量referenceVector [ l , m , n ] [l,m,n] [l,m,n]、角度约束maxAngularDistance,并返回模型系数model

model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)

指定拟合圆柱体轴线方向向量与参考方向向量referenceVector的最大角度距离maxAngularDistance单位:角度(°),默认 5°

NO.4 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance,并返回模型系数model、内点索引inlierIndices、外点索引outlierIndices

[model,inlierIndices,outlierIndices] = pcfitcylinder(ptCloudIn,maxDistance)

NO.5 给定点云ptCloudIn,设置内点到模型的最大距离maxDistance,并返回模型系数model、内点索引inlierIndices、外点索引outlierIndices,以及模型拟合的平均误差meanError

[model,inlierIndices,outlierIndices,meanError] = pcfitcylinder(ptCloudIn,maxDistance)

2 代码实现

2.1 model = pcfitcylinder(ptCloudIn,maxDistance)

点云圆柱体拟合,当存在多个圆柱体时,返回点数最大的那个圆柱体。

代码:

clc;
clear;

% 加载点云
ptCloud_in = pcread('test.pcd');

% 可视化
pcshow(ptCloud_in);
title('包含圆柱体的点云')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');

% 设置点到圆柱体的最大距离
maxDistance = 0.05;

% 执行圆柱体拟合
model = pcfitcylinder(ptCloud_in,maxDistance)

输出结果:

model = 

  cylinderModel - 属性:

     Parameters: [0.0088 0.0269 -0.0097 -0.0060 -0.0211 5.0098 0.9943]
         Center: [0.0014 0.0029 2.5000]
    Orientation: [-0.0148 -0.0480 5.0195]
         Height: 5.0197
         Radius: 0.9943

其中,

  • Parameters为圆柱体参数,1×7向量 [ x 1 , y 1 , z 1 , x 2 , y 2 , z 2 , r ] [x_1,y_1,z_1,x_2,y_2,z_2,r] [x1,y1,z1,x2,y2,z2,r] [ x 1 , y 1 , z 1 ] [x_1,y_1,z_1] [x1,y1,z1] [ x 2 , y 2 , z 2 ] [x_2,y_2,z_2] [x2,y2,z2] 分别为柱体上下两个底面圆的圆心, r r r为圆柱体半径
  • Center 为圆柱体中心 [ x o , y o , z o ] [x_o,y_o,z_o] [xo,yo,zo]
  • Height 圆柱体高度 h h h
  • Orientation 圆柱体轴线的方向向量 n n n
  • Radius 圆柱体半径 r r r

2.2 model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector)

指定参考方向向量拟合圆柱体

代码:

clc;
clear;

% 加载点云
ptCloud_in = pcread('test.pcd');

% 设置点到圆柱体的最大距离
maxDistance = 0.05;

% 设置圆柱体参考方向向量
referenceVector = [3.0,3.9,1.1];

% 执行圆柱体拟合
model = pcfitcylinder(ptCloud_in,maxDistance,referenceVector)

输出结果:

model = 

  cylinderModel - 属性:

     Parameters: [-3.0457 -1.5017 4.1153 -0.1114 2.4240 5.1771 0.9994]
         Center: [-1.5785 0.4611 4.6462]
    Orientation: [2.9344 3.9257 1.0618]
         Height: 5.0149
         Radius: 0.9994

2.3 model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)

指定参考方向向量拟合圆柱体,同时指定圆柱方向向量与参考方向向量的最大夹角

代码:

clc;
clear;

% 加载点云
ptCloud_in = pcread('test.pcd');

% 设置点到圆柱体的最大距离
maxDistance = 0.05;

% 设置圆柱体参考方向向量
referenceVector = [3.0,3.9,1.1];

% 将最大角度距离设置为3.1°
maxAngularDistance = 3.1;

% 执行圆柱体拟合
model = pcfitcylinder(ptCloud_in,maxDistance,referenceVector,maxAngularDistance)

输出结果:

model = 

  cylinderModel - 属性:

     Parameters: [-3.0309 -1.5094 4.0985 -0.1001 2.3995 5.2389 1.0106]
         Center: [-1.5655 0.4451 4.6687]
    Orientation: [2.9308 3.9089 1.1404]
         Height: 5.0169
         Radius: 1.0106

2.4 [model,inlierIndices,outlierIndices] = pcfitcylinder(ptCloudIn,maxDistance) ★★★

圆柱体拟合,并提取内点、外点

代码:

clc;
clear;

ptCloud_in = pcread('test.pcd');

% 设置点到圆柱体的最小距离
maxDistance = 0.05;

% 执行平面拟合,并提取内点、外点索引
[model,inlier_Idx,outlier_Idx] = pcfitcylinder(ptCloud_in,maxDistance);

% 提取拟合圆柱体点云
cloud_cylinder = 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_cylinder);
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_cylinder,cloud_outlier)
title('圆柱体内点、外点比较')
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
hold off;

结果展示:




2.5 [model,inlierIndices,outlierIndices,meanError] = pcfitcylinder(ptCloudIn,maxDistance)

返回模型拟合的平均误差

代码:

clc;
clear;

ptCloud_in = pcread('test.pcd');

% 设置点到圆柱体的最小距离
maxDistance = 0.05;

% 执行平面拟合,并提取内点、外点索引
[model,inlier_Idx,outlier_Idx,meanError] = pcfitcylinder(ptCloud_in,maxDistance);

% 打印模型拟合的平均误差
meanError

输出结果:

meanError =

  single

    0.0241

3 注意

使用pcfitcylinder函数进行圆柱体拟合,拟合结果不唯一,每执行一次拟合,就得到一个不同的结果,但结果接近。


参考链接:

https://ww2.mathworks.cn/help/vision/ref/pcfitcylinder.html#d123e190381

以上是关于MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)的主要内容,如果未能解决你的问题,请参考以下文章

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

MATLAB点云处理(十五):球面拟合(RANSAC | MSAC)

MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC)

MATLAB点云处理(十七):最小二乘多项式曲线拟合

MATLAB点云处理(二十四):点云中值滤波(pcmedian)

MATLAB点云处理(二十四):点云中值滤波(pcmedian)