? DETECCIÓN DE ROSTROS ? con Haar Cascades Python – OpenCV
En el post de hoy vamos a tratar el tema de la detección de rostros y como emplear OpenCV para detectarlos usando un clasificador basado en Haar Cascades. Puedes encotrar la infomación de esde post en el video que aparece en un principio y puedes visitar mi repositorio en Github.
El contenido que veremos hoy será el siguiente:
- ¿Qué es la detección de rostros?
- Pero, ¿Te has preguntado cómo es posible detectar un rostro en una imagen?
- Haar Cascades Python – OpenCV
- detectMultiScale
- ¡Ahora, programemos! Detección de rostros sobre una imagen
- Manipulando image
- Manipulando scaleFactor
- Manipulando minNeighbors
- Manipulando minSize
- Manipulando maxSize
- Detección de rostros en video
¿Qué es la detección de rostros?
La detección de rostros es una técnica que permite encontrar en una imagen, el rostro o cara de una o varias personas, mientras que ignora el fondo de la imagen u otros objetos que estén presentes dentro de ella.
Está presente en muchas aplicaciones que usamos día a día, por ejemplo en facebook con las imágenes que subimos que ya detectan el rostro y lo que muchas veces nos pide es adicionar el nombre de la o las personas que allí aparecen. También tenemos los filtros de instagram en donde se necesita detectar el rostro para que los filtros que deseemos aplicar sean empleados. Incluso está presente en algunas aplicaciones bancarias o cuando usamos un smartphone para tomar una foto y muestra en un recuadro o círculo los rostros de las personas que aparecen allí.
Pero, ¿Te has preguntado cómo es posible detectar un rostro en una imagen?
Sin duda esta no es una tarea fácil para el computador, por ello necesitamos que este ‘aprenda’ para lo cual empleamos machine learning o aprendizaje automático.
En un principio se necesita de una gran cantidad de imágenes para entrenar a un clasificador, para que este pueda discernir entre la presencia de un objeto y la no presencia del mismo. Por ejemplo para realizar un detector de rostros se requieren imágenes positivas (es decir imágenes con rostros) e imágenes negativas (que serían imágenes que no contengan rostros). Luego se procederá a la extracción de características de todas las imágenes, para después emplear un enfoque de machine learning y proceder con el entrenamiento. Finalmente se podrá obtener el clasificador.
Ahora que tenemos en cuenta este proceso, veamos brevemente la detección facial usando Haar Cascade. Este detector de objetos usa el método propuesto en el paper “Rapid Object Detection using a Boosted Cascade of Simple Features».
Y teniendo el mismo esquema que estamos tratando, tenemos las imágenes positivas y negativas. Para este caso la extracción de características es realizada con características de Haar, mientras que para entrenar el clasificador se usa una cascada de clasificadores que descartará las áreas que no sean considerados rostros, mientras que seguirá analizando los posibles candidatos a ser un rostro. Obteniendo finalmente el detector de rostros.
Haar Cascades Python – OpenCV
OpenCV nos ofrece clasificadores pre entrenados no solo de rostros de personas (como el que usaremos en este post), sino de ojos, sonrisa, caras de gatitos, entre otros. Puedes encontrar estos archivos XML en la carpeta: opencv/data/haarcascades/, o puedes encontrarlos en el repositorio de OpenCV en github: https://github.com/opencv/opencv/tree/master/data/haarcascades.
detectMultiScale
Para emplear la detección de rostros con haar cascade en OpenCV vamos a necesitar del módulo detectMultiScale que ayudará a detectar los objetos de acuerdo al clasificador que se utilice. Este nos permitirá obtener un rectángulo delimitador en donde se encuentre el objeto que se desea encontrar dentro de una imagen, para ello se deben especificar algunos argumentos que veremos a continuación (Puedes consultar otros que se pueden usar en la documentación de OpenCV):
Image: Es la imagen en donde va a actuar el detector de rostros.
ScaleFactor: Este parámetro especifica que tanto va a ser reducida la imagen. Por ejemplo si se ingresa 1.1, quiere decir que se va a ir reduciendo la imagen en 10%, con 1.3 se reducirá 30%, creando de esta manera una pirámide de imágenes. Hay algo que debemos tener en cuenta y es que si damos un número muy alto, se pierden algunas detecciones. Mientras que para valores muy pequeños como por ejemplo 1,01 (es decir reducir en un 1% la imagen), llevará mayor tiempo de procesamiento, ya que se tendrán más imágenes a analizar, además de que pueden incrementar los falsos positivos (que son detecciones presentadas como objetos u rostros, pero que en realidad no lo son).
Pero, te estarás preguntando ¿por qué se realiza una pirámide de imágenes?, esto es debido al tamaño que presenten los rostros en la imagen, unos pueden ocupar mayor o menor área que otros, por lo que para que se trate de detectar todos en sus distintos tamaños se aplica la pirámide de imágenes.
MinNeighbors: Este parámetro especifica cuántos vecinos debe tener cada rectángulo candidato para retenerlo.
Veamos, te voy a explicar como yo veo esto. Tenemos una pequeña ventana que va a ir pasando por una imagen buscando rostros, entonces puede que te encuentres que al final de todo el proceso ha identificado varios rostros (figura 4), pero puede que muchos de ellos correspondan a la misma persona. Entonces este parámetro, hace relación a todos esos rectángulos delimitadores de un mismo rostro. Por lo cual minNeighbors especifica el número mínimo de cuadros delimitadores o vecinos, que debe tener un rostro para que detectado como tal.
Ahora, debemos tener en cuenta que entre más alto sea el valor que pongamos, menos caras se detectaran, mientras que si se da un valor muy bajo se pueden presentar falsos positivos.
MinSize: Este parámetro indica el tamaño mínimo posible del objeto. Objetos más pequeños son ignorados.
MaxSize: Este parámetro indica el tamaño máximo posible del objeto. Objetos más grandes son ignorados.
NOTA: Recuerda que la combinación de los valores que le des a cada parámetro (especialmente ScaleFactor y MinNeighbors) afectará a las detecciones. Y por cierto este procedimiento puede aplicarse a cualquier otro detector de objetos que use esta técnica, como los clasificadores pre entrenados que te comenté o podrías realizar el tuyo propio.
¡Ahora, programemos! Detección de rostros sobre una imagen
Para empezar he guardado el archivo xml que contiene el clasificador de rostros frontales (haarcascade_frontalface_default.xml) en la misma carpeta donde está almacenado el script.
Vamos a detectar los rostros que aparecen en la siguiente imagen:
La programación será la siguiente:
ACTUALIZACIÓN: Para versiones tales como OpenCV 4.2.0 cambiar la tercera línea por cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
import cv2 faceClassif = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') image = cv2.imread('oficina.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = faceClassif.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30), maxSize=(200,200)) for (x,y,w,h) in faces: cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2) cv2.imshow('image',image) cv2.waitKey(0) cv2.destroyAllWindows()
Línea 1: Importamos OpenCV.
Línea 3: Cargamos el clasificador con extensión xml con ayuda de cv2.CascadeClassifier, dentro entre comillas especificamos el nombre y extensión del archivo.
Línea 5 y 6: Leemos la imagen en donde se van a detectar los rostros y luego la transformamos a escala de grises.
Línea 8: Una vez que se ha cargado el clasificador en la línea 3 es necesario aplicarlo en la imagen, para ello utilizaremos detectMultiScale que debe estar seguido de la variable con la cual se asignó la carga del clasificador y es aquí en donde tenemos que tener en cuenta los argumentos que vimos recientemente: image, scaleFactor, minNeighbors, minSize y maxSize.
Línea 14: Cuando se aplica este detector sobre una imagen, en caso de que sea detectado algún rostro, se almacenarán los puntos x, y, ancho y alto del rostro que ha sido detectado (esto lo obtendremos de la variable ‘face’ que aquí se ha utilizado), es por ello que se utiliza un for para poder desempaquetar toda la información de los rostros obtenidos y posteriormente dibujar un rectángulo que los contenga.
A continuación te voy a mostrar las detecciones obtenidas luego de manipular los valores de los argumentos, veamos:
Manipulando image
He probado especificar una imagen en BGR, así como en escala de grises, y en ambos casos ya detección funcionó.
Manipulando scaleFactor
Con el código que hemos realizado vamos a hacer pruebas cambiando los valores de scaleFactor en: 1.1, 1.3, 1.5 y 1.01. Claro que los resultados estarán directamente relacionados también a los otros argumentos sin embargo esto nos servirá para darnos cuenta como actúa este argumento.
Analicemos la imagen superior izquierda de la figura 8, en ella podemos apreciar que todos los rostros que aparecen en la imagen han sido detectados.
En la imagen superior derecha de la figura 8, al usar un scaleFactor =1.3 podemos ver que se ha perdido un rostro ya que solo se han identificado 3.
En la imagen inferior izquierda de la figura 8, al usar un scaleFactor =1.5 se ha detectado solo un rostro.
Finalmente en la imagen inferior derecha de la figura 8, al usar un scaleFactor =1.01 tenemos detectados muchísimos más rostros de los cuatro que realmente tenemos. Además si estás probando el código, te habrás dado cuenta que se ha tardado más tiempo en procesar la detección, esto es debido al scaleFactor de 1.01 ya que se tiene muchas más imágenes a procesar.
CONCLUSIÓN: En esta sección solo hemos modificado el argumento scaleFactor para entender mejor su funcionamiento. Cuando usamos 1.1 en esta imagen (tú puedes buscar el mejor valor para tu aplicación) se detectaron correctamente los cuatro rostros, pero conforme subimos el valor a 1.3 o 1.5 vimos que los rostros se fueron perdiendo. Por otro lado al usar 1.01 obtuvimos muchísimos falsos positivos que no nos servirían si lo que deseamos es conocer los rostros de esta imagen. Por lo tanto debes experimentar con varios valores para encontrar el que mejor se adapte a lo que buscas.
Manipulando minNeighbors
Si analizamos la imagen superior izquierda de la figura 9, con minNeighbors=1 tenemos muchísimas más detecciones (falsos positivos) que las cuatro que deberían aparecer.
La imagen superior derecha de la figura 9 con minNeighbors=3 se ha conseguido detectar 5 rostros de los 4 que aparecen en ella.
En la imagen inferior izquierda de la figura 9 con minNeighbors=5 se ha conseguido detectar los cuatro rostros.
Finalmente en la imagen inferior derecha de la figura 9 con minNeighbors=25 solo se ha conseguido detectar un rostro.
CONCLUSIÓN: Como te había dicho antes, este parámetro especifica el número mínimo de cuadros delimitadores o vecinos, que debe tener un rostro para que detectado como tal. Entonces podemos ver que si se le da un valor de 1 es más propenso a aceptar rostros en lugares donde no los hay, mientas que si incrementamos ese valor como a 25 por ejemplo, las detecciones descienden. Por ello debes experimentar también con este parámetro hasta que encontrar el valor que se adaptea tus necesidades.
Manipulando minSize
En la imagen de la izquierda en la figura 10 se ha establecido minSize=(30,30). En este caso se están dibujando los cuatros rotros.
En la imagen de la derecha en la figura 10 se ha establecido en cambio minSize=(70,70). Dado este tamaño hay 2 rostros que se han rodeado, mientras que los rostros más pequeños han sido ignorados.
Manipulando maxSize
En la imagen de la izquierda en la figura 11 se ha establecido maxSize=(60,60). Dado que este tamaño es el máximo permitido, los rostros más grandes no han sido dibujados.
En la imagen de la derecha, en la figura 11 con maxSize=(200,200) se han dibujado todos los rostros.
En fin…
Ahora que ya conoces como funcionan los argumentos para la detección de rostros, debes tomar en cuenta que debes encontrar tú los valores adecuados dependiendo de tu aplicación.
Detección de rostros en video
Por último, vamos a emplear la detección de rostros en un video streaming, para ello seguimos el mismo procedimiento que hicimos para la imagen. Toma en cuenta que por ahora los parámetros usados son solo: image, scaleFactor y minNeighbors.
import cv2 cap = cv2.VideoCapture(0) faceClassif = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') while True: ret,frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = faceClassif.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Al momento de la visualización puedes hacer pruebas para que te des cuenta como está actuando el detector, por ejemplo moviendo la cebeza de un lado a otro, o trata de ocultar un poco tu cara para saber hasta qué punto funciona. Puedes acercarte a la cámara y alejarte para que des cuenta como realiza la detección a rostros en distintos tamaños.
Y obtendrás un resultado parecido a este:
Los parámetros que hemos visto hoy aplican a otros detectores que utilicen detectMultiScale. Así que puedes experimentar con otros clasificadores pre entrenados. Por último, trata de experimentar con los valores de los parámetros, para que ellos se adapten a tus imágenes o videos.
Y esto fue todo por este post, espero que te haya ayudado. Recuerda que puedes visitar mi repositorio en Github, o mis redes sociales. ¡Cuídate!
Referencias:
- https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html
- https://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Image_Object_Detection_Face_Detection_Haar_Cascade_Classifiers.php https://realpython.com/face-recognition-with-python/
- https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html#cascadeclassifier-detectmultiscale
- https://becominghuman.ai/face-detection-using-opencv-with-haar-cascade-classifiers-941dbb25177
- https://www.pyimagesearch.com/2016/06/20/detecting-cats-in-images-with-opencv/
#infoOmes
una pregunta como gusrdo las carpetas es qeu aun no se, porque yo solo las dejo en dedscargas y ya
¿Me podrías explicar un poquito más? 🙂
Dice que el Repositorio de clasificadores del GitHub no está disponible o que necesito permiso 🙁
Hola Anahí, ¿qué link usaste?
Hola Gaby, eres una extraordinaría persona por compartir tus conocimientos, te deseo mucho éxito en todo.
mi pregunta es ¿Sabes hasta cuantos rostros puedo almacenar en un modelo?
Gracias!
Hola Emilio, muchas gracias eres muy amable. Te refieres a la detección de rostros?
Así es, para generar el XML con el modelo LBPH.
Ahorita he almacenado unos 10 rostros y bajé el umbral a 48 porque en algunos rostros confundía a las personas y va mejor pero no se si exista un limite de rostros o si al aplicarlo para unas 50 personas solamente tenga mayor margen de error.
Gracias por tu respuesta!
Hola, tengo una duda. Implementé el código en Raspberry para video pero al sacar el rostro de escena se queda el cuadro estático y se congela la escena, que se podría hacer para evitar esto ?
Hola Mark, revisa que no tengas en el código algún cv2.waitKey(0), vaya a ser que esté esperando que presiones una tecla para continuar con el proceso.
Hola. ¿Podrías decirme que IDE o interfaz usas y donde la puedo descargar? Gracias.
Hola Katherine, uso Sublime. https://www.sublimetext.com/
hola, una duda ¿el archivo .xml lo tengo que descargar?
Hola Luis, si instalaste OpenCV 4 via contrib, solo basta con llamar haarcascade_frontalface_default.xml.
Hola saludos, una consulta en caso de que yo quisiera realizar mi propio archivo .xml de rostros, ¿puedo hacer el reconocimiento de rostros en específicos con Haar Cascades?, osea un xml para la persona Pedro y otro .xml para Juan y que al momento de hacer la prueba con un video pueda reconocer a estas dos personas, ¿Se puede lograr eso con Haar Cascades?
Hola Paul, dale un vistazo a este video: https://youtu.be/cZkpaL36fW4
Hola tengo este error
Traceback (most recent call last):
File «c:\projects\phyton\6 RECONOCIMIENTO FACIAL\capturandoRostros.py», line 17, in
faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades+’haarcascade_frontalface_default.xml’)
AttributeError: module ‘cv2.cv2’ has no attribute ‘data’
¿como puedo solucionarlo?
Hola Jorge, prueba instalando opencv contrib, via pip. Si no obtienes buenos resultados puedes darle un vistazo a este video: https://youtu.be/J1jlm-I1cTs Allí tienes otra forma de leer el clasificador.
Hola intente practicar paso a paso , pero me arroja el siguiente error , soy principiante en esto y si que me esta dando dolor de cabeza, espero puedas apoyarme un poco gracias. aquí te dejo para que lo chequees
PS C:\Users\USER-01-19\Pictures\opencv> & C:/Users/USER-01-19/AppData/Local/Programs/Python/Python39/python.exe c:/Users/USER-01-19/Pictures/opencv/deteccion/deteccion.py
Traceback (most recent call last):
File «c:\Users\USER-01-19\Pictures\opencv\deteccion\deteccion.py», line 6, in
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-5rb_9df3\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
Hola Jonatan, asegúrate de que la imagen de entrada se esté leyendo correctamente. Para ello puedes visualizarla con cv2.imshow.
Hola, Gaby. A mi me han dejado hacer esta misma actividad de detección de rostros en la universidad. El maestro nos proporcionó el código para realizarlo, que por cierto es algo similar al que tu enseñaste en el tutorial. Pero tanto como el que nos proporcionó él como el tuyo me marcaban el mismo error que varios de los que te comentaron aquí. Debería funcionar con ambos códigos, pero no es así. De hecho volví a reinstalar el python y OpenCV pensando que había hecho algo mal durante la instalación, pero ni así.
Después de varias horas intenté modificando la 3ra línea de tu código, que es esta:
faceClassif = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
Lo que hice fue agregar la ruta completa del archivo .xml, y quedó de esta forma:
face_cascade = cv2.CascadeClassifier(‘C:\Python\Python39\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml’)
Otros de ustedes seguro tendrán una ruta distinta del archivo .xml, así que deben buscarla. Si lo hacen bien, ahora si debería funcionar. A mí me funcionó.
Por otro lado, aprovecho para decirte que están muy buenos tus videos tutoriales, ya he visto varios y me gusta tu manera de explicar. Y para rematar eres bonita jajaja.
Hola Aaron, muchas gracias por tu comentario. Como explicas, también se puede leer el clasificador (.xml) especificando su ruta. 🙂 Un abrazo Aaron.
Muchas gracias por tu ayuda, es lo que estaba buscando, pero donde se busca o está la dirección exactamente del archivo, gracias
Hola.
Muy buenos tus videos
Y para todos, ver las explicaciones para evitar los errores (version de CV por ejemplo, tener la imagen en el mismo directorio del programa, etc).
Consulta Gaby:
¿y como haría para tener un programa que pueda determinar la presencia o no del uso de las mascarillas (en estos tiempos de Covid-19)?. Gracias.
Hola Miguel, muchas gracias! 🙂 En ese caso tendrías que usar algún algoritmo de machine learning, para ello tendrías que tener imágenes con rostros de personas con mascarillas vs rostros de personas que no las tienen. Puedes buscar distintos algoritmos que puedas aplicar para el entrenamiento, incluso deep learning.
Muchísimas gracias Gabriela por acercarnos a algo tan complejo de forma tan sencilla. Una curiosidad, quisiera que fuera un círculo en vez de un rectángulo lo que aparece alrededor de la cara. Es posible con opencv? Sigue ayudándonos ❤
Muchísimas gracias Gabriela por acercarnos a algo tan complejo de forma tan sencilla. Una curiosidad, quisiera que fuera un círculo en vez de un rectángulo lo que aparece alrededor de la cara. Es posible con opencv? Sigue ayudándonos ❤ ??
Hola Felix muchas gracias. 🙂 Claro que sí, podrías usar los datos del cuadro delimitador. Con x, y, ancho y alto podrías calcular el centro de dicho cuadro delimitador. Con ello ya tendrías la información del centro y también tendrías el radio por lo que puedes usar cv2.circle. Te dejo un video para que puedas ver el uso de cv2.circle en caso de que lo necesites: https://youtu.be/q_C0F4DA1R8 Muchos saludos.
Hola. Antes que nada que felicitarte por tus videos. Son muy prácticos y fácil de entender.
Te hago una consulta. Tengo un problema que no encuentro como resolverlo respecto del rectángulo en las caras encontradas. No lo está dibujando, osea, no lo muestra en la ventana. Me detecta la cara (voy mostrando la cantidad de caras encontradas) pero no me está dibujando el rectángulo. He desinstalado OpenCVy vuelto a instalar pensando que podria ser un error de instalación, pero no es así.
¿Alguna sugerencia?
Muchas gracias por tus videos
Hola! Muy buen post e interesante tema para aprender. Aun no revise el blog, pero en caso de que sepas, como podria crear o cual sería un algoritmo que pueda detectar objetos o cosas que yo quiera, es decir, un «entrenador» mas bien, en base a ciertas imagenes, que se cree un XML, que sería casi lo mismo que el XML usado en este tutorial, me llamó la atencion eso. Muchas gracias!
Hola Gabriela, exelente trabajo y muy bien explicado. Son mis primeros pasos en este mundo de la deteccion por computadora. Te queria consultar es posible usar varios clasificadores al mismo tiempo para detectar rostros que estan en distintas posiciones? o como se puede hacer para detectarlos cuando estan en distintas posiciones. Muchas gracias, saludos.
Hola Gustavo muchas gracias, eres muy amable. Claro que sí, podrías aplicar otros detectores a una misma imagen; sin embargo, esto podría ser muy costoso computacionalmente. Te recomendaría buscar un detector facial más robusto para detectar los rostros en distintas orientaciones. Te dejo unos videos que pueden interesarte:
– https://youtu.be/Lo1jljIIP9k
– https://youtu.be/TCUipOXuCBQ
– https://youtu.be/6lNn5_-RPAA
Hola Tengo una pequeña duda, podría implementar este código como un contador de rostros estuve intentando juntar dos clases con una de la clase global siendo el contador sin embargo todavía no encuentro la manera de realizarlo.
P.D adoro su trabajo me ayudo bastante a comprender mas sobre opencv
Hola en verdad muy buena pagina y videos que haces super comprensibles. Estoy haciendo trabajaos con OpenCV desde una Raspberry Pi 4 con un camara raspberry, todo bien. Quise hacer lo de detección de rostros pero en stream segui tu codigo pero me manda error:
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /build/opencv-L65chJ/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp, line 9748
Traceback (most recent call last):
File «pruebadteccion.py», line 9, in
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.error: /build/opencv-L65chJ/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp:9748: error: (-215) scn == 3 || scn == 4 in function cvtColor
tengo la version de OpenCV 3.2.0
Gracias.
Hola, empcé a ver tus videos y excelente porque he aprendido bastante pero necesito tu ayuda porque ando interesado en un proyecto… pero tengo problemas con la activación con la camara para la detección de circulos usando hough.
el problema esta en que tarda en abrir mi camara o a veces no abre… estoy usando un logitech c920 pro, desconozco si es mi lap o mi codigo el que me este dando demasiada lata al abrir pero te dejo una pequeña parte de mi codigo por si puedes corregirme solo en ese detalle…
PD: no sé si en los param1 y 2 … esten demasiados altos cada vez que intento subir esos valores más es cuando ya no abre :C
capture=cv2.VideoCapture(0)
while capture.isOpened():
_,frame=capture.read()
grisImagen=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
output=frame.copy()
circles = cv2.HoughCircles(grisImagen, cv2.HOUGH_GRADIENT, 2, 30,
param1=170, param2=130, minRadius=0, maxRadius=0)
if circles is not None:
circles=np.uint16(np.around(circles))
for circuloActual in circles[0,:]:
centroX=circuloActual[0]
centroY=circuloActual[1]
radio=circuloActual[2]
cv2.circle(output,(centroX,centroY),radio,(0,0,255),2)
cv2.imshow(‘video’, output)
if cv2.waitKey(0) & 0xff == ord (‘q’):
break
Hola, hay alguna forma de reentrenar este modelo para que por ejemplo detecte anteojos o lentes en la cara?, si esto conviene como seria?.