Mostrando entradas con la etiqueta imagen. Mostrar todas las entradas
Mostrando entradas con la etiqueta imagen. Mostrar todas las entradas

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.



jueves, 11 de diciembre de 2014

OpenCV y Python IV (Entrenamiento HAAR cascade)

En el anterior tutorial aprendimos a utilizar los clasificadores HAAR, usando los que trae por defecto OpenCV, ahora pasamos a algo más interesante, "entrenar" al software a reconocer los objetos que queremos.
Ya dije que hay diferentes tipos de procedimientos para localizar objetos, depende siempre de lo que queramos detectar.

OpenCV tiene dos herramientas para generar el archivo *.xml que necesitamos, las encontrareis en "OpenCV/Build/Common/x86" que es la carpeta donde trabajaremos por comodidad, los programas que usaremos son "opencv_createsamples" y "opencv_traincascade"

El procedimiento es el siguiente:

  • Creamos tres carpetas, en una pondremos las imágenes negativas ( las que no pertenecen a nuestro objeto), en otra las positivas (por eliminación, las que si) y en la ultima ira a parar el archivo *.xml, la llamaremos "cascade".
  • Creamos un archivo de texto, llamado "negative.txt" y en el insertamos las rutas de las imágenes negativas:
    neg/neg_img1.jpg
    neg/neg_img2.jpg
    ...
  • Creamos otro archivo de texto, llamado "positive.txt" y en este hacemos lo mismo, pero indicando los siguientes argumentos: "ruta del archivo" "numero de veces que sale el objeto en esa imagen" "posicion x de la esquina superior izquierda" "posición y de la esquina superior izquierda" "alto del recuadro" ancho del recuadro":
    pos/pos_img1.jpg 1 675 210 400 150





  • Una vez tengamos los archivos listos, cuantas más imagenes mejor funcionará, pasaremos a crear el primer archivo necesario. Para ello nos vamos a la consola y navegamos hasta la ruta de las herramientas, e introducimos:
    opencv_createsamples.exe -vec bin_desc.vec -info positive.txt -bg negative.txt
    Con esto generamos el archivo "bin_desc.vec", que es el que utilizamos para el próximo paso.
  • Aún dentro de la consola, introducimos:
    opencv_traincascade.exe -data cascade -vec bin_desc -bg negative.txt
  • Dentro de la carpeta "cascade" se generan unos cuantos archivos, de ahi solo nos interesa "cascade.xml" que es nuestro clasificador, para probarlo simplemente usaremos el ejemplo del post anterior, en el que cambiaremos el archivo de caras, por el nuestro.

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.


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.

lunes, 17 de noviembre de 2014

5 aplicaciones web que deberías conocer

Hoy os presento una serie de herramientas para trabajar online que nos sacan de algún apuro, y haciendo alusión con el post anterior, nos impide que con las prisas descarguemos cualquier software y con ello llenemos nuestro pc de basura.


  • CloudConverter, convierte archivos de audio, vídeo, documentos e imágenes a otros formatos directamente desde esta web.
    Nos permite convertir el formato de un archivo desde URL, de nuestro PC o desde nuestro Dropbox.
  • ClipConverter, descarga videos y musica en multiples formatos, desde webs como YouTube, MySpace, Metacafe, Veoh..

  • Easel.ly, crea tus infografias desde esta web. Nos proporciona herramientas suficientes para crear un diseño muy profesional, plantillas gratuitas, una gran selección de imágenes predefinidas a las que podemos añadir las nuestras, diferentes estilos de texto y herramientas de edición y dibujo, todo esto con una interfaz muy limpia y atractiva.
  • Awwapp.com, una pizarra virtual muy sencilla en la que podremos hacer nuestros esquemas como si de la pizarra del cole se tratase, lo más interesante, pues que podemos compartir la pizarra en directo y que nuestro compañero dibuje también. Muy útil para jugar al 3 en raya... aunque seguro que hay alguien que le da usos más profesionales.
  • Soundation, ahora le toca al sonido, si supiera algo de componer bases de canciones probablemente le daría algo de utilidad a esta web, por el momento seguiré jugando a componer ruiditos en mis ratos de ocio-aburrimiento. Pues este tiene muchas opciones, una gran librería de sonidos gratuitos, teclado, posibilidad de grabar voz, y efectos.