martes, 25 de noviembre de 2014

OpenCV y Python II (Seguimiento de objeto por color)



Hoy vamos a aprender a seguir un objeto de un color determinado y en directo usando OpenCV.
Recordad, lo importante es entender el concepto, y para ello antes voy a explicar el procedimiento que vamos a usar para ello.

  1. Obtenemos la imagen de nuestra webcam.
  2. Convertimos esa imagen a el formato de color HSV (Matiz, Saturación, Brillo)
  3. Especificamos un rango de color para crear una plantilla, de blanco o negro, 0 y 1, verdadero falso... etc. ( para ello nosotros utilizaremos barras de configuración )
  4. Localizamos en la ventana el lugar que ocupa ese color en ese frame
  5. Dibujamos un circulo en esa posición.

De la libreria OpenCV usaremos estas nuevas funciones:

- cv2.createTrackbar ('Titutlo', 'ventana', rango inferior, rango superior, variable temporal).
Crea una barra deslizante.

- cv2.cvtColor (imagen, Tipo de conversion) Convierte la imagen de una paleta de colores a otra
- cv2.inRange(imagen, Rango min, Rango max)
- cv2.moments.
Datos sobre la posicion de un objeto donde:
    -m00 -> Area de blanco
    -m01 -> Posicion x
    -m10 -> Posicion y

- cv2.erode -> erosiona la imagen para eliminar puntos erroneos
- cv2.dilate -> dilata los pixeles detectados
- cv2.circle (imagen, posicion, color, tamaño de la linea)

El codigo fuente de la practica comentado.




import numpy as np
import cv2

def nothing(x):
    pass
# Creamos una variable de camara y asigamos la primera camara disponible con "0"
cap = cv2.VideoCapture(0)
cv2.namedWindow('Configuracion')

# Crearemos los controles para indicar el color que seguiremos

cv2.createTrackbar ('H min', 'Configuracion', 0,256,nothing)
cv2.createTrackbar ('H max', 'Configuracion', 0,256,nothing)
cv2.createTrackbar ('S min', 'Configuracion', 0,256,nothing)
cv2.createTrackbar ('S max', 'Configuracion', 0,256,nothing)
cv2.createTrackbar ('V min', 'Configuracion', 0,256,nothing)
cv2.createTrackbar ('V max', 'Configuracion', 0,256,nothing)

# Iniciamos el bucle de captura, en el que leemos cada frame de la captura
while(True):
    ret, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) #Convertimos imagen a HSV

    # Asignamos las variables del rango de color que seguiremos
    Hmin = cv2.getTrackbarPos('H min', 'Configuracion')
    Hmax = cv2.getTrackbarPos('H max', 'Configuracion')
    Smin = cv2.getTrackbarPos('S min', 'Configuracion')
    Smax = cv2.getTrackbarPos('S max', 'Configuracion')
    Vmin = cv2.getTrackbarPos('V min', 'Configuracion')
    Vmax = cv2.getTrackbarPos('V max', 'Configuracion')

    # Aqui mostramos la imagen en blanco o negro segun el rango de colores.
    bn_img = cv2.inRange(hsv, np.array((Hmin,Smin,Vmin)), np.array((Hmax,Vmax,Smax)))

    # Limpiamos la imagen de imperfecciones con los filtros erode y dilate
    bn_img = cv2.erode (bn_img,cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)),iterations = 1)
    bn_img = cv2.dilate (bn_img,cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)),iterations = 1)
    # Localizamos la posicion del objeto
    M = cv2.moments(bn_img)
    if M['m00']>50000:
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])
    # Mostramos un circulo verde en la posicion en la que se encuentra el objeto
        cv2.circle (frame,(cx,cy),20,(0,255,0), 2)


    # Creamos las ventanas de salida y configuracion
    cv2.imshow('Salida', frame)
    cv2.imshow('inRange', bn_img)

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

cap.release()
cv2.destroyAllWindows()


Al ejecutarlo tendremos 3 pantallas, una con las barras de configuración, otra con la imagen en blanco y negro, y la captura de la imagen. En la imagen de abajo vereis un pequeño ejemplo visual de su funcionamiento.
Hay que tener en cuenta en el proceso de configuracion que hablamos de rangos, osea que el maximo debe ser superior que el minimo, si no, no veremos nada.

No hay comentarios:

Publicar un comentario