我狂想一下啊
在一条弧上取一个点A,找临弧上点B
只要这个AB距离是最短的,这个AB直线必过圆心
找两条这个的线,交点,就是圆心
有了圆心,与弧上随便哪个点的距离都是半径

解决方案 »

  1.   

    你可以先纵横投影确定包含白色的最小矩形,再hough变换。
    快一点的办法,可以从上下两端搜索边界,用边界点拟合圆。有了圆心就好弄了。
      

  2.   

    取弧形连通区域边界点,拟合圆。下面是拟合圆的函数
    void TSL_Com_LeastSquaresFitting(CList<CPoint, CPoint &> & ltPt,MyCirStu &cir)
    {    
    if (ltPt.GetCount()<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;   
    POSITION pos=ltPt.GetHeadPosition();
    CPoint temppt;
    for (i=0;i<ltPt.GetCount();i++)    
    {        
    temppt = ltPt.GetNext(pos);
    X1 = X1 + temppt.x;       
    Y1 = Y1 + temppt.y;       
    X2 = X2 + temppt.x*temppt.x;        
    Y2 = Y2 + temppt.y*temppt.y;       
    X3 = X3 + temppt.x*temppt.x*temppt.x;       
    Y3 = Y3 + temppt.y*temppt.y*temppt.y;        
    X1Y1 = X1Y1 + temppt.x*temppt.y;       
    X1Y2 = X1Y2 + temppt.x*temppt.y*temppt.y;   
    X2Y1 = X2Y1 + temppt.x*temppt.x*temppt.y;    
    }   
    double C,D,E,G,H,N;   
    double a,b,c;   
    N = ltPt.GetCount();  
    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;    
    cir.CirCenter.x = int(A+0.5);    
    cir.CirCenter.y = int(B+0.5);    
    cir.iRadius = int(R+0.5);    
    return;
    }
      

  3.   

    你好,已经很强大了,我现在用的方法是直接细化图像,然后取外接方框的上下值差取得直径,能把这个程序发给我看看嘛?我c学的不精,能读懂程序的水平,我邮箱[email protected]
      

  4.   

    楼主  可以给这个程序代码发给我看看不 我也是类似的问题 愁死我了 [email protected]  如果没有了源代码可以给个详细点的思路不?
    谢谢