https://blog.csdn.net/Jacky_Ponder/article/details/70314919

1.1最小二乘擬合圓介紹與推導.
最小二乘法(least squares analysis)是一種數學優化技術,它通過最小化誤差的平方和找到一組資料的最佳函式匹配。最小二乘法是用最簡的方法求得一些絕對不可知的真值,而令誤差平方之和為最小來尋找一組資料的最佳匹配函式的計算方法,最小二乘法通常用於曲線擬合 (least squares fitting) 。最小二乘圓擬合方法是一種基於統計的檢測方法,即便是影象中圓形目標受光照強度不均等因素的影響而產生邊緣缺失,也不會影響圓心的定位和半徑的檢測,若邊緣定位精確輪廓清晰,最小二乘法可實現亞畫素級別的精確擬合定位。
這裡有擬合圓曲線的公式推導過程和vc實現。
1.2VC實現的程式碼
[cpp] view plain copy
<code class="language-cpp">void CViewActionImageTool::LeastSquaresFitting()  
{  
    if (m_nNum<3)  
    {  
        return;  
    }  
    int i=0;  
    double X1=0;  
    double Y1=0;  
    double X2=0;  
    double Y2=0;  
    double X3=0;  
    double Y3=0;  
    double X1Y1=0;  
    double X1Y2=0;  
    double X2Y1=0;  
    for (i=0;i<m_nNum;i++)  
    {  
        X1 = X1 + m_points[i].x;  
        Y1 = Y1 + m_points[i].y;  
        X2 = X2 + m_points[i].x*m_points[i].x;  
        Y2 = Y2 + m_points[i].y*m_points[i].y;  
        X3 = X3 + m_points[i].x*m_points[i].x*m_points[i].x;  
        Y3 = Y3 + m_points[i].y*m_points[i].y*m_points[i].y;  
        X1Y1 = X1Y1 + m_points[i].x*m_points[i].y;  
        X1Y2 = X1Y2 + m_points[i].x*m_points[i].y*m_points[i].y;  
        X2Y1 = X2Y1 + m_points[i].x*m_points[i].x*m_points[i].y;  
    }  
    double C,D,E,G,H,N;  
    double a,b,c;  
    N = m_nNum;  
    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;  
    double A,B,R;  
    A = a/(-2);  
    B = b/(-2);  
    R = sqrt(a*a+b*b-4*c)/2;  
    m_fCenterX = A;  
    m_fCenterY = B;  
    m_fRadius = R;  
    return;  
}</code>  
--------------------- 
作者:Jacky_Ponder 
來源:CSDN 
原文:https://blog.csdn.net/Jacky_Ponder/article/details/70314919