martes, 6 de marzo de 2018

Pygame I: Las bases.

Vamos a empezar esta serie de tutoriales sobre Pygame, como ya introduje la semana pasada, no pretendo hacer una guia completa de creación de videojuegos, simplemente vamos a presentar unas bases para que podamos integrar las cosas que hemos aprendido con OpenCV a Pygame, y así poder programar juegos al estilo Eye Toy de Play Station 2.

En este primer tutorial, mostraré la configuración inicial del juego, cargaremos musica y un sprite, con esto será suficiente para poder entender como  funciona pygame.

Para descargar pygame, usaremos la herramienta pip, de la que ya hemos hablado anteriormente:

Windows, en CMD: python -m pip install pygame
Linux, en la terminal: pip install pygame

Documentación de Pygame, https://www.pygame.org/docs/ref/display.html
El sprite utilizado:



Sin más y como siempre, pasamos al codigo, sobre el mismo código pondré los comentarios, creo que os resultará más práctico:


'''
Created on 2 mar. 2018

@author: Juanp
'''

import pygame
from pygame.locals import *

#Constantes

W = 680
H = 460

AZUL_CLARO = (190,220,255)


def main():
    
    #Iniciamos pygame:
    
    pygame.init()
    pygame.font.init()
    pygame.mixer.init(frequency=22050, size=16, channels=2, buffer=4096)
    clock = pygame.time.Clock()
    SCREEN = pygame.display.set_mode((W,H))
    
    #La funcion fill, nos sirve para definir el color de fondo
    
    SCREEN.fill(AZUL_CLARO)
        
    #Cargamos los archivos de juego y definimos variables
    
    sprite = pygame.image.load('globo.png').convert_alpha()
    mus_fondo = pygame.mixer_music.load("loopvint.mp3") #Importante diferenciar entre musica y sonido del juego
    pygame.mixer.music.play(loops=0, start=0.0)        
    
    running = True
    
    #Bucle del juego
    
    while running:
        
        #Mostramos el sprite en pantalla
        
        SCREEN.blit(sprite,(W/2,H/2))
                  
          
        
    
        #Eventos de juego, por el momento solo cerramos la aplicacion usando la ventana
        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                running = False
                
    
        #Actualiza pantalla    
        pygame.display.update()            

main()


La pantalla deberia mostrar algo así:

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.