miércoles, 3 de diciembre de 2014

OpenCV y Python III ( Reconocimiento por clasificadores HAAR)

El tercero de la serie lo voy a enfocar al reconocimiento de imágenes siguiendo HAAR cascade.
Si habéis probado los ejemplos, hay uno el facedetect, que como su nombre indica detecta los rostros en una imagen, aparece la imagen de nuestra querida Lena con un rectangulo en la cara en la cara.

Como simple curiosidad buscáis en la wikipedia a Lenna, veréis la historia de esta imagen.


Me gustaría hacer un pequeño inciso: En el tutorial del encendido de un led de forma remota ya dije que la importancia de encender un led era que a partir de ese led podemos controlar infinidad de cosas, pues bien, esto es lo mismo. El objetivo final de esto, no es insertar un rectángulo en nuestra cara, y ver lo chulo que es, eso nos puede valer para jugar un rato. Realmente la importancia reside en lo que realmente significa, y lo explico con un ejemplo: Tenemos una cara detectada, con unas coordenadas en pantalla determinadas y en lugar de dibujar un rectángulo, usamos la posición como referencia y activamos un motor que gira a la derecha, cuando la coordenada es menor que la mitad de la pantalla, y ese motor es el que mueve la cámara que busca colocarnos en medio de la pantalla.. tendremos un robot que nos mira a la cara... de ahí la importancia.

¿Como funciona?

Este tipo de reconocimiento utiliza un archivo externo *.xml, que le da al programa información sobre la imagen que busca y también sobre la que no, pero esto lo veremos mas en detalle el el próximo tutorial, en el que aprenderemos a crear estos archivos "entrenando" nuestro programa.
La información de este archivo lo compara con la imagen de entrada y si encuentra algo nos lo dice.
¿Fácil no?


Pasos a seguir


  1. Carga los clasificadores.
  2. Carga la imagen
  3. Cambiamos a escala de grises ( Siempre intentamos reducir al máximo los cálculos que debe realizar el PC)
  4. Usamos un bucle "for" para detectar todos los patrones y nos devuelve las coordenadas.
  5. Creamos la figura que muestra lo detectado, un rectángulo, circulo... en fin lo que más rabia os dé.
  6. Mostramos imagen.

Pasemos al código comentado


import cv2
import numpy

#Cargamos el archivo clasificador
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    #Convertimos la imagen a escala de grises
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    #Activamos el detector
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    #Iniciamos un bucle for para que cada cara que detecte,
    #nos proporcione coordenadas y dibujemos rectangulos
    for (x,y,w,h) in faces:
        cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)

    cv2.imshow('Haar', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'): # Indicamos que al pulsar "q" el programa se cierre
        break

cap.release()
cv2.destroyAllWindows()




No hay comentarios:

Publicar un comentario