自己想做一個圓的直徑和圓心檢測,已經canny邊緣提取并進行一次閉運算(邊緣提取前已經濾波和灰度化),現在想準確的獲得兩個圓的直徑以及圓心并輸出結果,自己第一次做,希望各位前輩能給些思路和解決辦法。 謝謝
uj5u.com熱心網友回復:
僅供參考://////////////////////////////////////////////////////////////////////////
//判斷輪廓是不是一個圓,通過輪廓的面積pi*r*r的差異,判斷是不是圓。
//contour:輸入輪廓
//minRadius: 半徑長度至少大于minRadius
//////////////////////////////////////////////////////////////////////////
BOOL isCircleContour(vector<Point>& contour,double minRadius)
{
BOOL isCircle = FALSE;
//double perimeter = arcLength(contour,TRUE);
double perimeter = arcLength(contour,FALSE);
double perimeter2 = arcLength(contour,TRUE);
Rect rect =boundingRect(contour);
double r = (rect.width+rect.height)/4.0; //半徑約等于輪廓外接矩的邊長/2
double area=contourArea(contour);
double pi=3.1415926;
//cout<<"x/y/width/height\t"<<rect.x<<" "<<rect.y<<" "<<rect.width<<" "<<rect.height<<endl;
//cout<<"perimeter:FALSE\t"<<perimeter<<endl;
//cout<<"perimeter2:TRUE\t"<<perimeter2<<endl;
//cout<<"area:\t"<<area<<endl;
//cout<<"r: "<<r<<" 計算出周長: "<<2*pi*r<<" 計算出面積: "<<pi*r*r<<endl;
double perimeterDiffRatio = fabs(2*pi*r - perimeter)*2.0/(2*pi*r + perimeter) *100;
double areaDiffRatio = fabs(pi*r*r - area)*2.0/(pi*r*r + area) *100;
double sideDiffRatio = abs(rect.width-rect.height)*2.0/(rect.width+rect.height)*100;
//CString CstrInfo3;
//CstrInfo3.Format(_T(" perimeterDiffRatio: %f\n areaDiffRatio: %f \n sideDiffRatio:%f"),perimeterDiffRatio,areaDiffRatio,sideDiffRatio);
//AfxMessageBox(CstrInfo3);
if (r>minRadius)
{
cout<<"周長差異百分比: "<<perimeterDiffRatio<<"%"<<endl;;
cout<<"面積差異百分比: "<<areaDiffRatio<<"%"<<endl;
cout<<"邊長差異百分比: "<<sideDiffRatio<<"%"<<endl;;
cout<<endl<<endl;
}
//原始的
//const double areaDiffThresh = 18.0; //目前統計的,最大的面積差2.58%
//const double perimeterDiffThresh = 15; //目前統計的,最大的周長差5.65%
//const double sideDiffThresh = 15; //目前統計的,最大的邊長差7.3%
//const double avgDiffThresh = 15.0; //三個差異比值的加權平均要求小于5.0;
const double areaDiffThresh = 5; //目前統計的,最大的面積差2.58%
const double perimeterDiffThresh =7.25; //目前統計的,最大的周長差5.65%
const double sideDiffThresh = 10; //目前統計的,最大的邊長差7.3%
const double avgDiffThresh = 5.0; //三個差異比值的加權平均要求小于5.0;
double avdDiffRatio = (areaDiffRatio+perimeterDiffRatio+sideDiffRatio)/3.0;
//計算出的輪廓周長是半徑的2*pi倍數
if( (areaDiffRatio <areaDiffThresh)
&& (perimeterDiffRatio <perimeterDiffThresh)
&& (sideDiffRatio <sideDiffThresh)
&&(avdDiffRatio<avgDiffThresh)
&& (r>minRadius) )
{
isCircle = TRUE;
}
return isCircle;
}
uj5u.com熱心網友回復:
趙老師,我這兩個圓都能檢測出來嗎? 如果在拍攝程序中并不垂直,所獲得的圓有點橢圓會不會影響效果 怎么消除這種影響 謝謝老師uj5u.com熱心網友回復:
放松限制范圍唄uj5u.com熱心網友回復:
霍夫變換!網上有代碼!不一定非要用opencvuj5u.com熱心網友回復:
這個用Matlab 解決比較方便,二值化,然后用regionprops那個函式,找出區域的面積,中心點等屬性轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/76891.html
標籤:圖形處理/算法
上一篇:MFC程式如何識別多個游戲手柄?
