Open3D 点云RANSAC拟合圆(Python版本)
Posted 大鱼BIGFISH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Open3D 点云RANSAC拟合圆(Python版本)相关的知识,希望对你有一定的参考价值。
文章目录
一、简介
具体的算法内容可以参考这几篇文章:https://blog.csdn.net/dayuhaitang1/article/details/109427412,这里就不再赘述。
二、算法实现
2.1算法步骤
下面这个步骤其实也是随机采样一致性的通用步骤:
1、确定模型。比如本文要拟合一个圆,因此我们的模型就是原型,因此三个点就可以确定一个圆,方程式为 ( x − c 1
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方法得到的结果较好。
相关链接:
以上是关于Open3D 点云RANSAC拟合圆(Python版本)的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB点云处理(十六):多项式曲线拟合(RANSAC | MSAC)
MATLAB点云处理(十五):球面拟合(RANSAC | MSAC)
MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)