2014-06-18 128 views
2

我試圖用C#使用EmguCV 2.2來檢測此圖像中的圓圈,但沒有任何運氣。EmguCV和OpenCV中的HoughCircles之間有什麼區別?

enter image description here

使用的OpenCV與CV2蟒包下列代碼正確地發現上述圖像中的8圈:

img = cv2.imread('test2.png') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 10, param1=15, param2=10, minRadius=5, maxRadius=5) 

爲了簡潔我將省略代碼以圓圈繪製到IMG ,但參考的輸出 - 假設我用cv2.circle來填充每個發現圓,綠色,看起來像:

enter image description here

但是我似乎無法找到使用C#的那些相同的圓圈。

我打得四處相當的參數,而是試圖代碼,如下面的圖像中沒有找到任何圈子:

var gray = new Image<Gray, byte>("test2.png"); 
var circles = gray.HoughCircles(
       accumulatorThreshold: new Gray(16), dp: 1, 
       cannyThreshold: new Gray(9), 
       minDist: 10, minRadius: 4, maxRadius: 6)[0]; 

任何發現的8圈與C#的幫助將不勝感激!

在此先感謝您的幫助!

回答

4

我用下面的代碼查找霍夫圓

Image<Bgr, byte> Img_Result_Bgr = new Image<Bgr, byte>(Img_Source_Gray.Width, Img_Source_Gray.Height); 
CvInvoke.cvCvtColor(Img_Source_Gray.Ptr, Img_Result_Bgr.Ptr, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_GRAY2BGR); 
Gray cannyThreshold = new Gray(12); 
Gray circleAccumulatorThreshold = new Gray(26); 
double Resolution = 1.90; 
double MinDistance = 10.0; 
int MinRadius = 0; 
int MaxRadius = 0; 

CircleF[] HoughCircles = Img_Source_Gray.Clone().HoughCircles(
         cannyThreshold, 
         circleAccumulatorThreshold, 
         Resolution, //Resolution of the accumulator used to detect centers of the circles 
         MinDistance, //min distance 
         MinRadius, //min radius 
         MaxRadius //max radius 
         )[0]; //Get the circles from the first channel 
#region draw circles 
foreach (CircleF circle in HoughCircles) 
    Img_Result_Bgr.Draw(circle, new Bgr(Color.Red), 2); 
#endregion 

imageBox1.Image = Img_Result_Bgr; 

這裏是Program Output

也因爲這些圈子是分開的,我寧願使用最小包圍圓方法來找到這些圈子座標。 Refer this link

很容易找到這些圓的座標:

  1. 查找輪廓這個二進制圖像。
  2. 循環遍歷每個輪廓。
  3. 將輪廓點轉換爲點集合。
  4. 找到該點集合的MinEnclosingCircle()。
  5. 準確獲得每個圈子的協調員。
相關問題