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方法得到的结果较好。


相关链接:

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

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

以上是关于Open3D 点云RANSAC拟合圆(Python版本)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

使用Open3D进行PCD拟合平面的Python代码示例

PCL随机采样一致性:RANSAC 圆拟合(二维圆 + 空间圆)

点云处理技术之open3d第三篇:点云的高级操作篇——点云边界框凸包DBSCAN聚类平面分割和隐点移除