11 de enero de 2011

Hough Circles

La función cv.Houghcircles tiene como objetivo, encontrar círculos en una imagen por medio de la transformada de Hough. El algoritmo para la detección esta bastante bien explicado en el libro "Learning OpenCV" (pag. 158).
El gran problema que nos encontramos en OpenCV cuando trabajamos en Python es que en la documentación oficial no existe registro de la función HoughCircles a pesar de que la función si existe y se puede usar como mostrare mas adelante.

Como cualquier otra función, Houghcircles recibe una serie de argumentos que le permite realizar la detección de círculos.

cv.HoughCircles(image,circle_storage,method,dp,min_dist,param1=None,param2=None,Min_radius=None,Max_radius=None)

image: imagen a la que se le va a realizar la detección de los círculos. Debe ser una imagen de 8 bits en escala de grises.

circle_storage: Esta puede ser una variable de dos tipos un vector (cv.createMat) o un almacenamiento de memoria (cv.createMemStorage). La elección depende de como se quieren los resultados devueltos por la función. Si es un vector debe ser de una sola columna y de tipo CV_32FC3. Cada espacio de este vector contendrá una tupla de 3 espacios los cuales son la posición en X y en Y del circulo y el radio. Si se hace con un cv.createMemStorage, OpenCV creara la secuencia donde guardara los mismos datos. Sin embargo en Python no logre hacer funcionar el método del almacenamiento de memoria. Solo se puede esperar a que el equipo de OpenCV, documente esta función para Python. Por esta razón tuve que trabajar a prueba y error para poder detectar círculos.

method: el método siempre debe ser configurado como cv.CV_HOUGH_GRADIENT

dp: es el acumulador de la imagen, este es uno de los dos valores que se modifican para obtener mejores resultados.

min_dist: Este valor es la mínima distancia que debe existir entre dos círculos para que sean considerados círculos diferentes.

Estos son los parámetros usados en el ejemplo que se presenta. La explicación de los otros parámetros puede ser encontrada en el libro.

Resultado:

Imagen original


Detección de círculos con cv.houghcircles

Código:

6 comentarios:

  1. Enhorabuena por el blog. Para los que estén aprendiendo python y opencv como yo, les será de gran ayuda. Ánimo y sigue con el blog. Aquí tienes a un fiel seguidor

    ResponderEliminar
  2. Excelente Blog lo felicito, me ha sido de gran ayuda, aqui tenes otro seguidor

    ResponderEliminar
  3. Estoy tratando de adaptar esto a una webcam pero no me anda bajo ningun punto. Alguna sugerencia?

    Muy bueno tu blog!

    import cv

    cv.NamedWindow('Camera', cv.WINDOW_AUTOSIZE)
    capture = cv.CreateCameraCapture(0)

    while True:
    frame = cv.QueryFrame(capture)

    image_size = cv.GetSize(frame)

    # create gray version

    gray = cv.CreateImage(image_size, 8, 1)
    edge = cv.CreateImage(image_size, 8, 1)

    # Creo el storage
    storage = cv.CreateMat(1,50, cv.CV_32FC3)

    # La pongo en grises
    cv.CvtColor(frame, gray, cv.CV_RGB2GRAY)

    # Smooth - Suaviza
    cv.Smooth(gray,gray,cv.CV_GAUSSIAN,5,5)

    # equalize histogram - Resalta
    #cv.EqualizeHist(gray, gray)

    cv.Canny(gray, edge, 1, 3, 5)

    cv.HoughCircles(gray, storage, cv.CV_HOUGH_GRADIENT,1,100)

    print storage.cols

    k = cv.WaitKey(10)
    if k == 0x1b: # ESC
    print 'ESC pressed. Exiting ...'
    break

    ResponderEliminar
  4. Hola matias estuve mirando tu codigo y la linea cv.NamedWindow('Camera', cv.WINDOW_AUTOSIZE) presenta problemas... esta linea no es necesaria ya que no estas mostrando nada por lo que no hay necesidad de crear una ventana...

    Si me dijeras q tratas de hacer con el programa podria ayudarte mejor

    Saludos

    ResponderEliminar
  5. Rafa, cual es el libro al q te refieres?

    ResponderEliminar