Introducción OpenCV Python

Tutorial de introducción a la programación de aplicaciones de visión por computador usando la biblioteca OpenCV 3.x desde el lenguaje de programación Python 3.x, antes de empezar debes instalar las herramientas, si ya esta preparado, manos a la obra.

Leer y guardar archivos de imagen

La tarea más simple y común que realizaremos será cargar imagen a partir de una archivo en disco, para hacerlo disponemos de la función imread(), mientras que imwrite() nos permitirá guardar una imagen.

Al cargar una imagen esta es almacenada en memoria usando el formato de color BGR, por defecto, este es igual al espacio de color RGB pero con los canales invertidos, aquí se almacena la información para cada uno de los canales azul, verde y rojo.

Opcionalmente se puede indicar el modo, por defecto, IMREAD_COLOR, si deseamos cargar la imagen a escala de grises usaremos, IMREAD_GRAYSCALE, mientras que el modo IMREAD_UNCHANGED cargará la imagen en el formato de color definido por el archivo.

import cv2

# cargar el archivo PNG indicado
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)

# guardar la imagen en formato JPG
cv2.imwrite('save.jpg', img)

Al guardar la imagen se utilizara el formato definido por la extensión que le demos al nombre de la imagen, siempre que el mismo este soportado, algunos de estos formatos son: PNG, BMP, TIFF, JPG, otros.

Mostrar una imagen

Cuando hayamos cargado una imagen en memoria es posible mostrarla en una ventana, para este propósito tenemos la función imshow(), con ella creamos una ventana y desplegamos la imagen deseada, debemos indicar el nombre y el objeto que deseamos mostrar, ejemplo:

import cv2

# cargar el archivo PNG indicado
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)

# mostrar la imagen en una ventana
cv2.imshow('titulo', img)

# esperar hasta que se presiona una tecla
cv2.waitKey(0)

Al final vemos una llamada a waitKey(0), con esto impedimos que la ventana se cierre inmediatamente, el valor cero indica que se debe esperar indefinidamente hasta que se presione una tecla, si establecemos un valor mayor que cero este será la cantidad de milisegundos que se debe esperar.

Esta función devuelve el código ASCII de la tecla presionada, por ejemplo, 27 para la tecla ESC.

Cuando deseemos destruir una ventana usaremos destroyWindow('ventana') indicando el nombre de la ventana que deseamos eliminar, si tenemos varias ventanas y deseamos destruirlas todas disponemos de destroyAllWindows()

Capturar video de la webcam

No solo podemos trabajar con imágenes cargadas desde archivos, también podemos leer imágenes desde la cámara web de nuestro PC, si capturamos una serie de imágenes sucesivas tendremos un video en tiempo real, veamos como se hace.

Para capturar imágenes provenientes de la cámara usaremos un objeto VideoCapture(0) debemos indicar el índice de la cámara que deseamos utilizar, por ejemplo, si tenemos dos habilitadas, indicamos cero para la primera, uno para la siguiente y así sucesivamente.

En lugar de indicar el índice de cámara, también es posible indicar el nombre de un archivo de video, si el formato esta soportado este se visualizará.

import cv2

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()

    if ret:
        cv2.imshow('video', frame)
    
    if cv2.waitKey(1) & 0xFF == 27:
        break


cap.release()
cv2.destroyAllWindows()

Para capturar un cuadro de video usamos cap.read() este devuelve un booleano que indica si la captura es válida y el objeto imagen que representa la captura, de aquí en adelanta tratamos la captura como si fuese cualquier otra imagen, al terminar usaremos cap.release() para liberar recursos.

Guardar un archivo de video

Para escribir un archivo de video necesitaremos un objeto VideoWriter indicaremos el nombre del archivo, el codec a utilizar, el fps (cuadros por segundo) y el tamaño del video.

Los codec que podemos utilizar dependen de cada sistema, es decir si no tienes los codec para FLV no podrás ver ni escribir en este formato, utilizaremos un código de 4 byte para identificar cada uno de ellos, puedes encontrar la lista en, fourcc.org, para indicarlo tenemos la función: cv2.VideoWriter_fourcc('M','J','P','G') para MJPG.

import cv2

cap = cv2.VideoCapture('video.avi')

# Definir el codec y crear el objeto VideoWriter
fourcc = cv2.VideoWriter_fourcc('M','S','V','C')
out = cv2.VideoWriter('output.avi', fourcc, 25.0, (720, 528))

while(True):
    # capturar el cuadro
    ret, frame = cap.read()

    if ret:
        # procesar la captura, convertir a grises
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # escribir el cuadro procesado
        out.write(gray)

        # mostar la captura actual
        cv2.imshow('video', gray)

    # esperar, si se presiona la tecla ESC salir 
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()
out.release()

cv2.destroyAllWindows()

OpenCV Python Video

Es todo por ahora, más adelante tendremos muchos más tutoriales, hasta la próxima.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Entrenar OpenCV en Detección de Objetos

Gauss Seidel y Jacobi