作为全球某机器视觉头部大厂的资深工程师,深感学校和互联网上主要资料局限于计算机视觉领域,能落地工业领域的算法寥寥无几,且相关算法原理语焉不详、乏善可陈,或示例代码缺少关键实现、谬误百出, 故作【庖丁解牛】系列课程,掰开揉碎了讲解机器视觉领域核心算法,并提供完整的高质量代码,力争为从业者提供严格贴近工业应用场景的、高质量的国际一线算法剖析。
本系列课程围绕工业视觉算法原理及实现,具体场景落地应考虑的工程实践化设计要点及经验,笔者将在其他系列课程中讲解。
庖丁解牛本期公开课的主题是 圆拟合。
什么是圆拟合
顾名思义,圆拟合是从给定的点集数据中拟合出一个圆。
定义
通过一堆离散的点,然后根据这些离散点的特点,拟合出一个圆。
特征
- 一堆离散的点,点数大于等于2;
- 离散点的特征,满足几何基元约束;
- 拟合出一个圆,结果一定是个圆。
主流算法
机器视觉(或是计算机视觉)领域,主流的圆拟合算法有:
- 最小二乘法
- 迭代重加权最小二乘法
- 非线性优化法
- 旋转角度法
- 旋转角度最小二乘法
后面两种算法仅用于小角度圆拟合场景,严格意义上讲不属于典型圆拟合范畴,因此本文不做介绍。
最小二乘法(LS)
原理
圆的标准方程为:
( r − a ) 2 + ( c − b ) 2 = R 2 (r-a)^2+(c-b)^2=R^2 (r−a)2+(c−b)2=R2
展开可得:
2 r a + 2 c b − a 2 − b 2 + R 2 = r 2 + c 2 2ra+2cb-a^2-b^2+R^2=r^2+c^2 2ra+2cb−a2−b2+R2=r2+c2
令 q = a 2 + b 2 − R 2 q=a^2+b^2-R^2 q=a2+b2−R2,则有:
[ r 1 ^ 2 + c 1 ^ 2 r 2 ^ 2 + c 2 ^ 2 r n ^ 2 + c n ^ 2 ] = [ 2 r 1 ^ 2 c 1 ^ 1 2 r 2 ^ 2 c 2 ^ 1 2 r n ^ 2 c n ^ 1 ] [ a b q ] \begin{equation} \left[ \begin{array}{c} \hat{r_{1}}^2+\hat{c_{1}}^2 \\ \hat{r_{2}}^2+\hat{c_{2}}^2 \\ \hat{r_{n}}^2+\hat{c_{n}}^2 \end{array} \right]= \left[ \begin{array}{ccc} \hat{2r_{1}} & \hat{2c_{1}} & 1 \\ \hat{2r_{2}} & \hat{2c_{2}} & 1 \\ \hat{2r_{n}} & \hat{2c_{n}} & 1 \end{array} \right] \left[ \begin{array}{c} a \\ b \\ q \end{array} \right] \end{equation}
r1^2+c1^2r2^2+c2^2rn^2+cn^2
=
2r1^2r2