MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)
Posted 没事就要敲代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)相关的知识,希望对你有一定的参考价值。
文章目录
- 1 圆柱体拟合函数 pcfitcylinder
- 2 代码实现
- 2.1 model = pcfitcylinder(ptCloudIn,maxDistance)
- 2.2 model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector)
- 2.3 model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)
- 2.4 [model,inlierIndices,outlierIndices] = pcfitcylinder(ptCloudIn,maxDistance) ★★★
- 2.5 [model,inlierIndices,outlierIndices,meanError] = pcfitcylinder(ptCloudIn,maxDistance)
- 3 注意
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 hOrientation
圆柱体轴线的方向向量 n n nRadius
圆柱体半径 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点云处理(十五):球面拟合(RANSAC | MSAC)
MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC)