2012-02-25 102 views
6

我想要檢測使用android的圈子。我成功實現了檢測線算法,但在嘗試繪製圓圈算法時沒有任何顯示。檢測Hough圈android

這裏是我的代碼:

Mat thresholdImage = new Mat(getFrameHeight() + getFrameHeight()/2, getFrameWidth(), CvType.CV_8UC1); 
      mYuv.put(0, 0, data); 
      Imgproc.cvtColor(mYuv, destination, Imgproc.COLOR_YUV420sp2RGB, 4); 
      Imgproc.cvtColor(destination, thresholdImage, Imgproc.COLOR_RGB2GRAY, 4); 
      Imgproc.GaussianBlur(thresholdImage, thresholdImage, new Size(9, 9), 2, 2); 

     Mat circles = new Mat(); 


     Imgproc.HoughCircles(thresholdImage, circles, Imgproc.CV_HOUGH_GRADIENT, 1d, (double)thresholdImage.height()/70, 200d, 100d); 

     Log.w("circles", circles.cols()+""); 
     for (int x = 0; x < circles.cols(); x++) 
     { 
       double vCircle[]=circles.get(0,x); 

       Point center=new Point(Math.round(vCircle[0]), Math.round(vCircle[1])); 
       int radius = (int)Math.round(vCircle[2]); 
       // draw the circle center 
       Core.circle(destination, center, 3,new Scalar(0,255,0), -1, 8, 0); 
       // draw the circle outline 
       Core.circle(destination, center, radius, new Scalar(0,0,255), 3, 8, 0); 

     } 

回答

6

你可能會得到這個現在排序,但幾件事情。我會檢查你的圈子實際上有一些結果;有時vCircle似乎回到空;嘗試HoughCircles的其他版本之一:

iCannyUpperThreshold = 100; 
iMinRadius = 20; 
iMaxRadius = 400; 
iAccumulator = 300; 

Imgproc.HoughCircles(thresholdImage, circles, Imgproc.CV_HOUGH_GRADIENT, 
     2.0, thresholdImage.rows()/8, iCannyUpperThreshold, iAccumulator, 
     iMinRadius, iMaxRadius); 

if (circles.cols() > 0) 
    for (int x = 0; x < circles.cols(); x++) 
     { 
     double vCircle[] = circles.get(0,x); 

     if (vCircle == null) 
      break; 

     Point pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1])); 
     int radius = (int)Math.round(vCircle[2]); 

     // draw the found circle 
     Core.circle(destination, pt, radius, new Scalar(0,255,0), iLineThickness); 
     Core.circle(destination, pt, 3, new Scalar(0,0,255), iLineThickness); 
     } 

(我換你的代碼到礦井,改名一些東西,換回來,我覺得所以它的工作原理我已經恢復了過來......)

B.