注:在使用opencv拟合圆的过程中使用了亚像素提取边缘轮廓。日后更。。。
opencv实现:
typedef struct Box
{
float x;
float y;
float r;
}Box;
Box TestCenter::circleLeastFit(const std::vector<cv::Point2f> &points) {
Box box;
box.x = 0.0f;
box.y = 0.0f;
box.r = 0.0f;
if (points.size() < 3)
{
return box;
}
int i = 0;
float X1 = 0;
float Y1 = 0;
float X2 = 0;
float Y2 = 0;
float X3 = 0;
float Y3 = 0;
float X1Y1 = 0;
float X1Y2 = 0;
float X2Y1 = 0;
int Sum = points.size();
for (i = 0; i < Sum; i++)
{
X1 = X1 + points[i].x;
Y1 = Y1 + points[i].y;
X2 = X2 + points[i].x*points[i].x;
Y2 = Y2 + points[i].y*points[i].y;
X3 = X3 + points[i].x*points[i].x*points[i].x;
Y3 = Y3 + points[i].y*points[i].y*points[i].y;
X1Y1 = X1Y1 + points[i].x*points[i].y;
X1Y2 = X1Y2 + points[i].x*points[i].y*points[i].y;
X2Y1 = X2Y1 + points[i].x*points[i].x*points[i].y;
}
float C, D, E, G, H, N;
float a, b, c;
N = points.size();
C = N*X2 - X1*X1;
D = N*X1Y1 - X1*Y1;
E = N*X3 + N*X1Y2 - (X2 + Y2)*X1;
G = N*Y2 - Y1*Y1;
H = N*X2Y1 + N*Y3 - (X2 + Y2)*Y1;
a = (H*D - E*G) / (C*G - D*D);
b = (H*C - E*D) / (D*D - G*C);
c = -(a*X1 + b*Y1 + X2 + Y2) / N;
float A, B, R;
A = a / (-2);
B = b / (-2);
R = sqrt(a*a + b*b - 4 * c) / 2;
box.x = A;
box.y = B;
box.r = R;
return box;
}
opencv运行结果:
halcon代码
运行结果: