Siempre creciendo, siempre aprendiendo. Cultura maker.

Bueno, pues si has leído con atención el capítulo anterior, ya estás preparado para comprender algunas particularidades de OpenCV desde la óptica de Python:

 

Conceptos básicos de OpenCV

Si analizamos brevemente el código del artículo anterior, podréis notar que trabajamos en cinco fases:

 

  • En un primer lugar, importamos las librerías necesarias: opencv y numpy (necesaria para opencv, ya que realiza múltiples operaciones matemáticas con las imágenes que se van procesando). Por otro lado, creamos un objeto denominado cap al que asociaremos la webcam que tenemos conectada (0 por defecto; si tuvieras varias, deberías utilizar múltiples números):
    import numpy as np
    import cv2
    cap = cv2.VideoCapture(0)
    

 

  •  A continuación, iniciamos un bucle mediante la instrucción while(True) que sólo se romperá si pulsamos la tecla 'q':
while(True):
#Operacion 1
#Operacion 2
#etc...
    #el procedimiento waitKey comprueba si se ha pulsado la tecla 'q' al final de cada bucle
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Si se ha roto el bucle, procedemos a destruir la ventana y finalizar el programa
cap.release()
cv2.destroyAllWindows()

  • Aquí empieza la auténtica parte de tratamiento de vídeo: por un lado, creamos dos objetos denominados ret y frame que irán registrando las imágenes que componen nuestro vídeo mediante el procedimiento read() en el objeto cap. Por otro, creamos un objeto marco a partir de frame al que asignamos un modo de tratamiento de color (existen decenas, a cada uno le corresponde un flag, y no los controlo todos; en este caso creo que se limita a dejar el modo RGB para la cámara):
    #Dos objetos irán grabando las imágenes del objeto cap
    ret,frame = cap.read()

    # Especificamos el tipo de color (existen decenas) que queremos mostrar de la captura de frame y lo asignamos a un objeto que llamamos marco
    marco = cv2.cvtColor(frame, cv2.COLOR_RGB2RGBA)
  • Por último, sólo nos queda mostrar por una ventana a la que hemos puesto por nombre "Hola Mundo" dicho objeto marco mediante el procedimiento imshow():
    cv2.imshow('Hola Mundo',marco)
    

 

 

Los más avispados de entre vosotros habréis notado que he hablado de cinco fases, y sólo he especificado cuatro. Las posibles explicaciones son:

  1. Me he equivocado y me da pereza modificar mi error
  2. Soy un bromista, aunque esta broma no hace mucha gracia
  3. 1 y 2 son correctas.

 

Sí, sí, sí... Pero, ahora, ¿qué hacemos?.

 

Bueno, para empezar, juguemos un poquito con los flags de conversión de color. Por ejemplo, podemos pasar la imagen a escala de grises si utilizamos el flag  cv2.COLOR_BGR2GRAY en cv2.cvtColor(). El código quedaría así:

#Necesitas las librerías cv2 (la de openCV) y también la de numpy (utilizada por la anterior)

import numpy as np
import cv2

#Creamos un objeto que iniciará la captura de video en la primera entrada disponible (la 0)

cap = cv2.VideoCapture(0)
#Iniciamos un bucle continua
while(True):
    #Dos objetos irán grabando las imágenes del objeto cap
    ret,frame = cap.read()

    # Especificamos el tipo de color (existen decenas) que queremos mostrar de la captura de frame y lo asignamos a un objeto que llamamos marco
    marco = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Mostramos el marco de ventana con el título "Hola Mundo" con el objeto "marco" dentro
    cv2.imshow('Hola Mundo',marco)

    #el procedimiento waitKey comprueba si se ha pulsado la tecla 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Si se ha roto el bucle, procedemos a destruir la ventana y finalizar el programa
cap.release()
cv2.destroyAllWindows()

Como puedes observar, de todo el código original, sólo hemos variado la línea 15, resaltada en azul. El resultado es éste:

 

tutoopencvb2

 

Si, por ejemplo, sustituyes la línea 15 por esta otra instrucción:

marco = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb)

 

¡Zas!, hace una conversión del modo RGB a Luma-Chroma:

 

tutoopencvb3

 

Las posibilidades son muchísimas. A cada modo de tratar el color, le corresponden distintas posibilidades de transformaciones posteriores. Podemos trabajar con los canales alfa, filtrar por color, luminosidad, etc... etc... Los distintos flags posibles para cv2.cvtColor() los tienes en este enlace.

 

Vale, lo pillo. ¡Enséñame algo más!

 

Bueno, pues una cosa es trabajar con objetos en Python y realizar distintas transformaciones, pero es que además podemos ir mostrando por pantalla cada uno de esos objetos.Por ejemplo, después de asignar el modo de tratamiento del color de la imagen capturada por el objeto cap a tres objetos marco1, marco2 y marco3 (por ejemplo, a color, luma-chroma y escala de grises) podemos utilizar el procedimiento cv2.imshow() para mostrar todos los objetos a la vez. Ojo al dato, digo ojo al código:

#Necesitas las librerías cv2 (la de openCV) y también la de numpy (utilizada por la anterior)

import numpy as np
import cv2

#Creamos un objeto que iniciará la captura de video en la primera entrada disponible (la 0)

cap = cv2.VideoCapture(0)
#Iniciamos un bucle continua
while(True):
    #Dos objetos irán grabando las imágenes del objeto cap
    ret,frame = cap.read()

    # Especificamos el tipo de color (existen decenas) que queremos mostrar de la captura de frame y lo asignamos a un objeto que llamamos marco
    marco1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    marco2 = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb)
    marco3 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Mostramos el marco de ventana con el título "Hola Mundo" con el objeto "marco" dentro
    cv2.imshow('Color RGB',marco1)
    cv2.imshow('Color Luma-Chroma',marco2)
    cv2.imshow('Escala de grises',marco3)    
    #el procedimiento waitKey comprueba si se ha pulsado la tecla 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Si se ha roto el bucle, procedemos a destruir la ventana y finalizar el programa
cap.release()
cv2.destroyAllWindows()

Y, tachááááán... Aquí me tenéis haciendo el payaso en varios colores:

 

tutoopencvb4

 

Ok, un objeto para capturar, otro objeto para asignar color, mostrar este último por ventana, ¿ahora qué?.

 

¿Cómo que ahora qué?. Ahora me voy a descansar un poco. Reconoce que has avanzado un montón para ser un no iniciado a este misterioso mundo, mi pequeño padawan. O no lo reconozcas, me da igual.  En un próximo tuto, hablaremos de distintas transformaciones y el trabajo con máscaras. ¡Un saludo!. ¡Seguid disfrutando!. ¡Seguid creando!.