最小二乘圆拟合
来源:互联网 发布:mac玩lol国服 编辑:程序博客网 时间:2024/05/16 06:41
/***********************************************************************
int fit_circle(CvPoint* points, int num, double * A, double * B, double *R)
Function:polyfit circle
input parameter:
CvPoint* points
int num
double * A
double * B
double *R
output parameter:
0: success
other:error
Date:2013.04.23
Author:LiuYaqiang
***********************************************************************/
int fit_circle(CvPoint* points, int num, double * A, double * B, double *R)
{
int i;
double X1, X2, X3, Y1, Y2, Y3, X1Y1, X1Y2, X2Y1;
double C, D, E, G, H, N;
double a, b,c;
//拟合数据数量判断
if (num < 3){
printf("Error: fit data number is less than 3!\n");
return -1;
}
X1 = X2 = X3 = Y1 = Y2 = Y3 = X1Y1 = X1Y2 = X2Y1 = 0;
for (i = 0; i < num; 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;
}
N = num;
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;
*A = a / (-2);
*B = b / (-2);
*R = sqrt(a * a + b * b - 4 * c) / 2;
//printf("End:a=%f\tb=%f\tc=%f\n",a,b,c);
return 0;
}
int fit_circle(CvPoint* points, int num, double * A, double * B, double *R)
Function:polyfit circle
input parameter:
CvPoint* points
int num
double * A
double * B
double *R
output parameter:
0: success
other:error
Date:2013.04.23
Author:LiuYaqiang
***********************************************************************/
int fit_circle(CvPoint* points, int num, double * A, double * B, double *R)
{
int i;
double X1, X2, X3, Y1, Y2, Y3, X1Y1, X1Y2, X2Y1;
double C, D, E, G, H, N;
double a, b,c;
//拟合数据数量判断
if (num < 3){
printf("Error: fit data number is less than 3!\n");
return -1;
}
X1 = X2 = X3 = Y1 = Y2 = Y3 = X1Y1 = X1Y2 = X2Y1 = 0;
for (i = 0; i < num; 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;
}
N = num;
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;
*A = a / (-2);
*B = b / (-2);
*R = sqrt(a * a + b * b - 4 * c) / 2;
//printf("End:a=%f\tb=%f\tc=%f\n",a,b,c);
return 0;
}
- 最小二乘圆拟合
- 最小二乘拟合
- 最小拟合圆
- 最小二乘拟合
- 多项式最小二次拟合
- 最小二乘拟合
- 什么是最小二乘拟合
- 最小二乘线性拟合
- 最小二乘拟合线
- 最小二乘拟合详解
- 最小二乘线性拟合
- 最小二乘拟合平面
- 最小二乘椭圆拟合
- 非线性最小二乘拟合lsqnonlin和非线性拟合lsqcurvefit
- 用正交多项式做最小二乘拟合
- 非线性最小二乘拟合系统
- opencv最小二成拟合椭圆算法
- 最小二乘拟合空间平面
- 删除/恢复virbr0
- 促进软件开发领域知识与创新的传播-侯明强
- Spring事务配置的五种方式
- JavaScript判断浏览器类型及版本
- 设置ubuntu开机启动数字小键盘
- 最小二乘圆拟合
- 按要求打印两个已排序链表中的元素
- 字典树-----Trie树
- 学习笔记之Runtime类
- nbu 2415 Zero打怪兽
- Aop javacript 实现
- HTML5之FileReader的使用
- 简记c、c++、java异常处理机制的区别
- 黑马学习笔记--关于构造函数