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

Posted 没事就要敲代码

tags:

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

1 最小二乘直线拟合

MATLAB点云处理(十七):最小二乘多项式曲线拟合 已经作出讲解。

2 RANSAC直线拟合

MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC) 一文中已经给出了一种RANSAC直线拟合的方法,接下来介绍第二种RANSAC直线拟合的方法。

2.1 RANSAC直线拟合函数

ransac — 从含有噪声的数据中拟合直线

语法:

[model,inlierIdx] = ransac(data,fitFcn,distFcn,sampleSize,maxDistance) 

使用改进的RANSAC算法 —— M估计样本一致性(M-estimator sample consensus,MSAC)算法进行直线拟合

其中,
data : 二维平面数据点集合
fitFcn : 用于拟合模型的函数
distFcn : 用于计算模型到数据之间距离的函数
sampleSize : 每次采样的点数
maxDistance : 内点到模型的最大距离

2.2 代码实现

示例:最小二乘直线拟合与RANSAC直线拟合的对比

代码:

clc;
clear;

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

% 提取xoy平面坐标点
xyPoints = ptCloud.Location;
x = xyPoints(:,1);
y = xyPoints(:,2);

figure;
plot(x,y,'.');
title('xoy平面投影点云');
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');

% 最小二乘直线拟合
modelLeastSquares = polyfit(x,y,1);
x1 = linspace(min(x),max(x));
y1 = polyval(modelLeastSquares,x1);

% RANSAC直线拟合
sampleSize = 2; % 每次采样的点数,直线为2
maxDistance = 0.1; % 内点到模型的最大距离
fitLineFcn = @(xyPoints) polyfit(xyPoints(:,1),xyPoints(:,2),1); % 拟合方式采用 polyfit,这里不可以用x,y替换xyPoints(:,1)xyPoints(:,2)
evalLineFcn =  @(model, xyPoints) sum((y - polyval(model, x)).^2,2);% 距离估算函数
[modelRANSAC, inlierIdx] = ransac(xyPoints,fitLineFcn,evalLineFcn,sampleSize,maxDistance);% 执行RANSAC直线拟合,提取内点索引
modelInliers = polyfit(xyPoints(inlierIdx,1),xyPoints(inlierIdx,2),1);% 对模型内点进行最小二乘直线拟合

% 展示最小二乘直线拟合 和 RANSAC直线拟合的结果
figure;
plot(xyPoints(inlierIdx,1),xyPoints(inlierIdx,2),'.');		% 内点
hold on;
plot(xyPoints(~inlierIdx,1),xyPoints(~inlierIdx,2),'ro');	% 外点
hold on;
plot(x1,y1,'r-');											% 最小二乘直线拟合结果
hold on;

inlierPts = xyPoints(inlierIdx,:);
x2 = linspace(min(inlierPts(:,1)),max(inlierPts(:,1)));
y2 = polyval(modelInliers,x2);
plot(x2, y2, 'g-');											% RANSAC直线拟合结果
hold off;

title('最小二乘直线拟合 与 RANSAC直线拟合 对比');
xlabel('X(m)');
ylabel('Y(m)');
zlabel('Z(m)');
legend('内点','噪声点','最小二乘直线拟合','RANSAC直线拟合','Location','NorthWest');

结果展示:


由于噪声的存在,最小二乘法得到的拟合结果与预期结果相差甚远,而RANSAC方法得到的结果较好。


相关链接:

最小二乘曲线拟合的C++实现

https://ww2.mathworks.cn/help/vision/ref/ransac.html

以上是关于MATLAB点云处理(十八):直线拟合(最小二乘 | RANSAC)的主要内容,如果未能解决你的问题,请参考以下文章

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

MATLAB点云处理(二十八):基于格网法与平面拟合的道路点云与非道路点云分割

MATLAB点云处理(二十八):基于格网法与平面拟合的道路点云与非道路点云分割

最优化案例整理

基于移动最小二乘法的点云曲面拟合(python)

halcon之最小二乘拟合直线