2012-02-25 17 views
6

Estoy tratando de detectar círculos usando Android. Logré implementar el algoritmo de detección de líneas, pero no se muestra nada al probar el algoritmo de dibujo en círculos.Detectando Círculos Hough

Aquí está mi código:

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); 

     } 

Respuesta

6

Es posible que haya llegado tan ordenados por ahora, pero algunas cosas. Comprobaría que la estera de tus círculos en realidad tiene algunos resultados; a veces vCircle parece volver nulo; probar una de las otras versiones de 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); 
     } 

(Cambié el código en la mina, renombraron algunas cosas y lo cambió atrás, yo creo Tengo que volver por lo que funciona ...)

B.

Cuestiones relacionadas