精华内容
下载资源
问答
  • 这是一种快速的非迭代椭圆拟合,在快速非迭代椭圆拟合中,这是最准确和稳健的。 它采用数据点的 xy 坐标,并返回椭圆方程的系数: ax^2 + bxy + cy^2 + dx + ey + f = 0, 即它返回向量 A=(a,b,c,d,e,f)。 要将这...
  • 椭圆拟合matlab程序

    2019-03-03 15:03:02
    matlab编写的,使用最小二乘进行椭圆拟合的程序,最后得到椭圆的五个参数
  • 网上有很多椭圆拟合算法程序,但是过于冗长繁琐,自己重新推导了下,用简单几行代码就实现了椭圆拟合法,椭球拟合法可以在此基础上添加几个量就可以得到了。
  • 这是一种快速且非迭代的椭圆拟合。 用法: A = EllipseDirectFit(XY) 输入:XY(n,2)是n个点的坐标数组x(i)=XY(i,1), y(i)=XY(i,2) 输出:A = [abcdef]' 是系数向量最佳拟合椭圆的方程: ax^2 + bxy + cy^2 + dx ...
  • matlab椭圆拟合程序

    2020-08-31 17:03:56
    本程序用于对一系列点进行椭圆拟合,其中主程序为EllipticFitting.m,输入需要拟合的点坐标,输出为所拟合的椭圆的中点坐标。
  • RFOVE 是完全无监督的,无需对对象形状进行任何假设或先验知识即可运行,并扩展和改进了递减椭圆拟合算法 (DEFA) [1]。 RFOVE 和 DEFA 都通过执行模型选择来解决多椭圆拟合问题,该模型选择由基于适当定义的形状...
  • 提出一种基于最小外包矩形的快速椭圆拟合方法,该方法利用最小二乘法获得目标的最小外包矩形框,再求取外包矩形框的内切椭圆,该椭圆能有效反映目标的大部分运动信息。本文对该方法进行了目标拟合的有效性和实效性...
  • 椭圆拟合C++函数

    2016-11-17 17:16:34
    将一个matlab写的椭圆拟合函数改写成C++函数,可根据若干个点的坐标拟合成椭圆,输出椭圆标准参数方程的系数,文件附带有相应的matlab函数。函数依赖于OpenCV、Eigen库。
  • Halcon12.0 椭圆拟合

    2017-04-25 16:40:18
    Halcon12.0模拟如何进行椭圆测量的逻辑
  • semimajor_axis - 椭圆长轴的大小semiminor_axis - 椭圆短轴的大小x0 - 椭圆中心的 x 坐标y0- y 椭圆中心坐标phi - 相对于弧度的旋转角度x 轴 使用的算法: 给定椭圆的二次形式: a*x^2 + 2*b*x*y + c*y^2 + 2*d*x...
  • MATLAB实现的一种基于最小二乘的椭圆拟合直接算法源代码.附件中的源代码是matlab编写的,实现一种对于椭圆的稳定的数据拟合算法。
  • 椭圆拟合改进算法

    2015-07-09 19:48:21
    对于更多情况的椭圆拟合有更大的适应性,基于最小二乘法,且处理速度更快
  • opencv椭圆拟合

    2016-11-04 20:16:25
    opencv椭圆拟合
  • 椭圆拟合的c++方法.rar

    2019-07-11 23:39:41
    椭圆拟合的c++方法,参考github链接 https://github.com/seisgo/EllipseFit,原版是qt版本,改为不依赖qt的版本。 包含两个文件:myEllipse.h和myEllipse.cpp 具体参考:...
  • 椭圆拟合代码

    2014-05-15 19:11:46
    椭圆拟合代码
  • 关于最小二乘法椭圆拟合的改进算法,属于计算机图形学范畴,可用于2D/3D椭圆绘制算法
  • 基于最小二乘的椭圆拟合算法,田开琳,,椭圆是人们经常遇到的一种几何形体,大量存在的圆形、椭圆形物体及其透视投影均为椭圆,因此高精度的椭圆拟合是后续物体辨识与测
  • 椭圆拟合方法

    千次阅读 2019-07-11 23:34:24
    最近工作中遇到了有关椭圆拟合的问题,把在这一过程中踩坑和最后使用的方法进行了总结。 参考链接:https://github.com/seisgo/EllipseFit https://github.com/xiamenwcy/EllipseFitting opencv3.2的方法 首先使用的...

    最近工作中遇到了有关椭圆拟合的问题,把在这一过程中踩坑和最后使用的方法进行了总结。
    参考链接:https://github.com/seisgo/EllipseFit
    https://github.com/xiamenwcy/EllipseFitting

    opencv3.2的方法

    首先使用的是opencv的方法,该方法有时候会失效。

    //待拟合的点
    vector<Point> vpfinalfit = dangerzone;
    
    //把点的数量限制到20个
    int interval = floor(vpfinalfit.size() / 20.0);
    if (interval > 1)
    {
    	vector<Point> vpsample;
    	for (int i = 0; i < vpfinalfit.size(); i += interval)
    	{
    		vpsample.push_back(vpfinalfit[i]);
    	}
    	vpfinalfit = vpsample;
    }
    
    //把坐标输出的文件中,在matlab中拟合
    ofstream fout3;
    fout3.open("data3.txt");
    for (unsigned long i = 0; i < vpfinalfit.size(); i++)
    {
    	fout3 << vpfinalfit[i].x << " " << vpfinalfit[i].y << endl;
    }
    fout3.close();
    
    //使用椭圆拟合的方法
    RotatedRect rr;
    if (vpfinalfit.size() > 5)
    {
    	rr = fitEllipse(vpfinalfit);
    	ellipse(src, rr, Scalar(0, 0, 0), 4);
    }
    

    拟合较好的结果
    在这里插入图片描述
    拟合不对的结果
    在这里插入图片描述

    matlab的方法(BFisher方法)

    参考链接 http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/FITZGIBBON/ELLIPSE/
    参考文献:Andrew W. Fitzgibbon, Maurizio Pilu, and Robert B. Fisher Direct least-squares fitting of ellipses, IEEE Transactions on Pattern Analysis and Machine Intelligence, 21(5), 476–480, May 1999

    同样的点,在matlab中进行拟合,则可以实现较好的效果。

    x = load('data3.mat');
    p0=[0.005 0.005 0.005 0.005 0.005 0.005];
    warning off
    F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)*x(:,2).^2+p(4)*x(:,1)+p(5)*x(:,2)+p(6);
    % ???????????
    p=nlinfit(x,zeros(size(x,1),1),F,p0);
    
    A=p(1)/p(6);
    B=p(2)/p(6);
    C=p(3)/p(6);
    D=p(4)/p(6);
    E=p(5)/p(6);
    
    X_center = (B*E-2*C*D)/(4*A*C - B^2);
    Y_center = (B*D-2*A*E)/(4*A*C - B^2);
    fprintf(' X_center=%g, Y_center=%g\n',X_center,Y_center);
    
    a= 2*sqrt((2*A*(X_center^2)+2*C*(Y_center^2)+2*B*X_center*Y_center-2)/(A+C+sqrt(((A-C)^2+B^2))));
    b= 2*sqrt((2*A*(X_center^2)+2*C*(Y_center^2)+2*B*X_center*Y_center-2)/(A+C-sqrt(((A-C)^2+B^2))));
     
     
    q=0.5 * atan(B/(A-C));
    fprintf(' q=%g\n',q);
     
     
    fprintf(' a=%g, b=%g\n',a,b);
    plot(x(:,1),x(:,2),'ro');
     
     
    hold on;
    xmin=min(x(:,1));
    xmax=max(x(:,1));
    ymin=min(x(:,2));
    ymax=max(x(:,2));
    % 作图
     
    ezplot(@(x,y)F(p,[x,y]),[xmin,xmax,ymin,ymax]);
    title('曲线拟合');
    legend('采样点','拟合结果')
    

    在这里插入图片描述

    c++版本(BFisher方法)

    该方法也有c++的版本,但是lapack的配置比较复杂。
    DirectEllipseFit拟合的类定义,具体的代码可以去CSDN下载,稍后会上传,命名分别为myEllipse.h和myEllipse.cpp

    template <typename T>
    class DirectEllipseFit
    {
    public:
    	DirectEllipseFit(const vector<T>& xData, const vector<T>& yData);
    	Ellipse doEllipseFit();
    
    private:
    	T getMeanValue(const vector<T>& data);
    	T getMaxValue(const vector<T>& data);
    	T getMinValue(const vector<T>& data);
    	T getScaleValue(const vector<T>& data);
    	vector<T> symmetricNormalize(const vector<T>& data);
    	//Make sure xData and yData are of same size
    	vector<T> dotMultiply(const vector<T>& xData, const vector<T>& yData);
    	
    	//Get n*6 design matrix D, make sure xData and yData are of same size
    	vector<vector<T> > getDesignMatrix(const vector<T>& xData,const vector<T>& yData);
    	//Get 6*6 constraint matrix C
    	vector<vector<T> > getConstraintMatrix();
    	//Get 6*6 scatter matrix S from design matrix
    	vector<vector<T> > getScatterMatrix(const vector<vector<T> >& dMtrx);
    	//Transpose matrix
    	vector<vector<T> > transposeMatrix(const vector<vector<T> >& mtrx);
    	//Do matrix multiplication, mtrx1: j*l; mtrx2: l*i; return: j*i
    	vector<vector<T> > doMtrxMul(const vector<vector<T> >& mtrx1,
    		const vector<vector<T> >& mtrx2);
    
    	/**
    	 * @brief solveGeneralEigens:   Solve generalized eigensystem
    	 * @note        For real eiginsystem solving.
    	 * @param sMtrx:    6*6 square matrix in this application
    	 * @param cMtrx:    6*6 square matrix in this application
    	 * @param eigVV:    eigenvalues and eigenvectors, 6*7 matrix
    	 * @return  success or failure status
    	 */
    	bool solveGeneralEigens(const vector<vector<T> >& sMtrx,
    		const vector<vector<T> >& cMtrx,
    		vector<vector<T> >& eigVV);
    	//Convert matrix expression from nested QVector to 1-order array
    	double* mtrx2array(const vector<vector<T> >& mtrx);
    
    	/**
    	 * @brief calcEllipsePara:  calculate ellipse parameter form eigen information
    	 * @param eigVV:    eigenvalues and eigenvectors
    	 * @return ellipse parameter
    	 */
    	Ellipse calcEllipsePara(const vector<vector<T> >& eigVV);
    
    private:
    	vector<T> m_xData, m_yData;
    };
    

    更简单的方法

    如果你喜欢用最新版的软件,在opencv4.0以上的版本中,椭圆拟合函数增加了新的方法,其中有一个就是使用的上述方法,所有可以直接调用opencv4.0以上版本的库。

    RotatedRect rr;
    if (vpfinalfit.size() > 5)
    {
    	rr = fitEllipseAMS(vpfinalfit);
    	//rr = fitEllipse(vpfinalfit);
    	ellipse(src, rr, Scalar(0, 255, 255), 1);  //画椭圆
    }
    

    但是不能盲目升级,就是因为这个原因,笔者把原来开发的Android程序jni使用的opencv版本从3.2升级到了4.0,导致队友原来开发的视觉算法编译通不过来,不过没有什么,从opencv3到opencv4大部分是是简单的变量命名替换,改起来还是比较轻松。

    展开全文
  • 基于最小二乘法的椭圆拟合程序

    热门讨论 2012-08-19 12:09:39
    基于最小二乘法的椭圆拟合程序,参考文献:基于椭圆拟合的人工标志中心定位方法
  • matlab最小二乘法拟合函数代码椭圆拟合 抽象的 椭圆拟合理论研究 编码以实现椭圆拟合, matlab和C ++ 比较不同的椭圆拟合理论或函数 考虑到圆锥截面的最小二乘拟合法的弊端,寻求一种有效且鲁棒的方法。 通过Matlab...
  • 椭圆拟合

    2019-03-08 22:13:35
    椭圆拟合 同时可参考http://mathworld.wolfram.com/Ellipse.html function [Re, center, vertex]= MyEllipseDirectFit(XY) % Direct ellipse fit, proposed in article % A. W. Fitzgibbon, M. Pilu, R. B....

    结合师兄写的程序加上自己的修改,为在工程上使用,后又写出C++版,同是将输出一些参数作为结构体输出

    椭圆拟合

    同时可参考http://mathworld.wolfram.com/Ellipse.html

    function [Re, center, vertex]= MyEllipseDirectFit(XY)
    %  Direct ellipse fit, proposed in article
    %    A. W. Fitzgibbon, M. Pilu, R. B. Fisher
    %     "Direct Least Squares Fitting of Ellipses"
    %     IEEE Trans. PAMI, Vol. 21, pages 476-480 (1999)
    %
    %  Our code is based on a numerically stable version
    %  of this fit published by R. Halir and J. Flusser
    %
    %     Input:  XY(n,2) is the array of coordinates of n points x(i)=XY(i,1), y(i)=XY(i,2)
    %
    %     Output: A = [a b c d e f]' is the vector of algebraic 
    %             parameters of the fitting ellipse:
    %             ax^2 + bxy + cy^2 +dx + ey + f = 0
    %             the vector A is normed, so that ||A||=1
    %
    %  This is a fast non-iterative ellipse fit.
    %
    %  It returns ellipses only, even if points are
    %  better approximated by a hyperbola.
    %  It is somewhat biased toward smaller ellipses.
    %
    centroid = mean(XY); % the centroid of the data set
    warning off;
    D1 = [(XY(:,1)-centroid(1)).^2, (XY(:,1)-centroid(1)).*(XY(:,2)-centroid(2)),...
          (XY(:,2)-centroid(2)).^2];
    D2 = [XY(:,1)-centroid(1), XY(:,2)-centroid(2), ones(size(XY,1),1)];
    S1 = D1'*D1;
    S2 = D1'*D2;
    S3 = D2'*D2;
    T = -inv(S3)*S2';
    M = S1 + S2*T;
    M = [M(3,:)./2; -M(2,:); M(1,:)./2];
    [evec,eval] = eig(M);
    cond = 4*evec(1,:).*evec(3,:)-evec(2,:).^2;
    A1 = evec(:,find(cond>0));
    A = [A1; T*A1];
    A4 = A(4)-2*A(1)*centroid(1)-A(2)*centroid(2);
    A5 = A(5)-2*A(3)*centroid(2)-A(2)*centroid(1);
    A6 = A(6)+A(1)*centroid(1)^2+A(3)*centroid(2)^2+...
         A(2)*centroid(1)*centroid(2)-A(4)*centroid(1)-A(5)*centroid(2);
    A(4) = A4;  A(5) = A5;  A(6) = A6;
    % if A(1)<0
    %     A=-A;
    % end
    Re=A;
    
    %长轴倾角
    %ellipse equation: a*x^2 + b*x*y + c*y^2 +d*x + e*y + 1 = 0;
    % Refer to:http://blog.csdn.net/ningyaliuhebei/article/details/46327681
    B=Re(2)/Re(6); A=Re(1)/Re(6);C=Re(3)/Re(6); D=Re(4)/Re(6);E=Re(5)/Re(6);
    if B==0
         if A<C/2
        theta1=0; 
        else
          theta1= pi/2;
        end  
    else
        if A<C/2
        theta1=0.5*atan(B/(A-C)); 
        else
          theta1= pi/2 + 0.5*atan(B/(A-C));
        end
    end
    K1= tan(theta1); %长轴斜率
    if (abs(K1)<1e-8) 
        K1=0;
    end
    %椭圆的中心点
    xc=(B*E-2*C*D)/(4*A*C-B^2);
    yc=(B*D-2*A*E)/(4*A*C-B^2);
    %椭圆的长、短半轴长度
    la=sqrt(2*(A*xc^2+C*yc^2+B*xc*yc-1)/(A+C-sqrt((A-C)^2+B^2)));
    lb=sqrt(2*(A*xc^2+C*yc^2+B*xc*yc-1)/(A+C+sqrt((A-C)^2+B^2)));
    %长、短轴顶点坐标
    n1=[1,K1]; n1=n1/norm(n1);
    center = [xc, yc];
    va1=center+la*n1;  %长轴顶点1, 坐标轴正向
    va2=center-la*n1;  %长轴顶点2,坐标轴负向
    
    if(K1 == 0)
        n2=[0,1];
    else
        n2=[1,-1/K1];
    end
    n2=n2/norm(n2);
    if n2(2) >= 0
        vb1=center+lb*n2;  %短轴顶点1,坐标轴正向
        vb2=center-lb*n2;  %短轴顶点2,坐标轴负向
    else
        vb1=center-lb*n2;  %短轴顶点1,坐标轴正向
        vb2=center+lb*n2;  %短轴顶点2,坐标轴负向
    end
    
    center = [xc, yc];
    vertex = [va1;va2;vb1;vb2];
    
    end  %  EllipseDirectFit
    

    长短轴计算

    结合上文函数

    function [aa,bb]=getab(re)
    a=re(1);
    b=re(2)/2;
    c=re(3);
    d=re(4)/2;
    f=re(5)/2;
    g=re(6);
    aa=sqrt((2*(a*f^2+c*d^2+g*b^2-2*b*d*f-a*c*g))/((b^2-a*c)*(sqrt((a-c)^2+4*b^2)-(a+c))));
    bb=sqrt((2*(a*f^2+c*d^2+g*b^2-2*b*d*f-a*c*g))/((b^2-a*c)*(-sqrt((a-c)^2+4*b^2)-(a+c))));
    if abs(aa)>abs(bb)
        temp=aa;
        aa=bb;
        bb=temp;
    end
    end
    

    C++版

    C++程序基于Opencv库

    typedef struct{
    	double Re[6], center[2], vertex[4][2], abc[3], longShortAxis[2];
    	//Re椭圆一般式方程参数ax^2+bxy+cy^2+dx+ey+f=0;
    	//center,椭圆中心坐标
    	//vertex,椭圆长轴点短轴点坐标
    	//abc,椭圆方程参数,a(x-u)^2+b(y-v)^2+2c(x-u)(y-v)=1
    	//longShortAxis,椭圆长轴短轴长度
    }structEllipse;
    
    structEllipse MyEllipseDirectFit(std::vector<std::vector<double>> XY, int rows)
    {
    	structEllipse result;
    	//double eps = 1e-12;
    	//std::vector<double >centroidx, centroidy;
    	//for (int i = 0; i < rows; i++){
    	//	centroidx.push_back(XY[i][0]);
    	//	centroidy.push_back(XY[i][1]);
    	//}
    	std::cout << *max_element(centroidx.begin(), centroidx.end());
    	//double centroid[2] = { arrCal.mean(centroidx), arrCal.mean(centroidy) };
    	//std::vector<std::vector<double>>D1(rows), D2(rows);
    	cv::Mat M;
    	M.create(rows, 6, CV_64FC1);
    	for (int i = 0; i < rows; i++){
    		M.at<double>(i, 0) = std::pow(XY[i][0], 2);
    		M.at<double>(i, 1) = XY[i][0] * XY[i][1];
    		M.at<double>(i, 2) = std::pow(XY[i][1], 2);
    		M.at<double>(i, 3) = XY[i][0];
    		M.at<double>(i, 4) = XY[i][1];
    		M.at<double>(i, 5) = 1;
    	}
    	//cv::Mat T = (-(D2.t()*D2).inv()*(D1.t()*D2).t());
    	//cv::Mat M0 = D1.t()*D1 + (D1.t()*D2)*(-(D2.t()*D2).inv()*(D1.t()*D2).t());
    	//cv::Mat M ;
    	//cv::vconcat(M0(cv::Rect(0, 2, 3, 1)) / 2, -M0(cv::Rect(0, 1, 3, 1)), M);//vconcat:矩阵拼接,Rect矩阵裁剪
    	//cv::vconcat(M, M0(cv::Rect(0, 0, 3, 1)) / 2, M);
    	cv::SVD svd;
    	cv::Mat U;
    	cv::Mat DD;
    	cv::Mat VT;
    	svd.compute(M, DD, U, VT);
    	//cv::Mat Re = VT(cv::Rect(0, 5, 6, 1));
    	for (int i = 0; i < VT.cols; i++)
    		result.Re[i] = *VT.ptr<double>(5, i);
    	double parameter[5];
    	parameter[0] = result.Re[0] / result.Re[5];
    	parameter[1] = result.Re[1] / result.Re[5];
    	parameter[2] = result.Re[2] / result.Re[5];
    	parameter[3] = result.Re[3] / result.Re[5];
    	parameter[4] = result.Re[4] / result.Re[5];
    	double K1 = tan(0.5*atan(parameter[1] / (parameter[0] - parameter[2])));
    	if (fabs(K1) < 1e-8)
    		K1 = 0;
    	//std::cout << std::setprecision(20) <<K1 << std::endl;
    
    	result.center[0] = (parameter[1] * parameter[4] - 2 * parameter[2] * parameter[3]) / (4.0 * parameter[0] * parameter[2] - pow(parameter[1], 2));
    	result.center[1] = (parameter[1] * parameter[3] - 2 * parameter[0] * parameter[4]) / (4.0 * parameter[0] * parameter[2] - pow(parameter[1], 2));
    	//longShortAxis椭圆长短轴
    	result.longShortAxis[0] = sqrt(2 * (parameter[0] * pow(result.center[0], 2) + parameter[2] * pow(result.center[1], 2) + parameter[1] * result.center[0] * result.center[1] - 1) / (parameter[0] + parameter[2] - sqrt(pow((parameter[0] - parameter[2]), 2) + pow(parameter[1], 2))));
    	result.longShortAxis[1] = sqrt(2 * (parameter[0] * pow(result.center[0], 2) + parameter[2] * pow(result.center[1], 2) + parameter[1] * result.center[0] * result.center[1] - 1) / (parameter[0] + parameter[2] + sqrt(pow((parameter[0] - parameter[2]), 2) + pow(parameter[1], 2))));
    	//std::cout << std::setprecision(20) << la << std::endl << lb << std::endl;
    	double n1[2];
    	n1[0] = (1.0 / sqrt(1 + pow(K1, 2)));
    	n1[1] = (K1 / sqrt(1 + pow(K1, 2)));
    	result.vertex[0][0] = result.center[0] + result.longShortAxis[0] *n1[0] ;
    	result.vertex[0][1] = result.center[1] + result.longShortAxis[0] *n1[1] ;
    	result.vertex[1][0] = result.center[0] - result.longShortAxis[0] * n1[0];
    	result.vertex[1][1] = result.center[1] - result.longShortAxis[0] * n1[1];
    	double n2[2];
    	if (K1 == 0){
    		n2[0] = 0;
    		n2[1]= 1.0;
    	}
    		
    	else{
    		n2[0] = (1.0 / sqrt(1 + pow(-1.0 / K1, 2)));
    		n2[1] = ((-1.0 / K1) / sqrt(1 + pow(-1.0 / K1, 2)));
    	}
    	if (n2 >= 0){
    		result.vertex[2][0] = result.center[0] + result.longShortAxis[1] * n2[0];
    		result.vertex[2][1] = result.center[1] + result.longShortAxis[1] * n2[1];
    		result.vertex[3][0] = result.center[0] - result.longShortAxis[1] * n2[0];
    		result.vertex[3][1] = result.center[1] - result.longShortAxis[1] * n2[1];
    	}
    	else{
    		result.vertex[2][0] = result.center[0] - result.longShortAxis[1] * n2[0];
    		result.vertex[2][1] = result.center[1] - result.longShortAxis[1] * n2[1];
    		result.vertex[3][0] = result.center[0] + result.longShortAxis[1] * n2[0];
    		result.vertex[3][1] = result.center[1] + result.longShortAxis[1] * n2[1];
    	}
    		//std::cout << std::setprecision(20) <<  << std::endl;
    	//result.Re[1]= *Re.ptr<double>;
    	//cond=4 * eVectorsMat(cv::Rect(0, 0, 3, 1)).mul(eVectorsMat(cv::Rect(0, 2, 3, 1))) - (eVectorsMat(cv::Rect(0, 1, 3, 1))).mul(eVectorsMat(cv::Rect(0, 1, 3, 1)));
    	//int j=0;
    	//for (j = 0; j < cond.cols; j++){
    	//	if (*cond.ptr<double>(0, j)>0)
    	//		break;
    	//}
    	//cv::Mat A1 = eVectorsMat(cv::Rect(j, 0, 1, 3));
    	//cv::Mat A;
    
    	//cv::vconcat(A1,T*A1, A);
    	//std::cout << A1 << std::endl;
    	//std::cout << cond << std::endl;
    	//std::cout << eVectorsMat(cv::Rect(0, 0, 3, 1)).mul(eVectorsMat(cv::Rect(0, 2, 3, 1)));
    
    	//cv::Mat point;
    	//point.create(rows, 2, CV_64F);
    	//for (int i = 0; i < rows; i++)
    	//for (int j = 0; j < 2; j++)
    	//	point.at<double>(i, j) = XY[i][j];
    	cv::meanStdDev(point, mean_, stddev2_);
    	//cv::Mat centroid0 = (cv::Mat_<double>(1,2)<<mean(point(cv::Rect(0, 0, 1, rows)))[0],mean(point(cv::Rect(1, 0, 1, rows)))[0]);
    	//cv::Mat centroid;
    	//for (int i = 0; i < rows ; i++){
    	//	centroid.push_back(centroid0);
    	//}
    	//std::cout << point << std::endl << centroid << std::endl ;//<<  point.rowRange;
    	//另一种拟合形式中的abc三个参数计算
    
    	double re1[6];
    	re1[0] = (result.Re[0] / result.Re[2]);
    	re1[1] = (result.Re[1] / result.Re[2]);
    	re1[2] = (result.Re[2] / result.Re[2]);
    	re1[3] = (result.Re[3] / result.Re[2]);
    	re1[4] = (result.Re[4] / result.Re[2]);
    	re1[5] = (result.Re[5] / result.Re[2]);
    	double p[5];
    	p[0] = re1[0];
    	p[1] = -re1[3] / 2.0;
    	p[2] = -re1[4] / 2.0;
    	p[3] = re1[1] / 2.0;
    	p[4] = re1[5];
    	result.abc[0] = p[0] / (p[0] * pow(result.center[0], 2) + pow(result.center[1], 2) + 2 * p[3]*result.center[0] * result.center[1] - p[4]);
    	result.abc[1] = result.abc[0] / p[0];
    	result.abc[2] = p[3]*result.abc[1];
    ///计算椭圆长短轴
    	//double a, b, c, d, g, f;
    	//a = result.Re[0];
    	//b = (result.Re[1] / 2);
    	//c = result.Re[2];
    	//d = (result.Re[3] / 2);
    	//f = (result.Re[4] / 2);
    	//g = result.Re[5];
    	//result.longShortAxis[0] = sqrt((2 * (a*pow(f, 2) + c*pow(d, 2) + g*pow(b, 2) - 2 * b*d*f - a*c*g)) / ((pow(b, 2) - a*c)*(sqrt(pow((a - c), 2) + 4 * pow(b, 2)) - (a + c))));
    	//result.longShortAxis[1] = sqrt((2 * (a*pow(f, 2) + c*pow(d, 2) + g*pow(b, 2) - 2 * b*d*f - a*c*g)) / ((pow(b, 2) - a*c)*(-sqrt(pow((a - c), 2) + 4 * pow(b, 2)) - (a + c))));
    	double temp;
    	if (fabs(result.longShortAxis[0]) > fabs(result.longShortAxis[1])){
    		temp = result.longShortAxis[0];
    		result.longShortAxis[0] = result.longShortAxis[1];
    		result.longShortAxis[1] = temp;
    	}
    	return result;
    }
    
    展开全文
  • 椭圆拟合-EllipseDirectFit.m 这是一个快速和非迭代椭圆拟合算法 . 用法:  A = EllipseDirectFit 输入: XY 数组是n个点的坐标  x=XY, y=XY 输出: A = [a b c d e f]' 时椭圆拟合的系数向量其方程方程为:...
  • 椭圆拟合到python中的点

    千次阅读 2021-03-06 14:43:24
    在我有一组不是椭圆的点,我想用最小二乘法拟合椭圆。这些是我发现的用于计算的函数。我仔细检查了一下,但没有发现任何错误。在import numpy as npimport numpy.linalg as linalgimport matplotlib.pyplot as plt...

    实际上有一个帖子与此非常相似,但提出的问题与5年前不同。在

    我有一组不是椭圆的点,我想用最小二乘法拟合椭圆。这些是我发现的用于计算的函数。我仔细检查了一下,但没有发现任何错误。在import numpy as np

    import numpy.linalg as linalg

    import matplotlib.pyplot as plt

    def fitEllipse(x,y):

    x = x[:,np.newaxis]

    y = y[:,np.newaxis]

    D = np.hstack((x*x, x*y, y*y, x, y, np.ones_like(x)))

    S = np.dot(D.T,D)

    C = np.zeros([6,6])

    C[0,2] = C[2,0] = 2; C[1,1] = -1

    E, V = linalg.eig(np.dot(linalg.inv(S), C))

    #print E

    n = np.argmax(np.abs(E))

    a = V[:,n]

    return a

    def ellipse_center(a):

    b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0]

    num = b*b-a*c

    x0=(c*d-b*f)/num

    y0=(a*f-b*d)/num

    return np.array([x0,y0])

    def ellipse_angle_of_rotation( a ):

    b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0]

    return 0.5*np.arctan(2*b/(a-c))

    def ellipse_axis_length( a ):

    b,c,d,f,g,a = a[1]/2, a[2], a[3]/2, a[4]/2, a[5], a[0]

    up = 2*(a*f*f+c*d*d+g*b*b-2*b*d*f-a*c*g)

    down1=(b*b-a*c)*( (c-a)*np.sqrt(1+4*b*b/((a-c)*(a-c)))-(c+a))

    down2=(b*b-a*c)*( (a-c)*np.sqrt(1+4*b*b/((a-c)*(a-c)))-(c+a))

    res1=np.sqrt(up/down1)

    res2=np.sqrt(up/down2)

    return np.array([res1, res2])

    我的问题是:我有一组地理空间数据,我需要将这些椭圆拟合到这些数据中。为了比较不同纬度的椭圆,我需要把它们投影到局部切面上。这很简单。

    但是:对于一组这样的数据样本,函数可以工作,并给出一个形状良好的椭圆。然而,当我做投影时,它给出了一个椭圆,它的长轴比短轴短,这使得计算一个非想象的偏心率变得困难:P($e=\sqrt{1-b/a}$)。在

    即使我的投影是错误的(事实并非如此),这些函数仍然能够获取这些点并生成拟合。我不明白为什么有些数据集会产生无意义的几何数据。有什么想法吗?在

    如果没有,有没有其他方法可以让椭圆适合python中的数据?在

    展开全文
  • 1.最小二乘拟合 最小二乘拟合是一种数学上的近似和优化,利用已知的数据得出一条直线或者曲线,使之在坐标系上与已知数据之间的距离的平方和最小。 2.RANSAC算法 参见王荣先老师的博文&nbsp;...

    1.最小二乘拟合

    最小二乘拟合是一种数学上的近似和优化,利用已知的数据得出一条直线或者曲线,使之在坐标系上与已知数据之间的距离的平方和最小。

    2.RANSAC算法

    参见王荣先老师的博文 http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html

    3,直线拟合

    建立模型时利用直线的一般方程AX+BY+C=0,随机选取两点构建直线模型,计算每个点到此直线的TLS(Total Least Square),TLS小于一定阈值时的点为符合模型的点,点数最多时的模型即为最佳直线模型。再根据此时的直线参数画出最终拟合直线。

    4.椭圆拟合

    建立模型时利用椭圆的定义方程:dist(P,A)+dist(P,B)=DIST,其中P为椭圆上一点,A和B为椭圆两焦点。随机选取三点A,B,P构建椭圆模型,计算每个点到此两焦点的距离和与DIST的差值,差值小于一定阈值时的点为符合模型的点,点数最多时的模型即为最佳椭圆模型,再根据符合条件的点,利用椭圆一般方程Ax2+Bxy+Cy2+Dx+Ey+F=0 和得到符合点进行系数拟合,根据函数式画出最终拟合椭圆。

    5.matlab代码

    (1)最小二乘拟合

    复制代码
    %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %       FILENAME    LSF.m   
    %       FUNCTION    Input points with mouse,Least-squares fit of lines to
    %                   2D points
    %       DATE        2012-10-12
    %       AUTHOR      zhangying
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    clc;
    %% 鼠标输入点,enter键结束
    axis([-10 10 -10 10]);
    [x,y]=ginput;   %读取坐标直到按下回车键,返回坐标点的x,y坐标
    num=length(x);  %计算点的个数
    

    %% 直接用最小二乘进行拟合
    %通过最小化误差的平方和寻找数据的最佳函数匹配
    [p1,s1]=polyfit(x,y,1); %n=1为直线拟合 x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量
    [p2,s2]=polyfit(x,y,num-2); %n>1为曲线拟合,找到次数为n的多项式,对于数据点集(x,y),满足差的平方和最小
    [p3,s3]=polyfit(x,y,num-1); %x必须是单调的。矩阵s用于在polyval中来估计误差。
    xcurve=-10:2:10; %在这些点处求多项式的值
    p1curve=polyval(p1,xcurve); %多项式曲线求值,返回对应自变量xcurve在给定系数P的多项式的值
    p2curve=polyval(p2,xcurve);
    p3curve=polyval(p3,xcurve);
    %% 画图
    plot(xcurve,p1curve,‘g-’,xcurve,p2curve,‘b-’,…
    xcurve,p3curve,‘r-’,x,y,’*’);
    title(‘不同次数的最小二乘拟合’);
    legend(‘degree 1’,‘degree num-2’,‘degree num-1’,‘points’);

    复制代码

     (2)基于RANSAC的直线拟合

    复制代码
    %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %   FILENAME        RANSACF.m  
    %   FUNCTION        RANSAC fit of lines to 2D points 
    %   DATE            2012-10-11
    %   AUTHOR          zhangying
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    clc;
    clear;
    %% 随机点生成
    g_NumOfPoints = 500;   % 点数
    g_ErrPointPart = 0.4;  % 噪声
    g_NormDistrVar = 1;    % 标准偏差
    % 生成随机点
    theta = (rand(1) + 1) * pi/6;
    R = ( rand([1 g_NumOfPoints]) - 0.5) * 100;
    DIST = randn([1 g_NumOfPoints]) * g_NormDistrVar;
    Data = [cos(theta); sin(theta)] * R + [-sin(theta); cos(theta)] * DIST;
    Data(:, 1:floor(g_ErrPointPart * g_NumOfPoints)) = 2 * [max(abs(Data(1,:))), 0; 0, max(abs(Data(2,:)))] *...
                                                            (rand([2 floor(g_ErrPointPart * g_NumOfPoints)]) - 0.5);
    plot(Data(1, :), Data(2, :), '.', 'Tag', 'DATA');
    hold on;
    %% RANSAC拟合
    % 拟合模型初始化
    nSampLen = 2;                       %设定模型所依据的点数
    nIter = 50;                         %最大循环次数
    dThreshold = 2;                     %残差阈值
    nDataLen = size(Data, 2);           %数据长度
    RANSAC_model = NaN;                 %跳过缺失模型
    RANSAC_mask = zeros([1 nDataLen]);  %全0矩阵,1表示符合模型,0表示不符合
    nMaxInlyerCount = -1;
    %% 主循环
    for i = 1:nIter 
        %  抽样,选取两个不同的点
        SampleMask = zeros([1 nDataLen]);  
        while sum( SampleMask ) ~= nSampLen
            ind = ceil(nDataLen .* rand(1, nSampLen - sum(SampleMask))); %rand产生随机数,ceil向离它最近的大整数圆整
            SampleMask(ind) = 1;
        end    
        Sample = find( SampleMask );        %找出非零元素的索引值,即建立模型的点
        %% 建立模型,并查找符合模型的点
        ModelSet = feval(@TLS, Data(:, Sample));    %计算所有符合模型的点的最小二乘
        for iModel = 1:size(ModelSet, 3) 
          CurModel = ModelSet(:, :, iModel);        %当前模型对应的直线参数   
          CurMask =( abs( CurModel * [Data; ones([1 size(Data, 2)])])< dThreshold);%到直线距离小于阈值的点符合模型,标记为1
          nCurInlyerCount = sum(CurMask);           %计算符合直线模型的点的个数
            %% 选取最佳模型
            if nCurInlyerCount > nMaxInlyerCount    %符合模型的点数最多的模型即为最佳模型
                nMaxInlyerCount = nCurInlyerCount;
                RANSAC_mask = CurMask;
                RANSAC_model = CurModel;
            end
        end
    end
    %% 画最佳模型的拟合结果
    MinX=min(Data(1, :));
    MaxX=max(Data(1, :));
    MinX_Y=-(RANSAC_model(1).*MinX+RANSAC_model(3))./RANSAC_model(2);
    MaxX_Y=-(RANSAC_model(1).*MaxX+RANSAC_model(3))./RANSAC_model(2);
    plot([MinX MaxX],[MinX_Y MaxX_Y],'r-');
    title('ransac在噪声情况下的直线拟合');
    

    %% 用RANSAC方法拟合原理
    % RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。
    % RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
    % 1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
    % 2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
    % 3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
    % 4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
    % 5.最后,通过估计局内点与模型的错误率来评估模型。
    % 这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

    %% 问题分析
    % 1.关于画直线:根据抽取的两点画最终直线,结果不稳定,每次运行后的直线都会有很大偏差。
    % 程序中已经计算出了直线的参数,根据Ax+By+C=0,可以选择数据点中最左边的点和最右边的点确定最终直线,比较稳定。
    % 2.调用函数A时,若有函数B做参数,则在函数B前加@,函数B的参数则另外传送,通过feval可将函数的执行方式统一起来。
    % 3.关于随机点生成:rand的使用灵活多变。

    复制代码
    复制代码
    %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %   FILENAME        TLS.m  
    %   FUNCTION        Calculate Total Least Squares of input data
    %   DATE           2012-10-11
    %   AUTHOR          unkown
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% Total Least Squares      TLS(Data) 
    %Return: [a,b,c] - line in a * x + b * y + c = 0 form
    %                   where a ^ 2 + b ^ 2 = 1
    %   TLS(X,Y) - approximates ALL points in array by one line
    

    function line = TLS(Data)

    if any( size(Data) == 0)
    Line = [0, 0, 0];
    return;
    end

    X = Data(1, ?;
    Y = Data(2, ?;

    len = length(X);

    if size(X) ~= size(Y)
    X = X’;
    end

    M = [ mid(X .^ 2) - mid(X) ^ 2, sum(X .* Y) / len - mid(X) mid(Y);…
    sum(X .
    Y) / len - mid(X) * mid(Y), mid(Y .^ 2) - mid(Y) ^ 2];
    [ev,tmp] = eig(M);

    ind = 2;
    if ErrFunc(X, Y, ev(:, 1)) < ErrFunc(X, Y, ev(:, 2))
    ind = 1;
    end

    line = [ev(1,ind), ev(2,ind),…
    -ev(1,ind) * mid(X) - ev(2,ind) * mid(Y)];

    return;

    % Help function, calculates an error
    function e = ErrFunc(X,Y,L)
    maxE = 0;
    e = 0;
    c = -L(1) * mid(X) - L(2) * mid(Y);
    for i = 1:length(X)
    e = e + ( L(1) * X(i) + L(2) * Y(i) + c )^2;
    if (L(1) * X(i) + L(2) * Y(i) + c )^2 > maxE
    maxE = (L(1) * X(i) + L(2) * Y(i) + c )^2;
    end;
    end

    return;

    % Middle value of vector X
    function l = mid(X)

    if length(X) > 0
    l = sum(X) / length(X);
    else
    l = 0;
    end;

    return;

    复制代码

    (3)基于RANSAC的椭圆拟合

    复制代码
    %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %   FILENAME        ellipsefit.m
    %   FUNCTIPN        Least-squares fit of ellipse to 2D points
    %   DATE            2012-10-12
    %   AUTHOR          zhangying
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%
    clc;
    clear;
    %%  生成 带噪声的椭圆
    % 参数初始化
    g_NumOfPoints = 500;   % 点数
    g_ErrPointPart = 0.4;  % 噪声
    g_NormDistrVar = 3;    % 标准偏差
    a=10;b=20;             %长轴短轴
    angle=60;              %倾斜角
    %% 椭圆生成
    beta = angle * (pi / 180);
    alpha = linspace(0, 360, g_NumOfPoints) .* (pi / 180); 
    X = (a * cos(alpha) * cos(beta)- b * sin(alpha) * sin(beta) )+wgn(1,length(alpha),g_NormDistrVar^2,'linear');    
    Y = (a * cos(alpha) * sin(beta)+ b * sin(alpha) * cos(beta) )+wgn(1,length(alpha),g_NormDistrVar^2,'linear');
    Data=[X;Y];
    plot(Data(1, :), Data(2, :), '.', 'Tag', 'DATA');
    hold on;
    

    %% RANSAC椭圆拟合
    %椭圆一般方程:Ax2+Bxy+Cy2+Dx+Ey+F=0
    %F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)*x(:,2).^2+p(4)*x(:,1)+p(5)

    %% 参数初始化
    nSampLen = 3; %设定模型所依据的点数
    nDataLen = size(Data, 2); %数据长度
    nIter = 50; %最大循环次数
    dThreshold = 2; %残差阈值
    nMaxInlyerCount=-1; %点数下限
    A=zeros([2 1]);
    B=zeros([2 1]);
    P=zeros([2 1]);
    %% 主循环
    for i = 1:nIter
    SampleMask = zeros([1 nDataLen]);
    while sum( SampleMask ) ~= nSampLen
    ind = ceil(nDataLen .* rand(1, nSampLen - sum(SampleMask))); %抽样,选取nSampLen个不同的点
    SampleMask(ind) = 1;
    end
    Sample = find( SampleMask ); %找出非零元素的索引值,即建立模型的点
    %% 建立模型,存储建模需要的坐标点,焦点和过椭圆的一个点
    %椭圆定义方程:到两定点之间距离和为常数
    A(:,1)=Data(:,ind(1)); %焦点
    B(:,1)=Data(:,ind(2)); %焦点
    P(:,1)=Data(:,ind(3)); %椭圆上一点
    DIST=sqrt((P(1,1)-A(1,1)).^2+(P(2,1)-A(2,1)).^2)+sqrt((P(1,1)-B(1,1)).^2+(P(2,1)-B(2,1)).^2);
    xx=[];
    nCurInlyerCount=0; %初始化点数为0个
    %% 是否符合模型?
    for k=1:g_NumOfPoints
    CurModel=[A(1,1) A(2,1) B(1,1) B(2,1) DIST ];
    pdist=sqrt((Data(1,k)-A(1,1)).^2+(Data(2,k)-A(2,1)).^2)+sqrt((Data(1,k)-B(1,1)).^2+(Data(2,k)-B(2,1)).^2);
    CurMask =(abs(DIST-pdist)< dThreshold); %到直线距离小于阈值的点符合模型,标记为1
    nCurInlyerCount =nCurInlyerCount+CurMask; %计算符合椭圆模型的点的个数
    if(CurMask==1)
    xx =[xx,Data(:,k)];
    end
    end
    %% 选取最佳模型
    if nCurInlyerCount > nMaxInlyerCount %符合模型的点数最多的模型即为最佳模型
    nMaxInlyerCount = nCurInlyerCount;
    Ellipse_mask = CurMask;
    Ellipse_model = CurModel;
    Ellipse_points = [A B P];
    Ellipse_x =xx;
    end

    end

    %% 由符合点拟合椭圆
    %椭圆一般方程:Ax2+Bxy+Cy2+Dx+Ey+F=0
    F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)x(:,2).^2+p(4)x(:,1)+p(5)x(:,2)+p(6);
    p0=[1 1 1 1 1 1];
    x=Ellipse_x’;
    pr=nlinfit(x,zeros(size(x,1),1),F,p0); % 拟合系数,最小二乘方法
    xmin=min(x(:,1));
    xmax=max(x(:,1));
    ymin=min(x(:,2));
    ymax=max(x(:,2));
    %% 画点作图
    plot(Ellipse_points(1?,Ellipse_points(2?,'r
    ’);
    hold on;
    plot(Ellipse_x(1?,Ellipse_x(2?,‘yo’);
    hold on;
    ezplot(@(x,y)F(pr,[x,y]),[-1+xmin,1+xmax,-1+ymin,1+ymax]);
    title(‘RANSAC椭圆拟合’);
    legend(‘样本点’,‘抽取点’,‘符合点’,‘拟合曲线’)
    %% 问题分析
    % 1.关于如何生成随机点:在标准椭圆基础上,添加高斯白噪声–wgn();
    % 2.关于如何建立椭圆模型:
    % 方案一:椭圆一般方程:Ax2+Bxy+Cy2+Dx+Ey+F=0,认为由5个点确定一个椭圆,则用5个点代入方程式去做椭圆拟合,结果大多数
    % 情况下画出双曲线,放弃;
    % 方案二:利用椭圆定义:到两定点之间距离和为常数2a,选择平面内3个点,两个焦点,一个过椭圆的点,确定椭圆。
    % 3.关于如何筛选符合条件的点:此时计点到椭圆距离过于复杂,用定义,到两焦点距离和与2a相差小于一定阈值,则符合。
    % 4.关于拟合函数:使用nlinfit,对于输入参数的维数有要求,需要x为N
    P维,y为n
    1维,注意是列向量。
    % 5.关于如何画椭圆:与一般的画图指定X和Y不同,此时要画的是函数图形,在网上查到,先建立函数F,再利用
    % ezplot(@(x,y)F(pr,[x,y]))可画出函数图形。
    % 6.数据为随机产生,程序每次运行结果会不一样,在B(:,1)=Data(:,ind(2));时有时会数组越界出错,但单步调试时没问题,
    % 原因还未找到。
    %%

    复制代码

    6.学习经验
    (1)不能太依赖于现有函数,要多自己想算法,即便借用别人的函数,也要弄清楚原理及调用方式;

    (2)matlab函数库不熟悉,要多用help;

    (3)编写程序时要先总体规划好程序架构,模块化,条理清楚,自己要懂得自己程序的每一步原理。

    (4)理论的力量是无穷的,要在理论深入理解的基础上进行代码优化。


    转自http://www.cnblogs.com/yingying0907/archive/2012/10/13/2722149.html

    展开全文
  • 最小二乘椭圆拟合(C++代码,Matlab代码) 一、基本原理 椭圆拟合基本原理推导 二、C++代码 头文件ellipsefitting.h #include <iostream> #include <fstream> #include <vector> #include <...
  • %椭圆中心坐标a=vout.A;b=vout.B;alpha=vout.Phi;%长轴,短轴,旋转角度ind=1:length(x');;t=alpha; %t为长轴与X轴正方向的夹角%% 防止在计算反正切的时候分母是0tmp=x(1,ind)-z(1);tzeros=find(tmp==0);tmp(tz...
  • 椭圆拟合(python)

    2020-12-04 22:39:02
    A[5]=A5 return A def normal_style(paras): print('计算标准椭圆位置.....') #solve_tuoyuan.return A paras=paras/paras[5] A,B,C,D,E=paras[:5] #椭圆中心 x0=(B*E-2*C*D)/(4*A*C-B**2) y0=(B*D-2*A*E)/(4*A*C-B*...
  • (MATLAB)散点椭圆拟合与绘制代码

    千次阅读 2021-02-25 15:47:48
    MATLAB二维平面散点的单椭圆拟合
  • 基于代数距离的椭圆拟合的优化及应用研究. 论文,具体可以自己看看
  • 这是应用信任区域最小化方案时的椭圆拟合版本。 最准确和稳健的拟合可最大限度地减少从观察点到拟合曲线的几何(正交)距离。 信任区域算法需要计算距离及其相对于椭圆参数的导数。 所以这个方法是通过使用隐式微分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,964
精华内容 2,785
关键字:

椭圆拟合