Siempre creciendo, siempre aprendiendo. Cultura Maker.

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado
 

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!.

Comparte este post

Submit to FacebookSubmit to Google PlusSubmit to TwitterSubmit to LinkedInEnviar a Menéame

Comentarios   

0 #3 Juan Padrón 11-01-2017 16:26
Ok gracias.
Citar
0 #2 Antonio 09-01-2017 18:21
Cito a Juan Padrón:
Me da error con la codificación. tengo añadido en la cabeza del archivo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

La linea que da error es la siguiente:
if cv2.waitKey(1) & 0xFF == ord('q'):
Que codificacion de caracteres tienes por defecto en el python?

Saludos, Juan. Lamento el error. Ya he corregido el código en el artículo. El error estaba en el operador '&' que relaciona cv2.waitKey(1) y el valor 0xFF==ord('q')
La herramienta que utilizo para resaltar el código me lo había "traducido" a html, añadiendo el amp;
Todavía no soy muy bueno con esa herramienta. :oops: Mis disculpas.
Citar
+1 #1 Juan Padrón 09-01-2017 11:39
Me da error con la codificación. tengo añadido en la cabeza del archivo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

La linea que da error es la siguiente:
if cv2.waitKey(1) & 0xFF == ord('q'):
Que codificacion de caracteres tienes por defecto en el python?
Citar

Escribir un comentario


Código de seguridad
Refescar

Mientras navegas por esta web, posiblemente interactuemos con tu equipo mediante el uso de cookies. La actual legislación de la UE (European Union) me obliga a informarte de ello, caminante. We use cookies to improve our website and your experience when using it. Cookies used for the essential operation of this site have already been set. To find out more about the cookies we use and how to delete them, see our privacy policy.

  I accept cookies from this site.
EU Cookie Directive Module Information