OpenCV 3.3 con Visual Studio

Es difícil explicar qué es OpenCV, no por su definición, sino por su gran utilidad y su amplio uso en diversas aplicaciones y ámbitos a nivel mundial (desde sistemas de seguridad con detección de movimiento hasta aplicaciones industriales/comerciales de reconocimientos de objetos). OpenCV (Open Source Computer Vision) es una biblioteca de código abierto de propósito general para la manipulación de imágenes & video, y además integra algoritmos de aprendizaje automático (aka machine learning). Visión artificial o visión por computador se suelen emplear como sinónimos en la literatura, siendo OpenCV, desde 1999, una referencia en dicho campo.

OpenCV es una biblioteca multiplataforma escrita en C (y desde la versión 2.0, incluye código C++), con wrappers para Python y Java. Se puede ejecutar en Windows, Linux, Android, MacOS, FreeBSD, OpenBSD y Maemo (por ahora). Incluye módulos de aceleración empleando CUDA y OpenCL. Es decir, ¡funciona casi en todas las plataformas!

Al estar implementada en C y C++, las operaciones en OpenCV son bastante eficientes, lo cual hace que tenga rápida ejecución aprovechando los procesadores multicores, primitivas de rendimiento integradas de Intel y funciones de Intel IPP (Intel Integrated Performance Primitives).

Instalar OpenCV

En este artículo, se muestra OpenCV 3.3 liberada el 03 de Agosto de 2017, la cual tiene como gran novedad la inclusión del módulo de DNN (Depth Neural Network) para el Deep Learning.

El primer paso es descargar la versión 3.3 desde la sección Release de la página oficial de OpenCV http://opencv.org/ como se muestra en la imagen.

Para el caso de Windows, se empleará el Win pack (opencv-3.3.0-vc14.exe) el cual descomprimirá un conjunto de archivos de la siguiente forma:

En mí caso, lo ubique en C:/opencv/ En la carpeta build/ se encuentran los archivos necesarios para enlazar un código con OpenCV (e.g. headers, libs, pyd, jar). La carpeta sources/ contiene el código fuente de OpenCV y los archivos necesarios para ser compilado empleando CMake. Finalmente, la carpeta Win32/ posee un par de logs informativos de compilación en Debug y Release.

Así, para emplear OpenCV directamente con la version descargada, se empleará el contenido de la carpeta build/

Las carpetas bin/ (binarios), include/ (cabeceras) y x64 (dlls), serán las relevantes para este post 🙂

Visual Studio 2015

Por defecto, la versión 3.3 contiene los DLLs para la versión 14 de Visual C++ (Visual Studio 2015).  Entonces, se crea un proyecto en Visual Studio del tipo Win32 Application, seleccionando Console application, en un proyecto vacío.

Con el proyecto vacío, se añade un archivo de extensión .cpp para escribir el código principal. Como primer paso, se quiere enlazar los archivos necesarios y compilarlo. Ubicándose en las propiedades del proyecto en Visual Studio, se añade la ubicación de los archivos de encabezado (headers) y las bibliotecas compiladas (lib). Luego, ir a VC++ Directories y se verá algo como la siguiente imagen:

(abrir la imagen en nueva pestaña/ventana para mayor resolución)

Nótese lo remarcado en los cuadros verdes: Include Directories y Library References. Allí, se añade la ubicación de include/ y lib/ de OpenCV. Esta información también se puede colocar como variables del sistema de Windows.

Un detalle importante: la versión 3.30 descargada fue compilada en un compilador de 64 bits. Lo mismo debe especificarse en la versión de plataforma de Visual Studio (i.e. x64 en vez de x86).

En este punto, los headers y libs están asociados al proyecto. Sin embargo, aún falta los dlls de opencv, específicamente opencv_world330d.dll (para trabajar con la versión debug) o opencv_world330.dll (para trabajar con la versión release) y opencv_ffmpeg330_64.dll. En principio, es posible colocar la ruta C:\opencv\build\x64\vc14\bin dentro de Visual Studio (igual que los headers y libs, pero en Executable Directories); pero Visual Studio no garantiza el enlace en tiempo de ejecución.

La forma de hacerlo es colocando los dlls en el $PATH$ del sistema, o copiar los dlls en la carpeta de trabajo, o una nueva variable del sistema (e.g. $DLLS, $OpenCV). Cualquier opción es válida. Para ser portable con el código, se debe copiar todo el DLL en la carpeta local.

El código base

La principal idea es que ¡el código compile! Así, se añadirá una función main vacía con los enlaces a OpenCV:

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

#pragma comment (lib, "opencv_world330d.lib")

int main()
{
  return EXIT_SUCCESS;
}

La línea 1 añade el header estándar de C++.

La línea 2 añade un encabezado que incluye todas las funciones disponibles en OpenCV. Para este ejemplo, se empleará dicho #include. Sin embargo, se puede ser especifico al incluir solo core.hpp, highgui.hpp, o imgcodecs.hpp.

La línea 4 enlaza, en Visual Studio, la implementación de todas las funciones definidas en OpenCV (versión debug).

Las líneas posteriores corresponden a una función main vacía.

Este código, debería compilar sin errores o warnings.

Abrir y desplegar una imagen

El siguiente código va ubicado en el archivo principal cpp.

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

#pragma comment (lib, "opencv_world330d.lib")

int main()
{
  std::string strImageName("image.jpeg");	//set image name
  cv::Mat image = cv::imread(strImageName, cv::IMREAD_COLOR); //read the file

  if (image.empty())	//check for invalid input
    return EXIT_FAILURE;

  //cv::namedWindow("OpenCV Basic Example", cv::WINDOW_AUTOSIZE); //create a window for display
  cv::imshow("OpenCV Basic Example", image);	//show image into a default window

  cv::waitKey(0);    //wait to press any key
  return EXIT_SUCCESS;
}

En este post, se usará la versión “larga” del namespace de STL y de OpenCV. Así, se utiliza std:: y cv:: en vez de

using namespace std;
using namespace cv;

Primero se busca cargar una imagen válida, y en caso de existir continua la ejecución. Luego, se crea un objeto del tipo Mat (llamado image).

Al objeto image se le asigna el retorno de la función cv::imread la cual carga una imagen (primer argumento), e identifica en qué formato se desea la imagen:

  • IMREAD_UNCHANGED (<0) carga una imagen tal como se encuentre (incluyendo el canal alpha si existe)
  • IMREAD_GRAYSCALE (0) carga la imagen en escala de grises
  • IMREAD_COLOR (>0) carga la imagen en formato RGB

OpenCV permite cargar diversos formatos de imágenes, así que puedes reemplazar image.jpeg con el formato/imagen que desees.

En este punto, la imagen se encuentra cargado correctamente. Para mostrar dicha imagen en una ventana, se emplea la función cv::imshow, donde se debe especificar el nombre de la ventana y el objeto a mostrar.

Previo a dicha función, es posible emplear la función cv::namedWindow la cual permite especificar la característica de redimensionar la ventana de despliegue o no. Claro, esta característica es válida solo si no se usa Qt para su despliegue (no vamos a explorar en este punto).

Resultado de la ejecución

Es posible conseguir el mismo resultado pero usando un compilador un poco más nuevo como Visual Studio 2017. Para ello, se debe trabajar con la carpeta sources/ de la versión descargada. Este proceso es un poco más largo, y quizás lo desarrolle en otro post.

Resumen: Si quieres empezar con Computer Vision, OpenCV es tu opción 🙂

Anuncios

Acerca de smittynpro

Escribiendo algunas cosas de computación gráfica
Esta entrada fue publicada en Algoritmos, Bibliotecas, Código y etiquetada , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s