Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Las imágenes de las que haremos uso son instancias de la clase QImage, propia del
framework Qt. Sin embargo las funciones, clases y métodos de OpenCV esperan objetos
cv::Mat. Para convertir entre un formato y otro podemos emplear el proyecto
QtOpenCV de Debao Zhang (licencia MIT)
cvmatandqimage.cpp
cvmatandqimage.h
opencv.pri
Los archivos .pri tienen el mismo formato que los .pro pero están pensados para ser
incluidos por estos últimos. En nuestro caso el archivo opencv.pri contiene
información sobre como incorporar los archivos cvmatandqimage.cpp y
cvmatandqimage.h al proyecto, haciendo que las funciones por ellos definidas estén
disponibles para nuestra aplicación.
Si por cualquier motivo no estuviéramos haciendo uso de los archivos .pri tendríamos
que incorporar la librería al proyecto manualmente:
Mientras que en Windows este recurso no existe, por lo que la librería suele
incorporarse al proyecto como librería externa:
Librerías en C:\opencv\build\<ARQUITECTURA>\mingw\lib:
libopencv_core<VERSION>.dll.a
libopencv_video<VERSION>.dll.a
Para ambos sistemas, al terminar se nos abrirá el archivo .pro del proyecto con los
cambios correspondientes realizados. Debemos guardarlo para dar por finalizada la
incorporación de la librería.
QImage vs QPixmap
Una instancia de QPixmap es una representación de una imagen optimizada para ser
mostrada. Esto significa que en muchos sistemas sus características dependen de las de
la pantalla (p. ej. su profundida de color puede tener que ser la misma que la que
actualmente tiene el adaptador gráfico: 8 bits, 16 bits, 32 bits, etc.) y que internamente
se implementa mediante algún tipo de objeto del lado del servidor gráfico cuya función
es representar a las imágenes de cara al resto del sistema de ventanas. Por lo tanto, los
píxeles de un objeto QPixmap no son accesibles directamente por parte del aplicación.
Una instancia de QImage es una representación independiente del hardware de una
imagen. Básicamente permite leer y escribir imágenes desde un archivo y manipular los
píxeles directamente, sin que las características actuales del adaptador gráfico tengan
nada que ver. Los datos de la imagen se almacenan en el lado de la aplicación, por lo
que son accesibles a esta en todo momento.
Normalmente la clase QImage se utiliza para cargar una imagen desde un archivo,
opcionalmente manipular los píxeles y después convertirla a un objeto QPixmap para
mostrarla en la pantalla.
En nuestro caso existen dos motivos fundamentales para utilizar QImage en lugar de
QPixmap:
Detección de movimiento
Con acceso a las clases y funciones de OpenCV desde nuestra aplicación, podemos
pasar a resolver el problema que nos habíamos propuesto; detectar movimiento en una
secuencia de vídeo.
Como ocurre con muchas otras tareas en el campo de la visión por computador, esta se
puede resolver de múltiples maneras. Además es muy común que en cada técnica
posible haya una decena de parámetros que den resultados diferentes según como los
ajustemos.
Donde suponemos que previamente hemos convertido todas las imágenes de QImage a
cv::Mat y las hemos almacenado en un vector.
Al final de cada iteración del bucle tenemos para cada imagen un vector de contornos,
donde cada uno es un vector de puntos. Con los contornos se pueden hacer múltiples
operaciones. Por ejemplo calcular el rectángulo que contiene a cada uno (bounding box)
con cv::boundingRect() para pintarlos sobre la imagen antes de mostrársela al
usuario.
Referencias
OpenCV
QtOpenCV
QPixmap: It is not safe to use pixmaps outside the GUI thread