1. 程式人生 > >如何判斷輪廓是否為圓 如何判斷輪廓是否為圓?

如何判斷輪廓是否為圓 如何判斷輪廓是否為圓?

如何判斷輪廓是否為圓?

如何判斷輪廓是否為圓?     判斷一個輪廓是否為圓?這看似簡單的問題,在opencv中並沒有現成的函式。當我真正想運用的時候,卻發現還是有許多內容在裡面的。                比如這幅圖片,由於瓶口是有缺陷的,造成找到的最大外輪廓不閉合。那麼該如何判斷這個輪廓是否是圓了。      我認為從兩點來考慮。      
一個是圓的定義:
   “平面上到定點的距離等於定長的所有點組成的圖形叫做圓.定點稱為圓心,定長稱為半徑.”       那麼就來判斷當前輪廓到一個定點的距離是否為定長。這裡這個定點就可以採用外接圓圓心。而這裡的度量是標準差。        經過試驗發現,對於這些有缺陷的情況,其標準差都是比較大的(一般大於5),而對於沒有缺陷的情況來說,其標準差都比較小(小於1)。        但是這並不能完全地解決問題,比如存在這樣的情況,其輪廓上所有點到定點的標準差也是不大的,但是這個輪廓沒有構成一個閉合曲線,所以也沒有構成圓。

     
  1.    //根據輪廓點和圓心計算方差
  2. float ComputeVariance(std::vector<cv::Point> theContour,Point2f theCenter)
  3. {
  4.     int a[65535],n;
  5.     float aver,s;
  6.     
    float sum=0,e=0;
  7.     n = theContour.size();
  8.     for(int i=0;i<n;i++)
  9.     {
  10.         a[i] = GetDistance(theContour[i],theCenter);
  11.         sum+=a[i];
  12.     }
  13.     aver=sum/n;
  14.     for(int i=0;i<n;i++)
  15.         e+=(a[i]-aver)*(a[i]-aver);
  16.     e/=n-1;
  17.     s=sqrt(e);
  18.     return e;
  19. }
          那麼二點就是曲線閉合的定義.        閉曲線:起點與終點重合的曲線。平面(或空間)中的閉曲線即為單位圓周到平面(或空間)中的連續對映的像。       不是很好理解,但是可以這樣簡化,就是對於閉曲線中的任意一點,遍歷閉曲線,都能夠回到這一點。換句話說,就是不存在“端點”。這裡可以再轉換為這樣的理解:         “對於閉曲線中的所有點,除了它本身之外,和這個點距離為最小值(比如1)的點都有兩個。”
  1. //判斷輪廓是否閉合。閉合曲線返回為0
  2. intComputeClose(std::vector<cv::Point>MaxContour)
  3. {
  4. //TODO 計算第一個點和最後一個點相對於圓心的角度.最後變成計算這兩點的距離
  5. int itmp =0;
  6. int iret =0;
  7. for(int i=0;i<MaxContour.size();i++)
  8. {
  9. for(int j=0;j<MaxContour.size();j++)
  10. {
  11. if(i!=j)
  12. {
  13. if(GetDistance(MaxContour[i],MaxContour[j])<1.42 )//感謝 李大本事 
  14. {
  15. itmp++;
  16. }
  17. }
  18. }
  19. if(itmp ==1)//存在端點
  20. {
  21. iret ++;
  22. }
  23. itmp=0;
  24. }
  25. return iret;
  26. }
        小結一下:數學還是很強的,很多時候,藉助定義本身,能夠解決問題。               



來自為知筆記(Wiz)


來源: <http://www.cnblogs.com/jsxyhelu/p/4503900.html>  



來自為知筆記(Wiz)

如何判斷輪廓是否為圓?     判斷一個輪廓是否為圓?這看似簡單的問題,在opencv中並沒有現成的函式。當我真正想運用的時候,卻發現還是有許多內容在裡面的。                比如這幅圖片,由於瓶口是有缺陷的,造成找到的最大外輪廓不閉合。那麼該如何判斷這個輪廓是否是圓了。      我認為從兩點來考慮。       一個是圓的定義:    “平面上到定點的距離等於定長的所有點組成的圖形叫做圓.定點稱為圓心,定長稱為半徑.”       那麼就來判斷當前輪廓到一個定點的距離是否為定長。這裡這個定點就可以採用外接圓圓心。而這裡的度量是標準差。        經過試驗發現,對於這些有缺陷的情況,其標準差都是比較大的(一般大於5),而對於沒有缺陷的情況來說,其標準差都比較小(小於1)。        但是這並不能完全地解決問題,比如存在這樣的情況,其輪廓上所有點到定點的標準差也是不大的,但是這個輪廓沒有構成一個閉合曲線,所以也沒有構成圓。
     
  1.    //根據輪廓點和圓心計算方差
  2. float ComputeVariance(std::vector<cv::Point> theContour,Point2f theCenter)
  3. {
  4.     int a[65535],n;
  5.     float aver,s;
  6.     float sum=0,e=0;
  7.     n = theContour.size();
  8.     for(int i=0;i<n;i++)
  9.     {
  10.         a[i] = GetDistance(theContour[i],theCenter);
  11.         sum+=a[i];
  12.     }
  13.     aver=sum/n;
  14.     for(int i=0;i<n;i++)
  15.         e+=(a[i]-aver)*(a[i]-aver);
  16.     e/=n-1;
  17.     s=sqrt(e);
  18.     return e;
  19. }
          那麼二點就是曲線閉合的定義.        閉曲線:起點與終點重合的曲線。平面(或空間)中的閉曲線即為單位圓周到平面(或空間)中的連續對映的像。       不是很好理解,但是可以這樣簡化,就是對於閉曲線中的任意一點,遍歷閉曲線,都能夠回到這一點。換句話說,就是不存在“端點”。這裡可以再轉換為這樣的理解:         “對於閉曲線中的所有點,除了它本身之外,和這個點距離為最小值(比如1)的點都有兩個。”
  1. //判斷輪廓是否閉合。閉合曲線返回為0
  2. intComputeClose(std::vector<cv::Point>MaxContour)
  3. {
  4. //TODO 計算第一個點和最後一個點相對於圓心的角度.最後變成計算這兩點的距離
  5. int itmp =0;
  6. int iret =0;
  7. for(int i=0;i<MaxContour.size();i++)
  8. {
  9. for(int j=0;j<MaxContour.size();j++)
  10. {
  11. if(i!=j)
  12. {
  13. if(GetDistance(MaxContour[i],MaxContour[j])<1.42 )//感謝 李大本事 
  14. {
  15. itmp++;
  16. }
  17. }
  18. }
  19. if(itmp ==1)//存在端點
  20. {
  21. iret ++;
  22. }
  23. itmp=0;
  24. }
  25. return iret;
  26. }
        小結一下:數學還是很強的,很多時候,藉助定義本身,能夠解決問題。               



來自為知筆記(Wiz)


來源: <http://www.cnblogs.com/jsxyhelu/p/4503900.html>