Sei sulla pagina 1di 9

Procesamiento Audiovisual

Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

Procesamiento Audiovisual
3 II/ITIS

OpenCV

Guin de prcticas

Descripcin
Instalacin
Uso de la librera
El tipo imagen
Crear imgenes
E/S bsica

Sesin 2. Uso de OpenCV en Qt Creator

Resumen

DESCRIPCIN

OpenCV (Open Source Computer Vision Library) es una librera de funciones en


C y C++ que contiene un conjunto de utilidades de procesamiento de imgenes,
visin artificial, captura de vdeo y visualizacin de imgenes. Es de cdigo abierto,
gratuita, multiplataforma (disponible para entornos MS Windows, Mac OS y Linux),
rpida, de fcil uso y en continuo desarrollo. Pginas web de OpenCV:
http://opencv.willowgarage.com/wiki (Documentacin en wiki)
http://sourceforge.net/projects/opencvlibrary (Descargar librera)
http://groups.yahoo.com/group/OpenCV (Foro de discusin)

OpenCV fue desarrollada originalmente por Intel. Actualmente es un proyecto libre


publicado bajo licencia BSD, lo que permite su uso tanto para aplicaciones
comerciales como no comerciales.

Usaremos OpenCV 2.0.0a.

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

INSTALACIN DE OpenCV 2.0.0a


5. Descargar OpenCV 2.0.0a:
http://sourceforge.net/projects/opencvlibrary
(Igual que dijimos con Qt, es posible que en este momento exista alguna versin
ms reciente de OpenCV. Por compatibilidad, recomendamos que para las prcticas
de PAV se use la versin 2.0.0a.)
6. Ejecutar el instalador descargado: OpenCV-2.0.0a-win32.exe

7. Lo instalamos con todas las opciones por defecto. Pero, ojo, la de aadir el directorio
de OpenCV al PATH del sistema debemos marcarla.

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

3.1. Importante: seleccionar la


opcin "Add OpenCV to the
system PATH for all users".

Guin de Prcticas

3.2. Instalar OpenCV en el


directorio por defecto:
C:\OpenCV2.0

3.3. Instalamos todo.

8. Observar las entradas incluidas en el men de inicio y la estructura de directorios


creada:
C:\OpenCV2.0

bin Archivos DLL (Dynamic Link Library), y algunos ejecutables de


prueba, test e informacin de las libreras.

src\cxcore Cdigo fuente del ncleo de la librera, operaciones de bajo


nivel sobre arrays, matrices e imgenes.

src\cv Cdigo fuente de la librera, operaciones de procesamiento de


imgenes y visin artificial.

src\cvaux, src\ml Libreras de funcionalidades avanzadas,


relacionadas con visin artificial (cvaux) y con clasificacin de patrones
(ml).

src\highgui Libreras para crear ventanas, leer y escribir imgenes


(formatos BMP, JPEG, PNG y TIF), archivos de vdeo (formatos AVI, MPG,
WMV y MOV) y captura de cmara.

include\opencv Contiene los ficheros de cabecera necesarios para


incluir en los programas C/C++. Los importantes son: cxcore.h, cv.h y
highgui.h.

doc Documentacin de las libreras. La parte principal de la


documentacin (el manual de referencia de OpenCV) est en el fichero
opencv.pdf.

lib Ficheros de descripcin de las libreras. Necesarios para usar las


DLL en nuestros programas de Qt Creator.

samples\c Programas sencillos en C que muestran diversas funciones


de OpenCV.

3rdparty, apps, data, interfaces, tests, utils Otros directorios que en


principio no nos interesan. Contienen cdigo fuente de los ejemplos y de
otras partes del proyecto. Recordar que OpenCV es de cdigo abierto.
9. Instalar HighGUI2. Descargar de:
http://dis.um.es/~ginesgm/files/doc/pav/highgui2.rar
Descomprimir el RAR en la carpeta: C:\OpenCV2.0 (sobrescribiendo los ficheros que
sea necesario).

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

Ver las novedades de HighGUI2: src\highgui\Changes.GGM.txt


10. Ejecutar los ejemplos de samples\c, y observar el cdigo de alguno de ellos. Ojo,
puede que algunos no funcionen, porque necesitan una cmara o parmetros
adicionales.
11. Echar un vistazo a la documentacin de OpenCV (doc/opencv.pdf).
12. Ojo: si al instalar no se aade el directorio C:\OpenCV2.0\bin al PATH del sistema,
entonces habr errores al ejecutar los programas de OpenCV. Si ocurre esto,
comprobar que el directorio C:\OpenCV2.0\bin est en el PATH (Mi PC | Propiedades |
Opciones avanzadas | Variables de entorno).

USO DE LA LIBRERA OPENCV CON QT CREATOR


13. La utilizacin de OpenCV en Qt Creator permite aprovechar la potencia de la primera
para el procesamiento eficiente de imgenes y vdeo, y la facilidad de la segunda para
el desarrollo rpido de aplicaciones interactivas en entornos de ventanas. Adems,
ambas son multiplataforma.
14. El cdigo de las libreras se encuentra en ficheros DLL (Dynamic Link Library), como
cxcore200.dll, cv200.dll y highgui200.dll. Los ficheros DLL contienen cdigo objeto
(cdigo ejecutable) que se enlaza de forma dinmica con la aplicacin. Por lo tanto,
nuestros programas usan estas libreras, pero no las incluyen en su cdigo. Los
ficheros DLL deben estar accesibles, o bien en el mismo directorio del programa
o en el PATH del sistema. Por lo tanto, para distribuir nuestros programas a otras
personas, debemos copiar esos tres archivos DLL en el mismo directorio del ejecutable.
15. Para poder usar OpenCV en nuestros proyectos necesitamos, bsicamente, dos cosas:
(a) dentro del cdigo, poner los #includes de los ficheros de cabecera adecuados; y (b)
dentro del proyecto de Qt Creator, aadir los ficheros de descripcin de las DLL, con
extensin .dll.a.
16. Vamos a ponernos manos a la obra. Abrir Qt Creator. Crear un nuevo proyecto de
tipo QMainWindow (ver los pasos del 10 al 15 de la sesin 1). Vamos a ver ahora todo
lo necesario para poder usar OpenCV en este proyecto.
17. Dentro del modo Edicin, abrir el fichero principal del proyecto (el fichero con
extensin .pro).
18. Aadir las siguientes lneas al final de dicho fichero:
INCLUDEPATH += "C:\OpenCV2.0\include\opencv"
LIBS += -L"C:\OpenCV2.0\lib" -lcv200 -lcxcore200 -lhighgui200

La primera de estas lneas aade el directorio de OpenCV al path de bsqueda de


los ficheros de cabecera. La segunda sirve para aadir los ficheros de descripcin
de las libreras DLL (se refiere a los ficheros .dll.a).
19. Finalmente, en todos los mdulos del programa que usen OpenCV debemos aadir los
includes necesarios:

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

#include <cxcore.h>
#include <cv.h>
#include <highgui.h>

20. Vamos ahora a aadir algo de cdigo al proyecto, para comprobar que todo ha ido
bien. Aadimos un botn al formulario. En el slot clicked() asociado a su pulsacin
escribimos el siguiente cdigo:
void MainWindow::on_pushButton_clicked()
{
IplImage *img= cvLoadImage("imagen.jpg");
cvNamedWindow("Imagen", 0);
cvShowImage("Imagen", img);
cvReleaseImage(&img);
}

cvLoadImage: funcin para leer una


imagen (debe existir el fichero
imagen.jpg)
cvNamedWindow: crear una ventana
cvShowImage: mostrar la imagen en la
ventana

21. Guardar el proyecto y ejecutarlo. Se ha compilado bien? Se ve la imagen al pulsar el


botn? Si la respuesta es s, todo ha ido perfecto. En otro caso, volver a repasar los
pasos anteriores. Si sigue sin funcionar, preguntar al profesor.

EL TIPO DE DATOS IMAGEN: IplImage*


22. Una vez que sabemos utilizar la librera OpenCV en Qt Creator, vamos a empezar a
manejar imgenes y las operaciones bsicas de entrada/salida. En este punto, sera
conveniente repasar el apndice A.1 del tema 1 de teora.
23. El tipo fundamental de OpenCV, el que nos permite representar imgenes, es
IplImage. Las imgenes pueden tener 1, 2, 3 4 canales, y distintos tipos de
profundidad. Las variables para imgenes sern siempre punteros a IplImage:
IplImage *img.
24. Los campos fundamentales del tipo IplImage son:
img->depth
profundidad de los pxeles ( IPL_DEPTH_8U, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F, ...)
img->nChannels nmero de canales de la imagen (normalmente 1 3)
img->width
ancho de la imagen (en pxeles)
img->height
alto de la imagen (en pxeles)
img->origin

origen de coordenadas; 0 = top-left (por defecto); 1 = bottom-left.

25. En memoria las imgenes siempre estn descomprimidas. El puntero img->data


apunta a la matriz de pxeles de la imagen. Normalmente no accederemos a los pxeles
directamente, sino que usaremos funciones de la librera.
26. Bsicamente, existen tres formas posibles de crear una nueva imagen:
26.1. Creando una nueva imagen vaca: cvCreateImage.
26.2. Leyendo una imagen desde un fichero: cvLoadImage.
26.3. Clonando una imagen existente: cvCloneImage.
27. Todas las dems funciones de OpenCV no crean imgenes, sino que necesitan que las
imgenes que se le pasan como parmetros existan. Al dejar de usar las imgenes,
deben de liberarse con cvReleaseImage.

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

CREANDO IMGENES NUEVAS


28. Crear una imagen vaca: cvCreateImage.
IplImage* cvCreateImage(CvSize size, int depth, int channels)
El primer parmetro es el tamao (variable de tipo CvSize). El segundo es la
profundidad de los pxeles (IPL_DEPTH_ [8U, 8S, 16S, 16U, 32S, 32F, 64F]). Y el
tercero es el nmero de canales de la imagen.
29. Ejemplo, aadir un botn al formulario y asociarle el siguiente cdigo:
IplImage *img;
img= cvCreateImage(cvSize(300, 200), IPL_DEPTH_8U, 3);
cvNamedWindow("Imagen vaca", 0);
cvShowImage("Imagen vaca", img);

29.1. Qu se ve? Por qu? Cmo inicializar la imagen?


(Respuesta: cvZero y cvSet)
29.2. Abrir el Administrador de tareas de Windows. Pulsar el ratn muchas veces y
observar la memoria asignada al proceso. Qu ocurre? Cmo arreglarlo?
(Respuesta: cvReleaseImage)
30. Leer una imagen desde un fichero: cvLoadImage.
IplImage* cvLoadImage (const char* nombre, int enColor=1)
El primer parmetro indica el nombre del fichero, y el segundo dice si se debe leer en
color (valor 1), en grises (valor 0) o tal y como est en el fichero (valor -1).
31. Probar lo siguiente:
cvNamedWindow("Imagen", 0);
for (int i= -1; i<=1; i++) {
IplImage *img= cvLoadImage("imagen.jpg", i);
cvShowImage("Imagen", img);
cvReleaseImage(&img);
cvWaitKey(2000);
}
cvDestroyWindow("Imagen");

32. La funcin cvLoadImage admite los formatos BMP, DIB, JPG, JPE, JPEG, PBM, PGM,
PPM, SR, RAS, TIF y TIFF. En HighGUI2 se aade GIF.
33. Clonar una imagen existente: cvCloneImage.
IplImage* cvCloneImage (IplImage* entrada)
cvNamedWindow("Imagen", 0);
IplImage *img= cvLoadImage("imagen.jpg");
for (int i= 0; i<255; i++) {
IplImage *cop= cvCloneImage(img);
cvSubS(cop, cvScalarAll(i), cop); // Restar una constante
cvShowImage("Imagen", cop);
cvReleaseImage(&cop);
cvWaitKey(10);
}

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

cvDestroyWindow("Imagen");
cvReleaseImage(&img);

34. Recordar: en cualquier caso, se deben liberar todas las imgenes al dejar de usarlas,
con cvReleaseImage(IplImage **img).

ENTRADA/SALIDA BSICA
35. Como hemos visto, HighGUI incluye un mecanismo muy sencillo para crear ventanas
en las que mostrar imgenes de tipo IplImage. Las ventanas de HighGUI se referencian
por un nombre, que es una cadena de tipo char*.
36. Para crear una nueva ventana se usa:
void cvNamedWindow(char *nombre, int flag)
36.1. Si ya existe una ventana con ese nombre, no hace nada.
36.2. El parmetro flag indica si se puede redimensionar el tamao de la ventana (valor
0) o no (valor 1).
36.3. En los ejemplos de los anteriores puntos, ver la diferencia entre poner
cvNamedWindow("Imagen", 0); y cvNamedWindow("Imagen",1);
37. Una vez creada una ventana, se muestran las imgenes en ella con:
void cvShowImage(char *nombre, IplImage *img)
El primer parmetro es el nombre de la ventana. Si no se existe, no hace nada. El
segundo parmetro es la imagen a mostrar.
38. La ventana se puede cambiar de tamao con cvResizeWindow y de posicin con
cvMoveWindow. Ver la ayuda. Probar, por ejemplo, el siguiente cdigo:
cvNamedWindow("Imagen", 0);
IplImage *img= cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3);
for (int i= 0; i<256; i++) {
cvSet(img, CV_RGB((i&7)*36,(i&28)*9,i&224));
cvShowImage("Imagen", img);
cvMoveWindow("Imagen", i, 100);
cvWaitKey(10);
}
cvReleaseImage(&img);

39. Las ventanas se pueden eliminar con cvDestroyWindow(char *nombre). Pero


tambin se puede dejar que las cierre el usuario del programa.
40. Prueba: en el ejemplo anterior, probar a cerrar la ventana en su camino. Qu ocurre?
Por qu?
41. Las imgenes se guardan en disco con cvSaveImage(nombre, img). Disponemos de
una gran variedad de formatos (BMP, JPG, TIF, GIF, PNG, etc.). El primer parmetro es
el nombre y el segundo un IplImage *. Ejemplo:
IplImage *img= cvLoadImage("imagen.bmp", 1);
cvSaveImage("salida.jpg", img);
cvReleaseImage(&img);

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

42. En el caso de los archivos JPG, se puede indicar la calidad de compresin JPG
llamando a la funcin cvSaveImage con un tercer parmetro adicional.
IplImage *img= cvLoadImage("imagen.bmp");
int param[2]= {CV_IMWRITE_JPEG_QUALITY, 2};
cvSaveImage("imagen.jpg", img, param);
cvReleaseImage(&img);

43. Leer una pulsacin de teclado:


int cvWaitKey(int time)
Lee una tecla. time indica cunto tiempo esperar (en milisegundos). Si no se pulsa en
ese intervalo, devuelve -1. Si time==0, espera indefinidamente. Ojo: para que esta
operacin funcione, debe haber alguna ventana de HighGUI abierta.
44. Ejemplo de cvWaitKey.
cvNamedWindow("Imagen", 0);
IplImage *img= cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
cvShowImage("Imagen", img);
int tecla= 0, x= 320, y=240;
while (tecla!=27) {
tecla= cvWaitKey(1);
switch (tolower(tecla)) {
case 'q': x-=4; break;
case 'w': x+=4; break;
case 'p': y-=4; break;
case 'l': y+=4; break;
}
cvSmooth(img, img, CV_GAUSSIAN);
cvSubS(img, cvScalarAll(1), img);
cvCircle(img, cvPoint(x,y),20,CV_RGB(255,255,255),-1);
cvShowImage("Imagen", img);
}
cvReleaseImage(&img);
cvDestroyWindow("Imagen");

45. El valor de los pxeles es de tipo CvScalar:


typedef struct CvScalar {
double val[4];
} CvScalar;
45.1.
45.2.

Leer el valor de un pxel: CvScalar cvGet2D(img, y, x)


Escribir el valor de un pxel: void cvSet2D(img, y, x, escalar)

46. Ejemplo de cvSet2D.


IplImage *img= cvCreateImage(cvSize(256,256),IPL_DEPTH_8U,3);
for (int y= 0;y<256;y++)
for (int x= 0; x<256; x++)
cvSet2D(img, y, x, CV_RGB(y,x,0));
cvShowImage("Resultado", img);

Procesamiento Audiovisual
Sesin 2. Instalacin y uso de OpenCV en Qt Creator

Guin de Prcticas

cvReleaseImage(&img);

RESUMEN

IplImage *cvCreateImage(size, depth, nchannels): crear una imagen


IplImage *cvLoadImage(nombre, flag): leer una imagen de disco
IplImage *cvCloneImage(img): clonar una imagen existente
cvSet(img), cvZero(img): inicializar una imagen con una constante
cvSaveImage(nombre, img): guardar una imagen a disco
cvReleaseImage(&img): liberar la memoria asignada a una imagen

cvNamedWindow(nombre, flag): crear una ventana


cvShowImage(nombre, img): mostrar una imagen en una ventana
cvDestroyWindow(nombre): eliminar una ventana
int cvWaitKey(time): leer una tecla desde teclado

CvScalar cvGet2D(img, y, x): obtener el valor de un pxel


cvSet2D(img, y, x, escalar): escribir el valor de un pxel
CV_RGB(r, g, b): definir una variable de tipo CvScalar (un pxel)
cvCircle: pintar un crculo. cvSmooth: suavizar una imagen. cvSubS: restar a
una imagen una constante.

Potrebbero piacerti anche