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.
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
Muy bueno!
ResponderEliminarBuena 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?
ResponderEliminar#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;
}
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.
EliminarNo m funciona el codigo del video, no llega a leer mi video, alguna idea?
ResponderEliminarverifica que la dirección del archivo de video esté correcto, o me das mas detalles del error.
EliminarBuenas me sale este error al ejecutar
ResponderEliminarLINK : fatal error LNK1104: no se puede abrir el archivo 'opencv_haartraining_engined.lib'
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?
ResponderEliminarLa 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:
EliminarMat C = A +B;
Puedes verlo en: http://acodigo.blogspot.com/2017/05/explorando-la-clase-cvmat-de-opencv.html
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?
ResponderEliminareste 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;
}