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:
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
ResponderEliminarExcelente Blog lo felicito, me ha sido de gran ayuda, aqui tenes otro seguidor
ResponderEliminarEstoy tratando de adaptar esto a una webcam pero no me anda bajo ningun punto. Alguna sugerencia?
ResponderEliminarMuy 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
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...
ResponderEliminarSi me dijeras q tratas de hacer con el programa podria ayudarte mejor
Saludos
Rafa, cual es el libro al q te refieres?
ResponderEliminaroh
ResponderEliminar