Introducción a OpenCV

Una vez hemos instalado OpenCV podemos comenzar a crear nuestra primera aplicación, en OpenCV, una librería de computación visual trabajaremos la mayoría del tiempo con imágenes y videos por lo cual lo primero que veremos será como cargar y mostrar imágenes y videos en nuestros proyectos.

Esta biblioteca puede cargar y guardar los formatos de imagen más comunes, como:

  • Windows bitmaps (*.bmp, *dib)
  • Portable image formats (*.pbm, *.pgm, *.ppm)
  • Sun rasters (*.sr, *.ras)

Adicionalmente también puede trabajar con otros formatos de imágenes siempre y cuando las librerías auxiliares estén activadas o incluidas la biblioteca al momento de la compilación, entre estos formatos tenemos:

  • JPEG (*.jpeg, *.jpg, *.jpe)
  • JPEG 2000 (*.jp2)
  • Portable Network Graphics (*.png)
  • TIFF (*.tiff, *.tif)
  • WebP (*.webp)

Mostrar una imagen en OpenCV

Lo primero es crear un proyecto OpenCV con la plantilla que previamente creamos, utilizando un script CMake, o manualmente si lo deseamos.

La clase cv::Mat es un contenedor para las imágenes, es el encargado de almacenar la información de cada uno de los pixeles que componen una imagen, nos provee acceso a ellos y libera la memoria automáticamente, todos los algoritmos que contiene la biblioteca OpenCV operan sobre esta clase.

Para leer una imagen usaremos la función cv::imread el primer parámetro es una cadena de texto que indica la imagen que deseamos leer, el segundo es opcional e indica el modo en que deseamos cargar la imagen, por defecto es CV_LOAD_IMAGE_COLOR una imagen a color, podríamos usar CV_LOAD_IMAGE_GRAYSCALE para cargar la imagen en escala de grises.

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv )
{
    // carga la imagen llamada "lena.jpg" a color
    Mat image = imread("c:/data/lena.jpg", CV_LOAD_IMAGE_COLOR);

    // verificar si la imagen ha sida cargada correctamente 
    if (image.empty())
    {
        printf("No image data \n");
        return -1;
    }

    // crear una ventana llamada "Display Image"
    namedWindow("Display Image", WINDOW_AUTOSIZE);

    // mostrar la imagen cargada en la ventana recien creada
    imshow("Display Image", image);

    // esperar a que se presione una tecla para salir
    waitKey(0);

    return 0;
}

La función cv::namedWindow crea una ventana con el nombre indicado, WINDOW_AUTOSIZE indica que la ventana adapta su tamaño para mostrar la imagen, con cv::imshow mostramos la ventana, debemos indicarle el nombre de la misma, además del cv::Mat que deseamos mostrar en ella.

Al finalizar usamos cv::waitKey(0) para indicarle a la ventana que debe esperar antes de cerrarse, como parámetro le indicamos la cantidad de milisegundos que debe esperar, utilizamos cero para que espere de manera indefinida hasta que se presione una tecla, esta función devuelve la tecla presionada, pero de momento no la necesitamos. 

OpenCV leer imagen a color con CV_LOAD_IMAGE_COLOR

OpenCV leer imagen a escala de grises con CV_LOAD_IMAGE_GRAYSCALE

Debemos prestar atención a la ruta donde se encuentra la imagen, en nuestro código de ejemplo "c:/data/lena.jpg" asumimos que la imagen se encuentra en el disco C:/ en la carpeta data, si la carpeta data estuviese dentro de nuestro proyecto usaríamos "data/lena.jpg".

Mostrar un video en OpenCV

Para reproducir un video se hace de forma similar a una imagen ya que un video no es más que una secuencia de imágenes, por lo que deberemos cargar las imágenes del video y mostrarla una tras otras, veamos cómo se hace:

namedWindow( "OpenCV Video", CV_WINDOW_AUTOSIZE);

// cargar el archivo de video especificado
VideoCapture vc("video.mp4");

// verificar si se ha podio cargar el video
if(!vc.isOpened()) return -1;

// obtener los cuadros por segundo
double fps = vc.get(CV_CAP_PROP_FPS);

// calcular el tiempo de espera entre cada imagen a mostrar
int delay = 1000 / fps;

while (true)
{
       Mat frame;
       
       // cargar el siguiente cuadro de video
       vc >> frame;

       // mostrar la imagen leida
       imshow("ventana", frame);

       // esperar un periodo de tiempo especificado por la variable delay 
       // si se presiona la tecla 27 (ESC) salir del while
       if(waitKey(delay) == 27) break;
}

Con esto logramos reproducir el archivo llamado video.mp4 que se encuentra en la carpeta de proyecto, debes modificar la ruta para reproducir tu propio video, los formatos soportados están determinados por las librerías activadas al momento de la compilación, por defecto ffmpeg.   

vc >> frame esta línea de código carga cada cuadro del video dentro de la variable frame para luego mostrarla, en cada iteración del loop se avanza hacia el siguiente cuadro, este código lo pudimos haber escrito de esta forma: vc.read(frame);

if(waitKey(delay) == 27) break; la función waitKey(0) espera a indefinidamente a que se presione una tecla, si indicamos un número mayor que cero será el periodo de tiempo en ms que esperará hasta que se presione una tecla, si en ese periodo no se ha presionado nada continua.

Descarga Codigo C++ OpenCV - Proyecto Introducción a OpenCV

Siguiente: Tutorial dibujar figuras y texto

Comentarios

  1. Buena noche. Muy buen aporte amigo. Quiero hacer una pregunta, al cargar este código y ejecutarlo obtengo un problema al querer mostrar una imagen .tif, conoces la razón?

    #include

    using namespace std;
    using namespace cv;

    int main()
    {
    cv::Mat ndvi=imread("NDVI.tif");
    cv::namedWindow("Imagen");
    cv::imshow("Imagen",ndvi);

    cv::waitKey();
    return 0;
    }

    ResponderEliminar
    Respuestas
    1. Prueba cargar una imagen en otro formato como PNG o JPG, si se muestra correctamente, el problema puede ser que tu compilacion de OpenCV no incluye los codecs o la librería para el formato TIFF.

      Eliminar
  2. No m funciona el codigo del video, no llega a leer mi video, alguna idea?

    ResponderEliminar
    Respuestas
    1. verifica que la dirección del archivo de video esté correcto, o me das mas detalles del error.

      Eliminar
  3. Buenas me sale este error al ejecutar
    LINK : fatal error LNK1104: no se puede abrir el archivo 'opencv_haartraining_engined.lib'

    ResponderEliminar
  4. Hola, una pregunta. Mi imagen es una matriz de 100x100. Bien a esta matriz quiero sumarle otra matriz del mismo tamaño. como lo hago?

    ResponderEliminar
    Respuestas
    1. La clase Mat tiene los operadores aritméticos sobre-cargados por lo que si tienes dos matrices A y B puedes obtener el resultado de la suma u otros operación con:

      Mat C = A +B;

      Puedes verlo en: http://acodigo.blogspot.com/2017/05/explorando-la-clase-cvmat-de-opencv.html

      Eliminar
  5. hola, tengo una pregunta trato de cargar 2 imágenes de 150MB cada una y me lanza un error es por que open cv tiene un limite con el tamaño de imágenes que puedo hacer?

    este es mi codigo:
    Mat imageRed = imread("images/OrtoImagenTest/band(3).tif", CV_LOAD_IMAGE_GRAYSCALE);
    Mat imageNir = imread("images/OrtoImagenTest/band(4).tif", CV_LOAD_IMAGE_GRAYSCALE);
    if (!imageRed.data || !imageNir.data)
    {
    cout << "error al leer las imagenes";
    return -1;
    }

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API