【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)

应用场景

机器视觉项目应用中,相机安装在机器人上,并且需要定位产品返回坐标偏差以及角度偏差。
与九点标定配合使用,实现精准角度补偿。

算法输入

不共线的三点坐标 A(X₁,Y₁) ,B(X₂,Y₂) ,C(X₃,Y₃)
【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)_第1张图片

算法原理及实现

原理:

由图可知,线OA=OB=OC=外接圆的半径(r),从三点向【以O点为原点的坐标系】做垂线。由勾股定理可得:

(X - X₀)² + (Y - Y₀)² = r ²

由上式带入三点坐标可的可得:
【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)_第2张图片
公式变换可得(由公式①-②,①-③):
【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)_第3张图片
由于上公式可得,该式有唯一解的条件为:
【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)_第4张图片
即任两点组成的斜率不能相等,也验证了三点成圆条件:三点不共线。

实现:

设:
a = 2(X₁ - X₂)
b = 2(Y₁ - Y₂)

c = 2(X₁ - X₃)
d= 2(Y₁ - Y₃)

e = (X₁)² - (X₂)² + (Y₁)² - (Y₂)²
f = (X₁)² - (X₃)² + (Y₃)² - (Y₃)²

代回方程:
【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)_第5张图片

代码实现

 public PointF CalculateCicular(PointF px1, PointF px2, PointF px3)
{
	float x1, y1, x2, y2, x3, y3;
	float a, b, c, g, e, f, X, Y;
	x1 = px1.X;
	y1 = px1.Y;
    x2 = px2.X;
    y2 = px2.Y;
    x3 = px3.X;
    y3 = px3.Y;
    a = 2 * (x1 - x2);
    b = 2 * (y1 - y2);

    c = 2 * (x1 - x3);
    d = 2 * (y1 - y3);
    
    e = x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2;
    f = x1 * x1 - x3 * x3 + y1 * y1 - y3 * y3;
    
    X = (e * d - b * f) / (a * d - b * c);  
    Y = (e * c - a * f) / (b * c - a * d);
    //R = (float)Math.Sqrt((X - x1) * (X - x1) + (Y - y1) * (Y - y1)); //半径

     PointF center = new PointF(X, Y);
     return center;
}

你可能感兴趣的:(视觉知识,视觉检测)