最小二乘椭圆拟合算法实现 opencv
曲线拟合的最小二乘法基于OpenCV实现拟合图像中离散点的拟合直线
曲线拟合的最小二乘法基于OpenCV实现拟合图像中离散点的拟合直线今天使用拟合的最小二乘法,求出了给定的一组坐标系上的点对最接近的直线的。
其具体理论如下:在科学实验数据处理中,往往要根据一组给定的实验数据,求出自变量x与因变量y的函数关系,这是为待定参数,由于观测数据总有误差,且待定参数ai的数量比给定数据点的数量少(即n,m),因此它不同于插值问题.这类问题不要求通过点,而只要求在给定点上的误差的平方和最小.当时,即(5.8.1) 这里是线性无关的函数族,假定在上给出一组数据,以及对应的一组权,这里为权系数,要求使最小,其中(5.8.2)这就是最小二乘逼近,得到的拟合曲线为y=s(x),这种方法称为曲线拟合的最小二乘法.(5.8.2)中实际上是关于的多元函数,求I的最小值就是求多元函数I的极值,由极值必要条件,可得(5.8.3)根据内积定义(见第三章)引入相应带权内积记号(5.8.4) 则(5.8.3)可改写为这是关于参数的线性方程组,用矩阵表示为(5.8.5)(5.8.5)称为法方程.当线性无关,且在点集上至多只有n个不同零点,则称在X上满足Haar条件,此时(5.8.5)的解存在唯一(证明见,3,).记(5.8.5)的解为从而得到最小二乘拟合曲线(5.8.6) 可以证明对,有故(5.8.6)得到的即为所求的最小二乘解.它的平方误差为(5.8.7) 均方误差为在最小二乘逼近中,若取,则,表示为(5.8.8) 此时关于系数的法方程(5.8.5)是病态方程,通常当n?3时都不直接取作为基。
源代码如下:基于OpenCVint calAngle(IplImage **lpSrc, IplImage **lpRes, double* angle) {long double a,b,q;long double u11,u12,u21,u22,c1,c2,p;int i,j;MYPOINT *points = 0;IplImage *src = *lpSrc;IplImage *res = *lpRes;int step = src->widthStep/sizeof(char); //排列的图像行大小,以字节为单位uchar *srcData = (uchar*)src->imageData;int elementCount = 0;MYPOINT tempPoint;MYPOINT *interatorPoint;CvPoint startPoint, endPoint;res = cvCreateImage( cvGetSize(src), 8, 3 );memset(res->imageData, 0x00, (src->width)*(src->height)); u11 = 0.0;u12 = 0.0;u21 = 0.0;u22 = 0.0;c1 = 0.0;c2 = 0.0;p = 0.0;points = (MYPOINT*)malloc((src->height) * sizeof(MYPOINT)); interatorPoint = points;for (j = 0; j < src->height; ++j){for (i = 0; i < src->width; ++i){if (srcData[j*step + i] == 255){tempPoint.x = i;tempPoint.y = j;*interatorPoint = tempPoint;++interatorPoint;++elementCount;break;}}}interatorPoint = points;for (i = 0; i < elementCount; i++)//列法方程{if (0 == i){startPoint.x = (*interatorPoint).x;startPoint.y = (*interatorPoint).y;}u11+=1.0;u12+=(*interatorPoint).x;u22+=(*interatorPoint).x*(*interatorPoint).x;c1+=(*interatorPoint).y;c2+=(*interatorPoint).y*(*interatorPoint).x;++interatorPoint;//printf("##:%d:/t %lf, %lf, %lf, %lf, %lf%\n", i, u11, u12, u22, c1, c2);}u21=u12;a=(c1*u22-c2*u12)*1.0/(u11*u22-u12*u21);//求a,b的解b=(c1*u21-c2*u11)*1.0/(u21*u12-u22*u11);interatorPoint = points;for(i = 0; i < elementCount; i++){(*interatorPoint).z=a+b*(*interatorPoint).x;p+=pow(((*interatorPoint).z-(*interatorPoint).y),2);++interatorPoint;}q=sqrt(p);//输出线性方程printf("answer:s(x)=%lf+%lf(x)\n",a,b);endPoint.y = src->height - 1;endPoint.x = ( endPoint.y -a ) / b;printf("endPoint:%d, %d\n", endPoint.x, endPoint.y);//输出均方误差printf("均方误差:q=%lf\n",q);*angle = atan(b);printf("Angle is: %f", *angle*180.0/PI);cvLine(res, startPoint, endPoint, CV_RGB(0,255,0), 1, 8 ); cvReleaseImage(lpRes);*lpRes = res;free(points);return 0;}拟合后的结果如下:其中左边是离散的一些点,右边绿色的线是拟合后的直线。
opencv最小二乘法拟合曲线
opencv最小二乘法拟合曲线
OpenCV是一个流行的计算机视觉库,可以用于各种图像和视频处理任务。
其中一个强大的功能是使用最小二乘法拟合曲线。
最小二乘法是一种数学技术,用于找到最适合一组数据的线性模型。
在OpenCV中,可以使用cv::fitLine函数来实现最小二乘法拟合。
该函数需要传递一组数据点的坐标数组,以及一个输出的向量来存储拟合线的参数。
这些参数包括斜率、截距和线上任意一点的坐标。
使用此函数可以拟合各种类型的曲线,包括直线、二次曲线和多项式曲线等。
该功能可用于许多应用程序,例如图像分析、物体跟踪和机器人控制等。
在使用OpenCV进行最小二乘法拟合时,需要了解一些基本的数学知识,例如线性代数和统计学。
但是,一旦掌握了这些技能,就可以使用OpenCV轻松地创建强大的图像和视频处理应用程序。
- 1 -。
(完整版)最小二乘法拟合椭圆附带matlab程序
最小二乘法拟合椭圆设平面任意位置椭圆方程为:x 2+Axy +By 2+Cx +Dy +E =0设P i (x i ,y i )(i =1,2,…,N )为椭圆轮廓上的N (N ≥5) 个测量点,依据最小二乘原理,所拟合的目标函数为:F (A,B,C,D,E )=∑(x i 2+Ax i y i +By i 2+Cx i +Dy i +E)2Ni=1欲使F 为最小,需使∂F ∂A =∂F ∂B =∂F ∂C =∂F ∂D =∂F ∂E=0 由此可以得方程:[ ∑x i 2y i 2∑x i y i 3∑x i 2y i ∑x i y i 2∑x i y i ∑x i y i 3∑y i 4∑x i y i 2∑y i 3∑y i 2∑x i 2y i ∑x i y i 2∑x i 3∑x i y i ∑x i ∑x i y i 2∑y i 3∑x i y i ∑y i 2∑y i 2∑x i y i ∑y i 2∑x i ∑y i N ] [ A B C D E ] =-[∑x i 3y i ∑x i 2y i 2∑ x i 3∑x i 2y i ∑ x i 2] 解方程可以得到A ,B ,C ,D ,E 的值。
根据椭圆的几何知识,可以计算出椭圆的五个参数:位置参数(θ,x 0,y 0)以及形状参数(a,b )。
x 0=2BC−ADA 2−4By 0=2D −AD A 2−4Ba =√2(ACD −BC 2−D 2+4BE −A 2E )(A 2−4B )(B −√A 2+(1−B 2)+1)b =√2(ACD −BC 2−D 2+4BE −A 2E )(A 2−4B )(B +√A 2+(1−B 2)+1)θ=tan−1√a 2−b 2B a 2B −b 2附:MATLAB程序function [semimajor_axis, semiminor_axis, x0, y0, phi] = ellipse_fit(x, y)%% Input:% x —— a vector of x measurements% y ——a vector of y measurements%% Output:%semimajor_axis—— Magnitude of ellipse longer axis%semiminor_axis—— Magnitude of ellipse shorter axis%x0 ——x coordinate of ellipse center%y0 ——y coordinate of ellipse center%phi——Angle of rotation in radians with respect to x-axis%% explain% 2*b'*x*y + c'*y^2 + 2*d'*x + 2*f'*y + g' = -x^2% M * p = b M = [2*x*y y^2 2*x 2*y ones(size(x))],% p = [b c d e f g] b = -x^2.% p = pseudoinverse(M) * b.x = x(:);y = y(:);%Construct MM = [2*x.*y y.^2 2*x 2*y ones(size(x))];% Multiply (-X.^2) by pseudoinverse(M)e = M\(-x.^2);%Extract parameters from vector ea = 1;b = e(1);c = e(2);d = e(3);f = e(4);g = e(5);%Use Formulas from Mathworld to find semimajor_axis, semiminor_axis, x0, y0, and phi delta = b^2-a*c;x0 = (c*d - b*f)/delta;y0 = (a*f - b*d)/delta;phi = 0.5 * acot((c-a)/(2*b));nom = 2 * (a*f^2 + c*d^2 + g*b^2 - 2*b*d*f - a*c*g);s = sqrt(1 + (4*b^2)/(a-c)^2);a_prime = sqrt(nom/(delta* ( (c-a)*s -(c+a))));b_prime = sqrt(nom/(delta* ( (a-c)*s -(c+a))));semimajor_axis = max(a_prime, b_prime); semiminor_axis = min(a_prime, b_prime); if (a_prime < b_prime)phi = pi/2 - phi;end欢迎交流:邮箱:*****************。
最小二乘椭圆拟合算法实现opencv
最小二乘椭圆拟合算法实现opencv椭圆的目标函数:F(A,B,C,D,E) = XiGeMa(xi^2 + A*xiyi+B*yi^2+C*xi+D*yi+E)^2分别对A,B,C,D,E 求一阶偏导并令其等于0得到线性方程组:|A1 B1 C1 D1 E1 | |A| = |resul1||A2 B2 C2 D2 E2 | |B| = |resul2||A3 B3 C3 D3 E3 | |C| = |resul3||A4 B4 C4 D4 E4 | |D| = |resul4||A5 B5 C5 D5 E5 | |E| = |resul5|求得A,B,C,D,E.椭圆的五个参数:center.x = (2*B*C - A*D) /(A*A-4*B);center.y = (2*D-A*D)/(A*A-4*B);fenzi = 2*(A*C*D-B*C*C-D*D+4*E*B-A*A*E);fenmu =(A*A-4*B) * (B- sqrt(A*A+ (1-B) * (1-B) ) +1);femmu2 =(A*A-4*B) * (B+ sqrt(A*A+ (1-B) * (1-B) ) +1);long =sqrt(fabs(fenzi/fenmu));short =sqrt(fabs(fenzi/femmu2));theta = atan(sqrt((center.x *center.x -center.y*center.y*B)/(center.x *center.x *B-center.y*center.y))+0.0001)*180/cv_pi;;vector<double> getEllipsepar(vector<CvPoint> vec_point){vector<double> vec_result;double x3y1 = 0,x1y3= 0,x2y2= 0,yyy4= 0, xxx3= 0,xxx2= 0,x2y1= 0,yyy3= 0,x1y2= 0 ,yyy2= 0,x1y1= 0,xxx1= 0,yyy1= 0;int N = vec_point.size();for (int m_i = 0;m_i < N ;++m_i ){double xi = vec_point[m_i].x ;double yi = vec_point[m_i].y;x3y1 += xi*xi*xi*yi ;x1y3 += xi*yi*yi*yi;x2y2 += xi*xi*yi*yi; ;yyy4 +=yi*yi*yi*yi;xxx3 += xi*xi*xi ;xxx2 += xi*xi ;x2y1 += xi*xi*yi;x1y2 += xi*yi*yi;yyy2 += yi*yi;x1y1 += xi*yi;xxx1 += xi;yyy1 += yi;yyy3 += yi*yi*yi;}long double resul1 = -(x3y1);long double resul2 = -(x2y2);long double resul3 = -(xxx3);long double resul4 = -(x2y1);long double resul5 = -(xxx2);long double B1 = x1y3, C1 = x2y1, D1 = x1y2, E1 = x1y1, A1 = x2y2; long double B2 = yyy4, C2 = x1y2, D2 = yyy3, E2 = yyy2, A2 = x1y3; long double B3 = x1y2, C3 = xxx2, D3 = x1y1, E3 = xxx1, A3 = x2y1; long double B4 = yyy3, C4 = x1y1, D4 = yyy2, E4 = yyy1, A4 = x1y2; long double B5 = yyy2, C5 = xxx1, D5 = yyy1, E5 = N, A5 = x1y1;//CvMat* Ma = cvCreateMat(5,5,CV_64FC1);CvMat* Md = cvCreateMat(5,1,CV_64FC1);CvMat* Mb = cvCreateMat(5,1,CV_64FC1);//cvmSet(Mb,0,0,resul1);cvmSet(Mb,1,0,resul2);cvmSet(Mb,2,0,resul3);cvmSet(Mb,3,0,resul4);cvmSet(Mb,4,0,resul5);cvmSet(Ma,0,0,A1);cvmSet(Ma,0,1,B1);cvmSet(Ma,0,2,C1);cvmSet(Ma,0,3,D1);cvmSet(Ma,0,4,E1);cvmSet(Ma,1,0,A2);cvmSet(Ma,1,1,B2);cvmSet(Ma,1,2,C2);cvmSet(Ma,1,3,D2);cvmSet(Ma,1,4,E2);cvmSet(Ma,2,0,A3);cvmSet(Ma,2,1,B3);cvmSet(Ma,2,2,C3);cvmSet(Ma,2,3,D3);cvmSet(Ma,2,4,E3);cvmSet(Ma,3,0,A4);cvmSet(Ma,3,1,B4);cvmSet(Ma,3,2,C4);cvmSet(Ma,3,3,D4);cvmSet(Ma,3,4,E4);cvmSet(Ma,4,0,A5);cvmSet(Ma,4,1,B5);cvmSet(Ma,4,2,C5);cvmSet(Ma,4,3,D5); cvmSet(Ma,4,4,E5);cvSolve(Ma, Mb, Md);long double A = cvmGet(Md,0,0);long double B = cvmGet(Md,1,0);long double C = cvmGet(Md,2,0);long double D = cvmGet(Md,3,0);long double E = cvmGet(Md,4,0);double XC = (2*B*C - A*D) /(A*A-4*B);double YC =(2*D-A*D)/(A*A-4*B);long double fenzi = 2*(A*C*D-B*C*C-D*D+4*E*B-A*A*E);long double fenmu =(A*A-4*B) * (B- sqrt(A*A+ (1-B) * (1-B) ) +1);long double femmu2 =(A*A-4*B) * (B+ sqrt(A*A+ (1-B) * (1-B) ) +1);double XA =sqrt(fabs(fenzi/fenmu));double XB =sqrt(fabs(fenzi/femmu2));double Xtheta =atan(sqrt((XA*XA-XB*XB*B)/(XA*XA*B-XB*XB))+0.0001)*180/3.1415926;vec_result.push_back(XC);vec_result.push_back(YC);vec_result.push_back(XA);vec_result.push_back(XB);vec_result.push_back(Xtheta);return vec_result;}。
cv椭圆拟合算法
cv椭圆拟合算法摘要:1.椭圆拟合算法概述2.CV 椭圆拟合算法的原理3.CV 椭圆拟合算法的应用实例4.CV 椭圆拟合算法的优缺点正文:1.椭圆拟合算法概述椭圆拟合算法是一种在计算机视觉中广泛应用的算法,主要用于处理图像中的椭圆形状。
椭圆形状在自然界和人工制品中都有广泛的存在,例如,眼睛、车轮、卫星轨道等。
椭圆拟合算法的目的是通过图像中椭圆形状的特征点,对椭圆进行参数化表示,从而实现对图像的精确描述和分析。
2.CV 椭圆拟合算法的原理CV 椭圆拟合算法,即在OpenCV 库中实现的椭圆拟合算法,主要基于最小二乘法原理。
最小二乘法是一种数学优化技术,其基本思想是通过最小化误差的平方和来寻找最佳拟合函数。
在椭圆拟合中,最小二乘法用于寻找最佳的椭圆参数,即长轴、短轴和旋转角度等。
具体来说,CV 椭圆拟合算法通过计算图像中椭圆形状上特征点的误差平方和,来优化椭圆参数,使其最小化。
为了提高算法的稳定性和精度,通常需要在计算过程中加入一定的权重,以平衡不同特征点的影响。
3.CV 椭圆拟合算法的应用实例CV 椭圆拟合算法在计算机视觉领域有广泛的应用,例如:(1)图像处理:在图像中检测和分析椭圆形状,可以应用于目标识别、图像分割等任务。
(2)物体跟踪:通过对运动物体的椭圆形状进行拟合,可以实现对物体的运动轨迹跟踪。
(3)人脸识别:在人脸识别中,眼睛的椭圆形状是一个重要的特征。
通过对眼睛的椭圆形状进行拟合,可以提取出特征点,用于人脸识别和比对。
4.CV 椭圆拟合算法的优缺点CV 椭圆拟合算法具有以下优缺点:(1)优点:- 算法简单,易于实现,计算复杂度较低。
- 对椭圆形状的拟合精度较高,适用于多种场景。
- 可以灵活地调整拟合参数,以适应不同图像特征。
(2)缺点:- 对噪声敏感,当图像质量较差时,拟合精度可能受到影响。
- 在处理复杂背景和多目标情况下,可能存在误检和漏检等问题。
最小二乘法拟合椭圆附带matlab程序
最小二乘法拟合椭圆设平面任意位置椭圆方程为:x 2 + Axy + By 2 + Cx + Dy + E = 0设 P i ( x i ,y i )( i = 1,2, ,N) 为椭圆轮廓上的 N( N ≥ 5 ) 个测量点, 依据最小二乘原理, 所拟合的目标函数为:N2F( A,B, C,D, E) = ∑ (x i2+ Ax i y i + By i 2+ Cx i + Dy i+ E)i=1欲使 F 为最小,需使F ?F?F ?F =?F?A===?D= 0?B?C?E由此可以得方程:∑ x i 2y i 2 ∑ x i y i 3∑ x i 2y i ∑ x i y i 2∑ x i y i∑ x i 3 y i34232A 2 2∑x i yi∑ y i∑x i yi∑ y i∑ y i∑ x i y i ∑ x i 2y∑ x i y2∑ x i3∑ x i y∑ x iB∑ x i 3iiC =-iD∑ x i y i2∑ y i 3∑ y i2∑ y i2 ∑ x i 2y i∑ x i y i[ E ][ ∑ x i y i∑ y i 2 ∑ x i ∑ y iN ] [ ∑ x i2]解方程可以得到A ,B ,C ,D ,E 的值。
根据椭圆的几何知识,可以计算出椭圆的五个参数:位置参数(θ,x 0, y 0 )以及形状参数( a, b) 。
x 0 =2BC-ADA 2 -4By 0 2D - A D=4BA 2-(2 - D 2 + 4BE- A 2 )a = √ 2- 4B) (B - 2B 2)+ 1)( A √A + (1-2 ( ACD -2 -D 2+ 4BE- A 2 )b = √ 2- 4B) (B + 2(1 - B 2)+ 1)( A √A +θ= tan-1√a 2 - b 2Ba 2 B -b 2附: MATLAB程序function [semimajor_axis, semiminor_axis, x0, y0, phi] = ellipse_fit(x, y)%%Input:%x —— a vector of x measurements%y —— a vector of y measurements%%Output:%semimajor_axis —— Magnitude of ellipse longer axis%semiminor_axis —— Magnitude of ellipse shorter axis%x0 —— x coordinate of ellipse center%y0 —— y coordinate of ellipse center%phi—— Angle of rotation in radians with respect to x-axis%%explain%2*b'*x*y + c'*y^2 + 2*d'*x + 2*f'*y + g' = -x^2%M * p = b M = [2*x*y y^2 2*x 2*y ones(size(x))],% p = [b c d e f g] b = -x^2.%p = pseudoinverse(M) * b.x = x(:);y = y(:);%Construct MM = [2*x.*y y.^2 2*x 2*y ones(size(x))];%Multiply (-X.^2) by pseudoinverse(M)e = M\(-x.^2);%Extract parameters from vector ea = 1;b = e(1);c = e(2);d = e(3);f = e(4);g = e(5);%Use Formulas from Mathworld to find semimajor_axis, semiminor_axis, x0, y0, and phidelta = b^2-a*c;x0 = (c*d - b*f)/delta;y0 = (a*f - b*d)/delta;phi = 0.5 * acot((c-a)/(2*b));nom = 2 * (a*f^2 + c*d^2 + g*b^2 - 2*b*d*f - a*c*g);s = sqrt(1 + (4*b^2)/(a-c)^2);a_prime = sqrt(nom/(delta* ( (c-a)*s -(c+a))));b_prime = sqrt(nom/(delta* ( (a-c)*s -(c+a))));semimajor_axis = max(a_prime, b_prime); semiminor_axis = min(a_prime, b_prime); if(a_prime < b_prime)phi = pi/2 - phi;end。
opencvpython拟合的椭圆的拟合系数
opencvpython拟合的椭圆的拟合系数一、引言本文将介绍OpenCV Python库中椭圆拟合的相关知识,包括椭圆拟合的原理和方法,以及如何获取椭圆拟合系数。
椭圆拟合是图像处理中常用的技术之一,能够对图像中的椭圆进行精确的拟合,为后续处理提供了很大的便利。
二、椭圆拟合原理椭圆是一个具有两个焦点和一条固定长度的轴线的几何形状。
在图像处理中,我们需要找到这个几何形状,并将其转换为数学模型。
通常使用最小二乘法来求解拟合系数。
最小二乘法是一种优化方法,用于寻找使误差平方和最小化的参数。
在椭圆拟合中,我们需要通过最小二乘法来求解椭圆参数(长轴、短轴、旋转角度等)。
三、椭圆拟合方法在OpenCV Python库中实现了多种方法来进行椭圆拟合。
其中最常用的是cv2.fitEllipse()函数。
cv2.fitEllipse()函数接受一个包含点集坐标的数组作为输入,并返回一个包含长轴、短轴、旋转角度等参数的元组。
下面是一个简单的例子:```pythonimport cv2# 读取图像img = cv2.imread('image.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用Canny算法检测边缘edges = cv2.Canny(gray, 50, 150)# 查找轮廓contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 绘制椭圆拟合结果for cnt in contours:if len(cnt) >= 5:ellipse = cv2.fitEllipse(cnt)img = cv2.ellipse(img, ellipse, (0,255,0), 2)cv2.imshow('image', img)cv2.waitKey(0)cv2.destroyAllWindows()```在这个例子中,我们首先读取了一张图像,并使用Canny算法检测边缘。
c++ 最小二乘法拟合椭圆方程
C++最小二乘法拟合椭圆方程椭圆是数学中的一个重要概念,它在几何学、物理学、工程学等领域都有着广泛的应用。
在实际的问题中,我们经常需要对给定的椭圆数据进行拟合,以找到与其最符合的椭圆方程。
而在C++编程中,最小二乘法是求解拟合问题的一种常用方法。
本文将介绍如何利用C++语言实现最小二乘法拟合椭圆方程的过程。
一、最小二乘法原理1. 概念介绍最小二乘法是一种数学优化方法,用于对一组数据进行曲线拟合。
其核心思想是通过最小化实际观测值与拟合值之间的误差平方和来确定拟合参数的取值,从而使拟合曲线尽可能地接近实际观测值。
在椭圆拟合问题中,最小二乘法可以帮助我们找到与给定数据最匹配的椭圆方程。
2. 公式推导假设我们有一组椭圆数据点(xi, yi),我们需要找到一个椭圆方程,使得数据点到椭圆边界的距离之和最小。
椭圆方程的一般形式为:(x - x0)^2 / a^2 + (y - y0)^2 / b^2 = 1其中,(x0, y0)为椭圆中心坐标,a和b分别为长轴和短轴的长度。
我们可以建立参数方程表示椭圆上的点:x = x0 + a * cos(t)y = y0 + b * sin(t)将数据点(xi, yi)代入方程,可以得到误差函数:E = Σ[(x - xi)^2 / a^2 + (y - yi)^2 / b^2 - 1]^2其中,Σ表示求和符号,E表示误差平方和。
通过最小化误差函数E,可以求得参数x0, y0, a, b的最优解,从而得到最符合给定数据的椭圆方程。
二、C++代码实现1. 数据输入我们需要从外部读入椭圆数据点(xi, yi),并存储到数组或向量中,以备后续处理。
2. 参数优化接下来,我们可以使用最小二乘法对椭圆方程的参数进行优化。
C++中可以通过梯度下降法、牛顿法等数值优化算法来求解最小化误差函数的过程,从而得到最优的椭圆参数。
3. 结果输出我们可以将优化后的椭圆方程参数输出,得到拟合结果。
opencv椭圆拟合 返回值
OpenCV椭圆拟合介绍OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。
其中,椭圆拟合是OpenCV中的一个重要功能,可以用于识别和拟合图像中的椭圆形状。
本文将介绍OpenCV椭圆拟合的原理、使用方法以及相关的应用场景和案例。
原理椭圆拟合是指通过一组离散的二维点,拟合出一个最优的椭圆模型。
在OpenCV中,椭圆拟合主要基于最小二乘法和非线性优化算法实现。
具体而言,OpenCV的椭圆拟合算法主要包括以下步骤: 1. 预处理:对输入图像进行边缘检测,获取图像中的边缘点。
2. 椭圆拟合:根据边缘点,使用最小二乘法拟合出一个初始的椭圆模型。
3. 非线性优化:通过非线性优化算法,进一步优化椭圆模型,使其更加贴合实际情况。
4. 输出结果:返回拟合后的椭圆参数,包括椭圆的中心坐标、长轴和短轴长度、旋转角度等。
使用方法使用OpenCV进行椭圆拟合需要以下步骤: 1. 导入库:首先需要导入OpenCV库,并进行相关的初始化。
import cv2import numpy as np# 初始化OpenCVcv2.init()2.加载图像:使用cv2.imread()函数加载待处理的图像。
# 加载图像image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)3.边缘检测:对图像进行边缘检测,获取边缘点。
# 边缘检测edges = cv2.Canny(image, 100, 200)4.椭圆拟合:使用cv2.fitEllipse()函数拟合椭圆。
# 椭圆拟合ellipse = cv2.fitEllipse(edges)5.绘制结果:将拟合的椭圆绘制到原图像上。
# 绘制椭圆cv2.ellipse(image, ellipse, (0, 255, 0), 2)# 显示结果cv2.imshow('Result', image)cv2.waitKey(0)cv2.destroyAllWindows()应用场景椭圆拟合在计算机视觉和图像处理领域有着广泛的应用。
一种基于最小二乘的不完整椭圆拟合算法
一种基于最小二乘的不完整椭圆拟合算法
邹益民;汪渤
【期刊名称】《仪器仪表学报》
【年(卷),期】2006(27)7
【摘要】研究了一种基于最小二乘的不完整椭圆拟合算法。
基于几何距离的拟合算法可达到较高的拟合精度,但迭代过程敏感于初始条件;由于不完整的椭圆样本点及噪声的存在,简单线性拟合方法可能使拟合结果退化为开放的双曲线,引起拟合失败,基于椭圆约束的代数距离拟合方法可保证拟合结果一定是椭圆,从而为迭代提供适当的初值;利用多个待估计椭圆参数之间的相互约束,即使非常短的椭圆弧也可得到稳定的拟合结果。
仿真结果与实际图像应用验证了算法的有效性。
【总页数】5页(P808-812)
【关键词】最小二乘拟合;曲线拟合;椭圆拟合
【作者】邹益民;汪渤
【作者单位】北京理工大学信息技术学院自动控制系
【正文语种】中文
【中图分类】O241.5
【相关文献】
1.基于最小二乘法的椭圆拟合改进算法研究 [J], 陈若珠;孙岳
2.基于最小二乘法的椭圆拟合改进算法 [J], 闫蓓;王斌;李媛
3.基于边界的最小二乘椭圆拟合改进算法 [J], 王万国;王仕荣;徐正飞;杨文波;王振
利;李丽
4.基于对称性的最小二乘拟合随机椭圆检测算法 [J], 吕洪赫;姚振杰;易卫东
5.基于最小二乘法椭圆拟合的改进型快速算法 [J], 朱森荣;刘杰徽
因版权原因,仅展示原文概要,查看原文内容请购买。
最小二乘法求椭圆拟合特征值为负
最小二乘法求椭圆拟合特征值为负最小二乘法是一种常用的数据拟合方法,可以用于解决椭圆拟合问题。
椭圆是一种非常常见的几何形状,它可以用一组参数来描述,包括椭圆的长半轴、短半轴、中心坐标等。
如果给定了一组离散点,我们可以通过最小二乘法来拟合出一个椭圆,使得拟合出的椭圆与这组离散点的误差最小。
最小二乘法的思路是:我们假设椭圆的参数已知,然后计算每个离散点到椭圆的距离。
我们希望找到最优的参数,使得这些距离的平方和最小化。
下面我们将详细介绍椭圆拟合的最小二乘法的计算过程。
首先,我们需要给出椭圆的参数化方程。
对于一个标准的椭圆,其参数化方程可以写为:x = xc + a * cos(t)y = yc + b * sin(t)其中,(xc, yc)为椭圆的中心坐标,a为长半轴长度,b为短半轴长度,t为参数。
然后,我们假设已经有一组离散点(xi, yi),我们需要找到最优的椭圆参数,使得拟合出的椭圆与这些离散点的误差最小。
假设误差函数为E(a, b, xc, yc),我们的目标是最小化E(a, b, xc, yc)。
误差函数的定义可以有多种定义方式,但在椭圆拟合中,一种常用的误差函数定义如下:E(a, b, xc, yc) = Σ[ (xi - (xc + a * cos(ti)))^2 + (yi - (yc + b * sin(ti)))^2 ]其中,Σ表示对所有离散点求和,(xi, yi)为离散点的坐标,ti 为离散点对应的参数。
接下来,我们将误差函数E(a, b, xc, yc)关于椭圆参数a、b、xc、yc分别求偏导数,并令其为0,求出最优的椭圆参数。
∂E/∂a = 0∂E/∂b = 0∂E/∂xc = 0∂E/∂yc = 0对于这四个方程组,我们可以通过数值计算的方法求解最优解。
在求解的过程中,可能会出现特征值为负的情况。
特征值为负的意思是说,相应的解会导致误差函数增加,这意味着椭圆不能很好地拟合数据。
opencv 最小二乘法 python 拟合球
标题:使用 Python 中的 OpenCV 库进行球体拟合的最小二乘法摘要:本文将介绍如何使用 Python 中的 OpenCV 库进行球体拟合的最小二乘法。
通过最小二乘法,我们可以准确地拟合球体的位置和半径,这对于计算机视觉和图像处理领域具有重要意义。
关键词:OpenCV、最小二乘法、Python、球体拟合一、背景介绍随着计算机视觉和图像处理领域的发展,对于物体的三维重建和定位成为了一个热门的研究方向。
而在这个过程中,对于球体定位和拟合问题成为了一个重要的问题。
球体拟合是指通过已知的点云数据,拟合出一个最优的球体模型,以描述点云数据的分布规律。
最小二乘法是一种常用的拟合方法,它可以通过最小化误差的方式得到最优的拟合结果。
二、OpenCV 库介绍OpenCV 是一个开源计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,包括图像拟合、目标检测、特征匹配等。
在Python 中,我们可以使用 OpenCV 库来进行球体拟合的最小二乘法。
三、球体拟合的最小二乘法原理最小二乘法是一种通过最小化残差平方和来得到最优拟合结果的方法。
对于球体拟合问题,我们可以根据已知的点云数据,构建一个球体模型,并通过最小化点到球体表面的距离的平方和,来得到球体的位置和半径。
具体的求解过程可以利用数学工具进行推导和解决。
四、使用 Python 和 OpenCV 进行球体拟合在 Python 中,我们可以利用 OpenCV 库提供的函数来进行球体拟合的最小二乘法。
我们需要加载点云数据,并将其转换成适合 OpenCV 库使用的格式。
我们可以调用 OpenCV 提供的函数来进行最小二乘法拟合,得到球体的位置和半径。
我们可以将拟合结果可视化,并进行进一步的分析和应用。
五、实例演示为了更具体地演示如何使用 Python 和 OpenCV 进行球体拟合的最小二乘法,我们这里给出一个简单的实例。
假设我们有一组球体表面的点云数据,我们希望通过最小二乘法找到这个球体的位置和半径。
opencv最小二乘法拟合圆
opencv最小二乘法拟合圆OpenCV是一个开放源码的跨平台计算机视觉库,它可以用于图像处理、机器视觉技术等多种应用程序。
它的核心算法是基于机器学习的,可以自动识别、分析和处理图像,从而实现一些功能,如人脸识别等。
本文主要介绍OpenCV中的最小二乘法拟合圆的方法,介绍如何使用它们来识别和拟合图像中的圆。
2. OpenCV最小二乘法拟合圆OpenCV中的最小二乘法拟合圆可以用来实现对图像中圆的检测和拟合。
基本思想:(1)首先,需要使用边缘检测算法(Hough变化)来获得具有可能的圆心坐标;(2)然后,使用最小二乘法来拟合每个圆;(3)最后,计算拟合的椭圆的方程,得到最终的圆拟合结果。
最小二乘法是一种数值方法,通过最小化误差来得到最佳拟合的参数。
它可以用于拟合线性模型和非线性模型,如拟合圆。
假设存在N个观测数据,其形式为:(x1,y1), (x2,y2),…,(xn,yn)其中,xk(k=1,2,…,n)表示观测数据的横坐标,yk表示观测数据的纵坐标。
拟合圆的方程一般形式为:(x-x0)^2+(y-y0)^2 = r^2其中, (x0,y0) 表示圆心坐标,r表示圆的半径。
拟合过程如下:(1)给出一个初始圆参数 (x0,y0,r)(2)根据已知点,计算残差:residual[i] = (x[i]-x0)^2 + (y[i]-y0)^2 - r^2 (3)计算残差的平方和:sum = 0for i=0 to N-1sum = sum + residual[i]^2;(4)使用最小二乘法迭代圆的参数(x0,y0,r), 直至误差最小。
3. 实际应用OpenCV最小二乘法拟合圆的方法可以用于识别图像中的圆。
它可以自动检测边缘,并使用最小二乘法来拟合圆,从而更有效的识别图像中的圆。
应用实例:给定一幅图像,需要检测出图像中的圆,并获取圆的圆心坐标和半径,可以使用最小二乘法拟合圆来实现:(1)首先,使用边缘检测算法(如Hough变换)检测出可能的圆心坐标;(2)然后,使用最小二乘法拟合每个候选圆;(3)最后,计算拟合的椭圆的方程,得到最终的圆拟合结果。
一种基于最小二乘的不完整椭圆拟合算法
(
)
* "& $& 坐标系下, 椭圆方程可写作: ( ( !, #, " )( ( & ’ & & ! # 2 * )( $ ; 显然, ) ) 与 ) ) @ 的连线与在 ) ) @ 处椭圆的法 线方向平行, 即8( D ( ) ) 2 ))( $ , 从而有: 0 ( !, #, )) , ))( ! !
第%& 卷
$ $
!" ! !# ’ ! ( $ ( $%) ! # ! ) " ’ # ! ) !!# 9$ 9( "’ (’ (" ) ’ ) # 9 ( $ ’ $ &) 9# ( ( ’ ( &%)
(*)
[ &] $ $ 不难导出 :
( "1 )
$ $
(
# #
# #
" #
# "
( ( ) & % ( )# ) ( $ & % ( $# )
(
(
Hale Waihona Puke $ $9* ’ 9( $
# ( "% &
%
# # % ’%
)
( "% &1
)
# #
(0) ( "# )
$# 实验结果
$" %# 仿真数据 $ $ 考虑两个同心椭圆, 参数分别为: #" ’ [ %# , !, 7 7 2: , :2 , "%2 ] $ #% ’ [ %* , %# , 2: , :2 , *2 ] , 样本点由 上述椭圆采样而成, 每个椭圆样本点数取为 "# 个。 对样本点进行 / ’ "## 次椭圆拟合, 并对椭圆 " 拟 合所得的各组参数依据下式计算方差:
基于最小二乘的椭圆拟合及其FPGA实现
基于最小二乘的椭圆拟合及其FPGA实现
曾垣燊;吕勇;刘力双;夏润秋
【期刊名称】《激光杂志》
【年(卷),期】2024(45)2
【摘要】针对现有的基于FPGA平台实现的最小二乘椭圆拟合算法中线性方程求解输出时延较大的问题,采用Cholesky分解法解线性方程,并对Cholesky分解中的平方根求解,运用单向旋转、合并迭代、迭代次数可调等手段,提出了一种基于CORDIC算法的迭代自适应的平方根求解结构。
实验结果表明,改进的平方根求解算法对缩短Cholesky分解输出时延有良好的效果,Cholesky分解在FPGA平台相较于现有的LDLT分解法实现63.26%的速度提升;椭圆拟合算法在保证输出绝对误差小于0.1 pixel的情况下,FPGA平台相对于计算机软件实现了1000倍以上的速度提升,适合实时性要求较高的应用场合。
【总页数】6页(P85-90)
【作者】曾垣燊;吕勇;刘力双;夏润秋
【作者单位】北京信息科技大学仪器科学与光电工程学院
【正文语种】中文
【中图分类】TN791
【相关文献】
1.基于最小二乘法的椭圆拟合改进算法研究
2.基于最小二乘法椭圆拟合在心音识别中的应用研究
3.基于整体最小二乘的椭圆拟合方法
4.基于最小二乘法椭圆拟合的改进型快速算法
5.基于最小二乘椭圆拟合改进算法的磁力计校正
因版权原因,仅展示原文概要,查看原文内容请购买。
基于整体最小二乘的椭圆拟合方法
基于整体最小二乘的椭圆拟合方法
熊风光;李希;韩燮
【期刊名称】《微电子学与计算机》
【年(卷),期】2017(34)1
【摘要】针对传统椭圆拟合方法中存在的无法剔除噪声点并且参数误差较大的缺陷,提出了一种基于随机采样一致性、约束条件及整体最小二乘的椭圆拟合改进算法.该方法首先根据椭圆的性质,利用随机采样一致性剔除噪声点,再利用基于约束条件的整体最小二乘法,对去噪之后的数据进行椭圆拟合.实验证明,随机采样一致算法能很好地去除噪声,并且跟传统最小二乘法的拟合结果相比较可以看出,改进之后的拟合方法拟合出的椭圆参数精度更高.
【总页数】4页(P102-105)
【关键词】椭圆拟合;噪声点;随机采样一致;约束条件;整体最小二乘
【作者】熊风光;李希;韩燮
【作者单位】中北大学计算机与控制工程学院
【正文语种】中文
【中图分类】TP301.6
【相关文献】
1.基于最小二乘椭圆拟合的井径测量面偏角修正方法 [J], 刘春光;刘树林;袁率
2.一种新的基于直接最小二乘椭圆拟合的肤色检测方法 [J], 高建坡;王煜坚;杨浩;吴镇扬
3.椭圆拟合的非线性最小二乘方法 [J], 安新源;周宗潭;胡德文
4.用最小二乘正交距离方法拟合双同心椭圆弧 [J], 张庆丰;彭青玉
5.基于最小二乘法的椭圆拟合实时航迹矢量化方法 [J], 薛成;张晓娜;耿笑寒;叶子因版权原因,仅展示原文概要,查看原文内容请购买。
opencv最小二乘法
opencv最小二乘法
OpenCV最小二乘法是一种常用的数学方法,用于解决线性回归问题。
在计算机视觉和图像处理领域,最小二乘法被广泛应用于图像处理、目标跟踪、图像分割等方面。
最小二乘法是一种通过最小化误差平方和来拟合数据的方法。
在OpenCV中,最小二乘法可以通过cv::solve函数来实现。
该函数可以求解线性方程组的解,其中方程组的系数矩阵为A,常数矩阵为B。
最小二乘法的目标是找到一个向量x,使得Ax=B的误差平方和最小。
在OpenCV中,最小二乘法可以用于解决多种问题。
例如,可以使用最小二乘法来拟合一条直线,使得该直线能够最好地拟合给定的数据点。
此外,最小二乘法还可以用于解决非线性回归问题,例如拟合一个二次曲线或指数曲线。
最小二乘法在计算机视觉和图像处理领域中的应用非常广泛。
例如,在目标跟踪中,可以使用最小二乘法来估计目标的位置和速度。
在图像分割中,可以使用最小二乘法来拟合图像中的曲线或边缘,以便更好地分割图像。
OpenCV最小二乘法是一种非常有用的数学方法,可以用于解决多种问题。
在计算机视觉和图像处理领域中,最小二乘法被广泛应用,可以帮助我们更好地理解和处理图像数据。
opencv 拟合椭圆 指定角度
OpenCV拟合椭圆指定角度1. 介绍在计算机视觉和图像处理中,椭圆是一种常见的几何形状。
通过使用OpenCV库,我们可以实现拟合椭圆并指定其角度的功能。
本文将详细介绍如何使用OpenCV库来实现这个任务。
2. 拟合椭圆2.1 OpenCV简介OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。
它支持多种编程语言,包括C++、Python等。
对于图像处理任务,OpenCV提供了很多方便易用的函数和方法。
2.2 椭圆拟合原理在拟合椭圆之前,我们需要先理解椭圆的数学定义和参数表示。
在笛卡尔坐标系中,一个椭圆可以由以下参数表示:•中心点坐标 (cx, cy)•长轴长度 a•短轴长度 b•椭圆旋转角度 theta(弧度制)给定一组离散点集合P = {(x1, y1), (x2, y2), …, (xn, yn)},我们希望找到一个最优的椭圆参数集合 (cx, cy, a, b, theta),使得这个椭圆能够最好地拟合这些离散点。
OpenCV提供了一个函数fitEllipse()来实现椭圆拟合。
该函数使用了一种基于最小二乘法的优化算法,通过迭代计算得到最优的椭圆参数。
2.3 OpenCV中的椭圆拟合在OpenCV中,我们可以使用fitEllipse()函数来实现椭圆拟合。
该函数的原型如下:retval = cv.fitEllipse(points)其中,points是输入的离散点集合,retval是返回的椭圆参数集合。
以下是一个简单的示例代码,演示了如何使用OpenCV进行椭圆拟合:import cv2 as cvimport numpy as np# 创建一个空白图像image = np.zeros((500, 500), dtype=np.uint8)# 生成一组离散点作为示例输入points = np.array([(250 + int(200 * np.cos(t)), 250 + int(100 * np.sin(t))) fo r t in np.linspace(0, 2*np.pi, 100)], dtype=np.int32)# 拟合椭圆ellipse = cv.fitEllipse(points)# 在图像上绘制拟合结果cv.ellipse(image, ellipse, (255,), 2)# 显示图像cv.imshow("Fit Ellipse", image)cv.waitKey(0)cv.destroyAllWindows()运行上述代码,你将会得到一个显示了拟合椭圆的图像窗口。
opencv最小二乘法拟合轮廓点
opencv最⼩⼆乘法拟合轮廓点bool polynomial_curve_fit(std::vector<cv::Point>& key_point, int n, cv::Mat& A){//Number of key pointsint N = key_point.size();//构造矩阵Xcv::Mat X = cv::Mat::zeros(n + 1, n + 1, CV_64FC1);for (int i = 0; i < n + 1; i++){for (int j = 0; j < n + 1; j++){for (int k = 0; k < N; k++){X.at<double>(i, j) = X.at<double>(i, j) +std::pow(key_point[k].x, i + j);}}}//构造矩阵Ycv::Mat Y = cv::Mat::zeros(n + 1, 1, CV_64FC1);for (int i = 0; i < n + 1; i++){for (int k = 0; k < N; k++){Y.at<double>(i, 0) = Y.at<double>(i, 0) +std::pow(key_point[k].x, i) * key_point[k].y;}}A = cv::Mat::zeros(n + 1, 1, CV_64FC1);//求解矩阵Acv::solve(X, Y, A, cv::DECOMP_LU); //X*A = Yreturn true;}int main(){//创建⽤于绘制的深蓝⾊背景图像cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC3);image.setTo(cv::Scalar(100, 0, 0));//输⼊拟合点std::vector<cv::Point> points;points.push_back(cv::Point(100., 58.));points.push_back(cv::Point(150., 70.));points.push_back(cv::Point(200., 90.));points.push_back(cv::Point(252., 140.));points.push_back(cv::Point(300., 220.));points.push_back(cv::Point(350., 400.));//将拟合点绘制到空⽩图上for (int i = 0; i < points.size(); i++){cv::circle(image, points[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);}//绘制折线cv::polylines(image, points, false, cv::Scalar(0, 255, 0), 1, 8, 0);cv::Mat A;polynomial_curve_fit(points, 3, A);std::cout << "A = " << A << std::endl;std::vector<cv::Point> points_fitted;for (int x = 0; x < 400; x++){double y = A.at<double>(0, 0) + A.at<double>(1, 0) * x +A.at<double>(2, 0)*std::pow(x, 2) + A.at<double>(3, 0)*std::pow(x, 3);points_fitted.push_back(cv::Point(x, y));}cv::polylines(image, points_fitted, false, cv::Scalar(0, 255, 255), 1, 8, 0);cv::imshow("image", image);cv::waitKey(0);return 0;}。
opencv最小二乘法曲线拟合
opencv最小二乘法曲线拟合OpenCV中提供了最小二乘法曲线拟合的函数可用于拟合曲线。
最小二乘法是通过最小化实际观测值与拟合值之间的残差平方和来拟合曲线。
首先,导入OpenCV库并加载所需函数:```pythonimport cv2 as cvimport numpy as np```然后,定义要拟合的数据点的坐标:```pythonx = np.array([0, 1, 2, 3, 4, 5], dtype=np.float32)y = np.array([1, 3, 2, 5, 7, 8], dtype=np.float32)```接下来,使用最小二乘法曲线拟合函数拟合数据:```python# 定义拟合曲线的阶数n = 2# 使用polyfit函数拟合曲线coefficients = np.polyfit(x, y, n)# 得到拟合曲线的系数a = coefficients[0]b = coefficients[1]c = coefficients[2]```最后,使用拟合的曲线参数绘制曲线:```python# 根据拟合参数生成x轴上的点fit_x = np.linspace(0, 5, 100)# 计算拟合曲线的y值fit_y = a * fit_x ** 2 + b * fit_x + c# 绘制原始数据点和拟合曲线plt.scatter(x, y)plt.plot(fit_x, fit_y, color='r')# 显示图像plt.show()```通过上述步骤,您就可以使用OpenCV中的最小二乘法曲线拟合函数来拟合曲线。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cvmSet(Mb,2,0,resul3);
cvmSet(Mb,3,0,resul4);
cvmSet(Mb,4,0,resul5);
cvmSet(Ma,0,0,A1);
cvmSet(Ma,0,1,B1);
cvmSet(Ma,0,2,C1);
|A1 B1 C1 D1 E1 | |A| = |resul1|
|A2 B2 C2 D2 E2 | |B| = |resul2|
|A3 B3 C3 D3 E3 | |C| = |resul3|
|A4 B4 C4 D4 E4 | |D| = |resul4|
|A5 B5 C5 D5 E5 | |E| = |resul5|
long double E = cvmGet(Md,4,0);
double XC = (2*B*C - A*D) /(A*A-4*B);
double YC =(2*D-A*D)/(A*A-4*B);
long double fenzi = 2*(A*C*D-B*C*C-D*D+4*E*B-A*A*E);
求得A,B,C,D,E.
椭圆的五个参数:
center.x = (2*B*C - A*D) /(A*A-4*B);
center.y = (2*D-A*D)/(A*A-4*B);
fenzi = 2*(A*C*D-B*C*C-D*D+4*E*B-A*A*E);
fenmu =(A*A-4*B) * (B- sqrt(A*A+ (1-B) * (1-B) ) +1);
Hale Waihona Puke 椭圆的目标函数: F(A,B,C,D,E) = XiGeMa(xi^2 + A*xiyi+B*yi^2+C*xi+D*yi+E)^2
分别对A,B,C,D,E 求一阶偏导 并令其等于0
得到线性方程组:
vec_result.push_back(XA);
vec_result.push_back(XB);
vec_result.push_back(Xtheta);
return vec_result;
}
//
CvMat* Ma = cvCreateMat(5,5,CV_64FC1);
CvMat* Md = cvCreateMat(5,1,CV_64FC1);
CvMat* Mb = cvCreateMat(5,1,CV_64FC1);
//
cvmSet(Mb,0,0,resul1);
x1y1 += xi*yi;
xxx1 += xi;
yyy1 += yi;
yyy3 += yi*yi*yi;
}
long double resul1 = -(x3y1);
long double resul2 = -(x2y2);
long double resul3 = -(xxx3);
x1y3 += xi*yi*yi*yi;
x2y2 += xi*xi*yi*yi; ;
yyy4 +=yi*yi*yi*yi;
xxx3 += xi*xi*xi ;
xxx2 += xi*xi ;
x2y1 += xi*xi*yi;
x1y2 += xi*yi*yi;
yyy2 += yi*yi;
vector<double> getEllipsepar(vector<CvPoint> vec_point)
{
vector<double> vec_result;
double x3y1 = 0,x1y3= 0,x2y2= 0,yyy4= 0, xxx3= 0,xxx2= 0,x2y1= 0,yyy3= 0,x1y2= 0 ,yyy2= 0,x1y1= 0,xxx1= 0,yyy1= 0;
long double fenmu =(A*A-4*B) * (B- sqrt(A*A+ (1-B) * (1-B) ) +1);
long double femmu2 =(A*A-4*B) * (B+ sqrt(A*A+ (1-B) * (1-B) ) +1);
double XA =sqrt(fabs(fenzi/fenmu));
cvmSet(Ma,2,1,B3);
cvmSet(Ma,2,2,C3);
cvmSet(Ma,2,3,D3);
cvmSet(Ma,2,4,E3);
cvmSet(Ma,3,0,A4);
cvmSet(Ma,3,1,B4);
cvmSet(Ma,3,2,C4);
cvmSet(Ma,3,3,D4);
long double B3 = x1y2, C3 = xxx2, D3 = x1y1, E3 = xxx1, A3 = x2y1;
long double B4 = yyy3, C4 = x1y1, D4 = yyy2, E4 = yyy1, A4 = x1y2;
long double B5 = yyy2, C5 = xxx1, D5 = yyy1, E5 = N, A5 = x1y1;
int N = vec_point.size();
for (int m_i = 0;m_i < N ;++m_i )
{
double xi = vec_point[m_i].x ;
double yi = vec_point[m_i].y;
x3y1 += xi*xi*xi*yi ;
cvmSet(Ma,0,3,D1);
cvmSet(Ma,0,4,E1);
cvmSet(Ma,1,0,A2);
cvmSet(Ma,1,1,B2);
cvmSet(Ma,1,2,C2);
cvmSet(Ma,1,3,D2);
cvmSet(Ma,1,4,E2);
cvmSet(Ma,2,0,A3);
double XB =sqrt(fabs(fenzi/femmu2));
double Xtheta =atan(sqrt((XA*XA-XB*XB*B)/(XA*XA*B-XB*XB))+0.0001)*180/3.1415926;
vec_result.push_back(XC);
vec_result.push_back(YC);
cvSolve(Ma, Mb, Md);
long double A = cvmGet(Md,0,0);
long double B = cvmGet(Md,1,0);
long double C = cvmGet(Md,2,0);
long double D = cvmGet(Md,3,0);
femmu2 =(A*A-4*B) * (B+ sqrt(A*A+ (1-B) * (1-B) ) +1);
long =sqrt(fabs(fenzi/fenmu));
short =sqrt(fabs(fenzi/femmu2));
theta = atan(sqrt((center.x *center.x -center.y*center.y*B)/(center.x *center.x *B-center.y*center.y))+0.0001)*180/cv_pi;;
cvmSet(Ma,3,4,E4);
cvmSet(Ma,4,0,A5);
cvmSet(Ma,4,1,B5);
cvmSet(Ma,4,2,C5);
cvmSet(Ma,4,3,D5);
cvmSet(Ma,4,4,E5);
long double resul4 = -(x2y1);
long double resul5 = -(xxx2);
long double B1 = x1y3, C1 = x2y1, D1 = x1y2, E1 = x1y1, A1 = x2y2;
long double B2 = yyy4, C2 = x1y2, D2 = yyy3, E2 = yyy2, A2 = x1y3;