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

  1. Podrías explicar esta linea --> if cv2.waitKey(1) & 0xFF == 27:

    ResponderEliminar
  2. hola cv2.imwrite("save.jpg", img) me sale False deberia ser asi o sere yo quien este haciendo mal las cosas?

    ResponderEliminar
  3. Traceback (most recent call last):
    File "", line 1, in
    cv2.imshow("silencio", img)
    cv2.error: OpenCV(3.4.3) d:\build\opencv\opencv-3.4.3\modules\highgui\src\window.cpp:364: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

    ResponderEliminar
    Respuestas
    1. Según la info el error se debe a que la variable img está vacía, no tiene datos.

      Eliminar
  4. Buenas, tengo un problemilla tengo conectada a la raspberry una camara insertada en la misma placa, no por USB y al ejecutar el programa no me da errores pero tampoco me muestra nada, he probado a poner en la linea cv2.VideoCapture(0) la 1 o 2 y asi por que pienso que la lib de opencv no funciona con la camara integrada, alguna idea de por que puede ser? tengo que comprar una camara que vaya por USB para que lo detecte bien el programa? Gracias de antemano

    ResponderEliminar
  5. Hola
    como puedo hacer para poner la ruta de una carpeta y que leer las imagenes y yo pueda elegir una?
    saludos

    ResponderEliminar
  6. hola tal vez la pregunta sea algo tonta, pero al momento de capturar el video usando la camara frontal de mi lap las dimensiones son grandes y no puedo redimensionarlo, existe algun comando dentro del script que me permita poner la altura y ancho de la salida. Gracias.

    ResponderEliminar
    Respuestas
    1. Para redimensionar la imagen capturada debes usar la función cv2.resize(...) en ella debes indicar la imagen a redimensionar y las dimensiones ancho y alto respectivamente, ejemplo:

      resized_image = cv2.resize(image, (100, 50))

      Eliminar
  7. Te hago una pregunta, tengo una imagen ya leida con imread a la cual le hice una serie de modificaciones. Ahora bien, quiero pasar esta imagen que ya la tengo que una variable a escalado de grises. Hay alguna forma de hacerlo sin guardar la imagen con imwrite y leerla con imread(path, cv2.IMREAD_GRAYSCALE) ?

    Desde ya muchas gracias.

    ResponderEliminar
    Respuestas
    1. Para esto usas la función cvtColor, ejemplo:

      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

      gray: variable en donde se guarda la imagen en escala de grises
      img: imagen de entrada
      COLOR_BGR2GRAY: código de conversión, BGR a GRAY

      Eliminar

  8. Hola disculpa la molestia estoy intentando desplegar texto en un vídeo, pero no logrado saber como hacer que aparezca y desaparezca en cierto tiempo, ¿podrías ayudarme?

    ResponderEliminar
  9. OpenCV: FFMPEG: tag 0x4356534d/'MSVC' is not supported with codec id 47 and format 'mp4 / MP4 (MPEG-4 Part 14)'
    [msvideo1 @ 0x26c58c0] Specified pixel format yuv420p is invalid or not supported
    Could not open codec 'msvideo1': Unspecified error

    con .avi me bota error, uso linux

    ResponderEliminar
  10. Buenas, estoy teniendo este problema y no consigo averiguar que es exactamente:

    [ERROR:0] global D:\Build\OpenCV\opencv-4.4.0\modules\videoio\src\cap.cpp (142) cv::VideoCapture::open VIDEOIO(CV_IMAGES): raised OpenCV exception:

    OpenCV(4.4.0) D:\Build\OpenCV\opencv-4.4.0\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): video.avi in function 'cv::icvExtractPattern'


    [ERROR:0] global D:\Build\OpenCV\opencv-4.4.0\modules\videoio\src\cap.cpp (563) cv::VideoWriter::open VIDEOIO(CV_IMAGES): raised OpenCV exception:

    OpenCV(4.4.0) D:\Build\OpenCV\opencv-4.4.0\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): output.avi in function 'cv::icvExtractPattern'

    ResponderEliminar
  11. Buenas, tengo un problema ret,imagen=captura.read()
    cv2.error: Unknown C++ exception from OpenCV code.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

Histogramas OpenCV Python

Modelo de Iluminación Phong - Tutorial OpenGL

tkinter Canvas