2012-06-30 21 views
6

Después de procesar una imagen mediante la conversión a escala de grises y luego borrando, estoy tratando de aplicar una transformación de Hough círculo con estos parámetros:HoughCircles parámetros para reconocer las bolas

  • CV_HOUGH_GRADIENT
  • dp = 1
  • min_dist = 1
  • param_1 = 70
  • param_2 = 100
  • min_radius = 0
  • max_radius = 0

Aquí es una de las muchas imágenes que he probado: http://i.stack.imgur.com/JGRiM.jpg

Pero el algoritmo falla en reconocer la pelota incluso con parámetros relajados.

(Cuando lo intento con una imagen de un círculo creado en GIMP trabaja muy bien)

Respuesta

0

Registro de salida Canny de sus imágenes en primer lugar. A partir de esta salida de Canny, es posible detectar la bola con un param_2 muy pequeño, así como muchos círculos falsos en la imagen. (He usado por ejemplo param_2 = 10, y con centro de bola especificado para eliminar círculos falsos, funciona)

Intenta ayudar a Hough Circle Transform. La tarea es segmentar la bola de otros elementos. En su imagen, el problema es la línea, puede tratar de segmentar la pelota usando colores, por ejemplo.

+0

¿Puede explicar su metodología un poco más lejos? (Cómo hacer para proporcionar el centro de pelota especificado). Si tuviera una pelota, aproximadamente en el medio de la imagen que ocupaba del 60 al 70 por ciento del encuadre. ¿Cómo podría determinar los mejores parámetros? – jluzwick

+2

Puede detectar todos los círculos con param_2 muy bajo. Eso te dará muchos círculos falsos. Entonces si conoces el centro aproximadamente. Puedes hacer la eliminación. Simplemente itere sobre todos los círculos y elimínelos, cuya distancia a la aproximación central especificada es mayor que algún delta. – krzych

+0

¡Ah, listo! Sí, eso es realmente muy útil. – jluzwick

9

Estoy de acuerdo con krzych. lo tenía trabajando sin esfuerzo con:

cv::Mat img,img2; 
std::vector<cv::Vec3f> circles; 
img = cv::imread("JGRiM.jpg",1); 
cv::bilateralFilter(img, img2, 15, 1000, 1000); 
cv::cvtColor(img2, img2,CV_BGR2GRAY); 
cv::HoughCircles(img2, circles, CV_HOUGH_GRADIENT, 1,300,50, 10); 
cv::circle(img2,cv::Point(circles[0][0],circles[0][1]),circles[0][2],cv::Scalar(126),2); 
cv::imshow("test",img2); 

cv::waitKey(0); 
cv::imwrite("test.jpg",img2); 
return 0; 

enter image description here

Buena suerte :)

+0

¿Puede explicar cómo llegó a sus números con un poco más de detalle? Intento hacer algo similar y me gustaría descubrir cómo calcular los mejores números para adaptarlos a mi solución. ¡Gracias! – jluzwick

+4

minDist = 300 (px) para que encontremos solo un círculo (un valor pequeño encontraría un círculo múltiple alrededor de la bola). minRad = 10 por lo que evitamos contar círculos pequeños (ruido). para los otros parámetros, tuve suerte: p (esta imagen fue muy robusta a los cambios) –

+0

¡Gracias! Eso fue muy útil. ¿Qué pasa con el filtro bilateral? He estado tratando de encontrar una buena explicación de los parámetros en más de un discurso de un profano. Algún consejo sobre eso? – jluzwick

Cuestiones relacionadas