Detección de rostros con Python y OpenCV
La la entrada de hoy veremos un sencillo script en Python para detectar rostros, hacer reconocimiento facial, que utiliza la librería OpenCV.
La librería OpenCV está escrita en C, pero existe una extensión para trabajar con Python.
Vamos al grano. Para hacer que el script funcione, debemos de tener instalado Python y OpenCV. Imagino que python ya lo tienes instalado, pero quizá OpenCV no, para esos utilizaremos PIP
-- pip install opencv-python
Bien, ahora debemos descargar el siguiente XML que contiene lo necesario para detectar rostros de frente: http://eclecti.cc/files/2008/03/haarcascade_frontalface_alt.xml
Ingresas a la URL, click derecho, guardar como (necesitas saber donde lo guardas para pasar la ruta al Script)
Como dije anteriormente, este XML nos servirá para detectar rostros frontales, pero existen otros archivos XML como el anterior con más funcionalidades, por ejemplo para detectar manos, perfiles, etc.
Aquí tienes un montón de ejemplos más: https://gist.github.com/npinto/3632388
Para el ejemplo utilice la siguiente imagen:
Y el resultado fue el siguiente:
Como podrás observar, uno de los rostros no fue detectado. También podrás observar que el rostro que no fue detectado utiliza gafas y está un poco más oscuro.
Por lo tanto también podemos decir que la detección no es perfecta, no es algo fácil ni exacto.
Ahora el código:
import cv2 def detect(path): img = cv2.imread(path) # Pasamos la ruta del XML cascade = cv2.CascadeClassifier("C:UsersAdminDesktophaarcascade_frontalface_alt.xml") rects = cascade.detectMultiScale(img, 1.3, 4, cv2.CASCADE_SCALE_IMAGE, (20,20)) if len(rects) == 0: return [], img rects[:, 2:] += rects[:, :2] return rects, img def box(rects, img): for x1, y1, x2, y2 in rects: cv2.rectangle(img, (x1, y1), (x2, y2), (127, 255, 0), 2) # Ruta donde guardaremos la imagen con la deteccion de rostros cv2.imwrite('C:UsersAdminDesktopprueba.jpg', img); # Pasamos la imagen que quremos detectar rects, img = detect("C:UsersAdminDesktopImagen.jpg") box(rects, img)
Y esto es todo amigos, espero esta entrada sea de su agrado y pueda ser de guía para sus futuros proyectos de detección de rostros!!!
Fuente: http://fideloper.com/facial-detection
-
-
Gracias Joan por visitar el blog!!! De seguro podrás probarlo. Saludos
-
hola diego no se si estas activo aun pero tengo un problema .Estoy utilizando la funcion traincascade para crear mi propio clasificador con 3000 imagenes positivas y 2000 negativas pero solo me crea pocos feature en el xml,ademas de cuando lo uso en una imagen cualquiera don de quiero encontrar el objeto del clasificador ,como respuesta me muestra todos los lugares en los que hay un elemento en el conjunto positivo .No se si me explique bien por favor me puedes decir que harias en este caso
este es el codigo python que usoimport cv2
import sysimagen_dir = sys.argv[1] #lee del teclado la direccion de la imagen
cascade_dir = sys.argv[2] #lee del teclado la direccion de la clasificadorrostroCascade = cv2.CascadeClassifier(cascade_dir) # carga el clasificador de la direccion
imagen = cv2.imread(imagen_dir) #lee la imagen de la direccion
filtro = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY) #convierte la imagen a color gris# esto es para las coincidenncias
rostros = rostroCascade.detectMultiScale(
filtro,
scaleFactor = 1.2,
minNeighbors = 12,
minSize= (30,30),
flags = cv2.CASCADE_SCALE_IMAGE
)for (x, y, w, h) in rostros:
#print x,y,w,h #esto es para imprimir los pixeles que encontro
cv2.rectangle(imagen, (x, y), (x+w, y+h), (0, 255, 0), 2)#esto es para pintar los cuadradoscv2.imshow("Rostros encontrados", imagen) # esto es para mostrar la imagen de entrada con los cuadritos pintaos
cv2.waitKey(0)gracias por tu atencion
-
-
Lo probaremos a ver como va, pero en principio me parece un aporte muy bueno. Gracias.
-
Excelente Salvador, gracias por visitar el blog. Saludos
-
-
En Jupyter notebook obtengo un error en los path.
Solucionado cambiando "" por "/".
¡Este ejemplo me gusta! -
se puede usar windows o es mejor usar linux para trabajar con estas herraientas
-
buenas tardes, no se mucho sobre python y openCV, pero este tema de reconocimiento facial se puede aplicar el en reconocimiento de letras??
¿tambien se tendria que utilizar haarcascade? de antemano gracias por este articulo
Deja una respuesta
Felicidades por el articulo, tengo que pulir mis conocimientos pero me encararía probarlo. Gracias por su labor.