【2D算法系列】圆拟合算法剖析与硬核实战
顾名思义,圆拟合是从给定的点集数据中拟合出一个圆。机器视觉(或是计算机视觉)领域,主流的圆拟合算法有最小二乘法、迭代重加权最小二乘法、非线性优化法等。本文将对上述算法原理进行深入剖析,并硬核实战。文章编辑器对公式支持不友好,显示异常,因此部分公式用截图替代,希望V社区管理员能推动改进。

圆拟合算法剖析与硬核实战


友情提醒:转载或合理使用本文提出的算法,请务必注明出处,也是对作者的认可与尊重。

什么是圆拟合

顾名思义,圆拟合是从给定的点集数据中拟合出一个圆。

定义

通过一堆离散的点,然后根据这些离散点的特点,拟合出一个

特征

  1. 一堆离散的点,点数大于等于2
  2. 离散点的特征,满足几何基元约束
  3. 拟合出一个圆,结果一定是个圆

主流算法

机器视觉(或是计算机视觉)领域,主流的圆拟合算法有:

  1. 最小二乘法
  2. 迭代重加权最小二乘法
  3. 非线性优化法
  4. 旋转角度法
  5. 旋转角度最小二乘法

后面两种算法仅用于小角度圆拟合场景,严格意义上讲不属于典型圆拟合范畴,因此本文不做介绍。

最小二乘法(LS)

原理

圆的标准方程为:

(ra)2+(cb)2=R2(r-a)^2+(c-b)^2=R^2

展开可得:

2ra+2cba2b2+R2=r2+c22ra+2cb-a^2-b^2+R^2=r^2+c^2

q=a2+b2R2q=a^2+b^2-R^2,则有:
image.png
image.png
误差函数:
image.png
定义矩阵A:
image.png
定义矩阵B:
image.png
则根据最小二乘法有:
image.png

核心代码

double A_matrix[MAX_POINT_NUM] = { 0.0 }; double B_matrix[MAX_POINT_NUM] = { 0.0 }; double x_matrix[3] = { 0.0 }; for (int i = 0; i < nPointArrayCount; i++) { A_matrix[i * 3 + 0] = 2 * fFitPointX[i]; A_matrix[i * 3 + 1] = 2 * fFitPointY[i]; A_matrix[i * 3 + 2] = 1; B_matrix[i] = pow(fFitPointX[i], 2) + pow(fFitPointY[i], 2); } int nRet = LeastSquare(A_matrix, B_matrix, x_matrix, nPointArrayCount); fCenterX = x_matrix[0]; fCenterY = x_matrix[1]; fRadius = sqrt(pow(x_matrix[0], 2) + pow(x_matrix[1], 2) + x_matrix[2]);

迭代重加权最小二乘法(IRLS)

原理

最小平方圆拟合对于离群值不够鲁棒,因此需要引入权重并使用它来减小离群值的影响。先采用正常的最小二乘法拟合一个圆,然后用各拟合点到此圆的距离来计算在后续的迭代中将使用的各点所对应的权重。
误差函数:
image.png
式中,(a,b)(a,b)是圆心,RR是圆半径,wiw_{i}是权重函数。
第一种权重函数为Huber权重函数:
image.png
式中,δ\delta为拟合点到圆周的距离,τ\tau为削波因数。所有距离τ\leq\tau的点对应的权重都是1,距离>τ>\tau的点将分配更小的权重,从而减小离群点对结果的干扰。
第二种权重函数为Tukey权重函数:
image.png
式中,δ\delta为拟合点到圆周的距离,τ\tau为削波因数。所有距离τ\leq\tau的点对应的权重在1~0之间平滑变化,距离>τ>\tau的点将被完全忽略,不参与拟合,从而减小离群点对结果的干扰。
削波因数τ\tau的计算公式为:

σδ=medianδi0.6745\sigma_{\delta}=\frac{median|\delta_{i}|}{0.6745}

τ=2σδ\tau=2\sigma_{\delta}

对于符合正态分布的离群值,鲁棒标准偏差σδ\sigma_{\delta}的分子为所有拟合点到圆心距离的中值,分母为基于正态分布计算的标准偏差。

核心代码

此处代码不做展示,留作读者自行实现。

非线性优化法(GN)

原理

将所有拟合点到待拟合圆的平方距离进行连加求和,然后使求得的总和最小化。
误差函数:
image.png
式中,(a,b)(a,b)是圆心,RR是圆半径。与之前的方法不同,这是一个非线性优化的问题,只能采用非线性优化技术来求解。
常见的非线性优化算法有:

  1. 梯度下降法
  2. 牛顿法
  3. 拟牛顿法
  4. 高斯牛顿法
  5. 列文伯格-马夸尔特法

其中,高斯牛顿法(Gauss–Newton algorithm)在牛顿法的基础上做了改进。牛顿法中的H矩阵需要计算目标函数的二阶偏导,计算量巨大,高斯牛顿法采用G矩阵替代H矩阵,大大减小了计算量。
因此,选择高斯牛顿法实现圆拟合的非线性优化。

核心代码

// 开始Gauss-Newton迭代 int iterations = 20; // 迭代次数 double cost = 0, lastCost = 0; // 本次迭代的cost和上一次迭代的cost // CostFunction = Σ(AXi - Bi)² A=(a,b,c) Xi=(xi,yi,1)^T Bi = -xi² - yi² for (int iter = 0; iter < iterations; iter++) { Matrix3d H = Matrix3d::Zero(); // Hessian = J^T W^{-1} J in Gauss-Newton Vector3d b = Vector3d::Zero(); // bias cost = 0; for (int i = 0; i < N; i++) { double xi = x_data[i], yi = y_data[i]; // 第i个数据点 double error = xi * xi + yi * yi + (ae * xi + be * yi + ce); Vector3d J; // 雅可比矩阵 J[0] = xi; // de/da J[1] = yi; // de/db J[2] = 1; // de/dc H += J * J.transpose(); b += -error * J; cost += error * error; } // 求解线性方程 Hx=b Vector3d dx = H.ldlt().solve(b); if (isnan(dx[0])) { cout << "result is nan!" << endl; break; } if (iter > 0 && cost >= lastCost) { cout << "cost: " << cost << ">= last cost: " << lastCost << ", break." << endl; break; } ae += dx[0]; be += dx[1]; ce += dx[2]; lastCost = cost; cout << "total cost: " << cost << ", \t\tupdate: " << dx.transpose() << "\t\testimated params: " << ae << "," << be << "," << ce << endl; } double centerX = ae / -2; double centerY = be / -2; double radius = sqrt(ae * ae / 4 + be * be / 4 - ce);

运行结果对比

采集多组独立的数据,分别采用本文提出的算法、VisionMaster(国内最领先的算法平台,简称VM)进行圆拟合,从圆拟合结果(含拟合误差)、算法运行耗时两个方面评估算法的准确性和效率性。
VM圆拟合结果
image.png
本文圆拟合结果
image.png
算法运行耗时
image.png
可以看出,算法准确性方面,本文提出的算法足以媲美VM;算法效率性方面,在拟合点数为200个点时,本文提出的算法运行耗时稳定在0.23ms内,亦可媲美VM。
当然,能够在一个小小的算法性能上追赶VM,就是小编最值得骄傲的事情啦!小编衷心希望国产品牌能够扬名世界,而我们每个人亦能为国产产品做出自己的贡献与创新,不断突破国外垄断和技术壁垒。

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

【3D系列】2D-3D定位引导算法原理及实现

下一篇
已经是最后一篇啦~
评论请先登录 登录
全部评论 0
Lv.0
0
关注
0
粉丝
0
创作
0
获赞
相关阅读
  • 【2D算法系列】圆拟合算法剖析与硬核实战
    2025-01-06 浏览 0
  • 【3D系列】2D-3D定位引导算法原理及实现
    2024-12-31 浏览 0
  • 浅谈VM的使用技巧篇一
    2025-01-02 浏览 0
  • V社区三周年狂欢,智慧大冒险开启!
    2024-12-26 浏览 0
  • [新功能上线]V学院更新弹幕功能!
    2025-01-13 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器