Google+ Seguidores

domingo, 18 de junio de 2017

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áshttps://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:\Users\Admin\Desktop\haarcascade_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:\Users\Admin\Desktop\prueba.jpg', img);

# Pasamos la imagen que quremos detectar
rects, img = detect("C:\Users\Admin\Desktop\Imagen.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

7 comentarios :
Write comentarios
  1. Felicidades por el articulo, tengo que pulir mis conocimientos pero me encararía probarlo. Gracias por su labor.

    ResponderEliminar
    Respuestas
    1. Gracias Joan por visitar el blog!!! De seguro podrás probarlo. Saludos

      Eliminar
    2. 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 uso

      import cv2
      import sys

      imagen_dir = sys.argv[1] #lee del teclado la direccion de la imagen
      cascade_dir = sys.argv[2] #lee del teclado la direccion de la clasificador

      rostroCascade = 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 cuadrados


      cv2.imshow("Rostros encontrados", imagen) # esto es para mostrar la imagen de entrada con los cuadritos pintaos
      cv2.waitKey(0)

      gracias por tu atencion

      Eliminar
  2. Lo probaremos a ver como va, pero en principio me parece un aporte muy bueno. Gracias.

    ResponderEliminar
    Respuestas
    1. Excelente Salvador, gracias por visitar el blog. Saludos

      Eliminar
  3. En Jupyter notebook obtengo un error en los path.
    Solucionado cambiando "\" por "/".
    ¡Este ejemplo me gusta!

    ResponderEliminar
  4. se puede usar windows o es mejor usar linux para trabajar con estas herraientas

    ResponderEliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

Powered by Blogger .