2012-02-25 61 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.