miércoles, 28 de febrero de 2018

OpenCV y Python V (BackgroundSubstractor)

 


Extraer el fondo de una imagen es bastante sencillo, y nos proporciona una gran herramienta para los desarrollos posteriores y eliminar zonas de la imagen que no necesitamos reconocer, asi facilitamos reconocer los elementos moviles de nuestras capturas.

Imaginemos una cinta transportadora, los elementos van pasando pero el fondo siempre es fijo, esta herramienta nos permite eliminar todos los elementos, y poderlos clasificar uno a uno.


Sin más, os muestro el código y luego comentamos:
import cv2


def main():
    
    cap = cv2.VideoCapture(0)
    mog2 = cv2.createBackgroundSubtractorMOG2()
    cv2.BackgroundSubtractorMOG2.setDetectShadows(mog2,False)

    
    while(cap.isOpened()):
        
        ret, original = cap.read()
        mask = mog2.apply(original)        
        mask = cv2.erode (mask,cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)),iterations = 2)
        
        cv2.imshow('Original',original)
        cv2.imshow('Mask',mask)
        
        k = cv2.waitKey(25) & 0xff
        if k == 27:
            break
        
    cap.release()
    cv2.destroyAllWindows()

main()

Vamos a obviar las partes que ya hemos tratado en otros tutoriales y centrarnos en lo que nos ocupa:

En la siguiente linea asignamos a una variable mog2, la función para extraer el fondo:
mog2 = cv2.createBackgroundSubstractorMOG2()

MOG2, por defecto "intenta" identificar las sombras, que a la hora de mostrar la mascara en pantalla nos la indica en gris, algo así:



Pero a mi no es algo que me guste, asi que lo quitamos usando la siguiente linea de código:

cv2.BackgroundSubtractorMOG2.setDetectShadows(mog2,False)

Una vez dentro del bucle, asignamos a mask, la captura aplicandole el MOG2:

mask = mog2.apply(original)

Después, limpiaremos la imagen de ruido, aplicandole el filtro "erode", esto también es opcional, si quereis vosotros mismos probad como funciona si no lo aplicais, simplemente borrando la linea:

mask = cv2.erode (mask,cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)),iterations = 2)

Y  bien, en esto consiste substraer el fondo de la imagen, en los proximos tutoriales, que espero que sean pronto, haremos un inciso para explicar cómo funciona en un modo muy básico la libreria pygame, para despues aplicarlo a OpenCV, programando un minijuego basado en este mismo tutorial.

Un juego donde explotaremos globos usando nuestro cuerpo al puro estilo PSCamera de Play Station 2.