37
DRAFT Universidad de Valladolid Tratamiento de Imagen y Sonido Notas de Clase Author: Luis M. Fuentes March 8, 2013

Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Universidad de Valladolid

Tratamiento de Imagen y Sonido

Notas de Clase

Author:Luis M. Fuentes

March 8, 2013

Page 2: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Chapter 1

Qt

1.1 Introduccion a Qt

1.1.1 Presentacion

Podemos definir Qt como una libreria/biblioteca de clases para el desarrollo de inter-faces de usuario basados en C++. La aplicacion ası desarrollada puede ser compilada yejecutada en Windows, Mac OSX, linux y varias ramas de Unix. Existe una version deQt para la ejecucion en plataformas mobiles.

Qt is a cross platformdevelopment framework written in C++

Qt incluye soporte para otras tecnologıas como OpenGL, XML, bases de datos, We-bkit, multimedia, multithreading, iternacionalizacion, etc. Dispone ademas de enlaces obindings para utilizar otros leguajes de programacion como Python, Ruby o C#.

Page 3: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Qt proporciona ademas un entorno de programacion o IDE propio: Qt Creatorası como un programa para la creacion grafica de los GUI s Qt Designer y un sistemade ayuda propio Qt Assistant, como programa externo, ademas del incorporado en elentorno de programacion.

Figure 1.1: Program de ayuda para Qt: Assistant

Multitud de programas comerciales utilizan Qt, podemos citar Autodesk Maya, TheFoundry’s Nuke, Adobe Photoshop Album, Google Earth, Skype, VLC media player,VirtualBox, Dassault DraftSight, Mathematica, etc. y empresas o entidades como laAgencia Espacial Europea, DreamWorks, HP, KDE, Lucasfilm, Panasonic, Philips, Sam-sung, Siemens, Volvo, Walt Disney Animation Studios o Research In Motion, etc. Enresumen, Qt presenta una opcion para la programacion de GUI s con multiples ventajas,entre las que destacan la portabilidad entre los sistemas operativos mas comunes y lapresencia de untorno de programacion integrado. Para finalizar, Qt es gratuito para eldesarrollo de aplicaciones de codigo abierto: http://qt-project.org

Figure 1.2: Algunos usuarios y aplicaciones Qt

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 3

Page 4: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

1.1.2 Instalacion

La forma mas sencilla de instalar Qt es la descarga del Qt SDK que contiene:

• El entorno de trabajo Qt: las librerias de clases tanto enbinario como en codigo fuente, los ficheros de cabecera yla documentacion.

• El entorno de desarrollo integrado IDE Qt Creator

• Una utilidad para la actualizacion de los modulos del kit

• Las APIs para desarrollar una gran variedad de apli-caciones y servicios de plataformas moviles o familiarespara los usuarios de dichas plataformas, Qt Mobility.

• La nueva tecnologıa declarativa para el desarrollo rapidode GUIs, Qt Quick. Incluye QML, un lenguaje similara CSS + JavaScript.

Al escribir estas notas, el SDK conteniendo las librerias Qt 5.0.1 y el entorno de desar-rollo Qt Creator 2.6.2 se puede descargar de (http://qt-project.org/downloads).El archivo descargado es un ejecutable (.exe en Windows, .dmg en MacOSX y .run enlinux) preparado para instalar las librerıas en formato y localizacion acorde con el sistemaoperativo (es probable que, bajo linux, haya primero que hacer ejecutable el fichero deinstalacion chmod u+x instalador.run). No obstante, el paquete de linux esta desarrol-lado para Ubunto, por lo que, para evitar complicaciones, es recomendable instalar laslibrerias y el entorno de desarrollo usando los gestores de paquetes de la distribucion quese utilice:

• (K)ubuntu : qt-sdk

• Debian, OpenSUSE y Gentoo : qt-creator

• Arch Linux : qt qt-doc qt-creator

• Chakra linux : qt5-5.0.1-1 qtcreator-2.6.2-1 .....

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 4

Page 5: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

En particular, en las distribuciones usando el escritorio KDE (entre las que recomen-damos Chakra) las librerias ya estan instaladas por defecto, luego solo se precisa lainstalacion del entorno de desarrollo y la documentacion.

Por ultimo senalar que Qt esta programada en C++ y los programas que se creencon esta librerıa deberan ser compilados con un compilador de C++. Esto es posiblehacerlo en un entorno de programacio como Qt Creator u otros como Visual Studioo Eclipse descargando e instalando los plug-ins o anadidos necesarios. Sin embargo, estambien posible compilar y ejecutar desde la linea de comando. Para ello existe la utilidadqmake que simplifica este proceso y lo hace viable independientemente de la plataformautilizada. qmake genera el archivo makefile, requerido para la compilacion con make,o proyectos para Microsoft Visual Studio basandose en la inforacion sobre el programacontenida en el fichero proyecto (programa.pro).

1.1.3 Qt Creator

Qt Creator1 es un entorno de desarrollo integrado (IDE) pensado para la creacionde aplicaciones que utilicen el entorno de programacion Qt, desarrollado para la creacionde programas con interfaces de usuario complejas para su posterior distribucion a variossistemas operatorios (Microsoft Windows R© , Mac OS X R©, and Linux R©).

Introduccion

Qt Creator fue desarrollado para responder a las necesidades de los drogramadoresque utilizaban Qt y buscaban simplicidad, productividad, capacidad de expansion yapertura manteniendo a la vez una curva de aprendizaje asumible para los recien llegados.Las caracterısticas de Qt Creator permiten a los programadores:

• iniciar el desarrollo de una aplicacion de una forma sencilla y rapida con el ProjectWizard o reanudar el trabajo donde se dejo mediante un acceso rapido y sencillo alas sesiones y proyectos mas recientes.

• utillizar el editor integrado (Qt Designer) para el desarrollo de aplicaciones coninterfaz de usuario basado en las widgets de Qt.

• desarrollar aplicaciones utilzando el editor de codigo C++ .

• construir, ejecutar y empaquetar proyectos basados en Qt para multitud de platafor-mas desktop y mobiles como Microsoft Windows, Mac OS X, Linux, Symbian,MeeGo, o Maemo.

• hacer debug con los debuggers GNU y CDB usando el entorno grafico

• acceder de forma rapida y sencilla a la documentacion con el sistema integrado deayuda Qt Help

Qt Creator esta tambien disponible (http://qt-project.org/downloads#qt-creator)para su descarga individual, proporcionando archivos de instalacion para distintas platafor-mas.

1http://qt-project.org/wiki/QtCreatorWhitepaper

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 5

Page 6: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Crear un proyecto

Al ejecutar por primera vez Qt Creator, o si no esta programado para cargar au-tomaticamente el ultimo proyecto, el programa despliega el modo Welcome con las sigu-ientes pestana:

• Getting started, con una introduccion al IDE, su interfaz de usuario, etc.

• Develop, que muestra los proyectos y archivos mas recientes

• Examples, que permite el estudio y ejecucion de la coleccion de ejemplos que ilustrael funcionamiento de los distintos modulos de Qt

• Tutorials, videos para el aprendizaje de Qt

Como ejemplo sobre el que trabajar mas adelante, creemos un proyecto con el sistemaautomatico que proporciona el programa:

1. Para ello seleccionamos la pestana Develop en el modo Welcome (los modos seencuentra en la parte superior del lateral izquierdo), seleccionando del panel de laizquierda la opcion Create Project.

2. Se abre una ventana para elegir el template del nuevo proyecto: seleccionamos Appli-cations y de las opciones ofrecidas para este template, elegimos Qt Gui Applicationy presionamos el boton choose.

3. Ahora seleccionamos el lugar en nuestro sistema de archivos donde se almacenrael proyecto y su nombre prueba. Acontinuacion se selecciona el kit, es decir, laplataforma para la que se desarrolla, elegiremos Desktop y solo el modo Debug,presionando continue.

4. A continuacion se nos pregunta por el nombre de la clase principal de la GUI denuestro programa, normalmente la llamarameos MainWindow y heredara la claseQMainWindow de Qt; los nombres de los archivos cabecera mainwindow.h y fuentemainwindow.cpp seran sugeridos teniendo en cuenta el nombre elegido para la clas.Por ultimo nos aseguramos que la opcion para le edicion de la interfaz con QtDesigner esta desactivada (generate form sin seleccionar).

5. Tras presionar continue nos aparece un resumen del proyecto y se nos preguntasi queremos mantener un sistema de versiones, que no seleccionaremos, por lo queterminaremos presionando Done.

El proyecto ası creado ya es compilable y ejecutable y crea una ventana vacia.

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 6

Page 7: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFTFigure 1.3: Pantalla de entorno de desarrollo qt-creator

Escribiendo codigo

Para empezar a escribir codigo se selecciona el archivo en la lista de la derecha es-tando en el modo Edit. El editor de texto ofrece, entre otras, las siguientes ayudas alprogramador:

• resalta de las palabras clave, sımbolos, constantes y macros en los ficheros C++.

• ofrece completar la palabra para elementos, propiedades, incluyendo las clasescreads por el usuario.

• comprueba la sintaxis del codigo, marcando errores mientras se escribe, haciendofacil la localizacion de errores tipograficos sin necesidad de compilar.

• puede comprimir o expandir (code folding) funciones en el codigo fuente, facilitandola navegacion por el mismo.

• localiza de forma rapida, ficheros, funciones, sımbolos y otro tipo de informacion

• permite hacer debug con inspeccion de variables, puntos de ruptura, etc.

• integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida,o activando el modo de ayuda con busqueda por temas, etc.

En definitiva, Qt Creator ofrece un entorno de desarrollo bastante completo para lacreacion de aplicaciones basadas en Qt.

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 7

Page 8: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

1.1.4 Modulos de Qt

Qt es una librerıa modular que se ha ido expandiendo desde el modulo principal dewidgets para la creacion de interfaces graficos de usuario.

QtCore

Es el modulo que contiene el nucleo de las clases no graficas. Todos los demas modulosse basan en el. Contiene clases como QDir para gestionar directorios, QFile para escriturao lectura de ficheros o QVector para el manejo de matrices dinamicas.

QtGui

El modulo que contiene los componentes necesarios para la creacion de interfacesgraficas, widgets, es QtGui. Entendemos por widget cualquiera de los elementos queforma parte de una interfaz grafica de usuario, desde la ventana principal a un boton, asıcomo otras necesarias para definir sus atributos, comportamiento o colocacion. Podemosponer como ejemplo QColor para la definicion y manejo de colores, QPushButton parala creacion de botones para presionar o QToolBar para la creacion de una barra deherramientas.

QtOpenGL

Este modulo ofrece clases que facilitan el uso de OpenGL en aplicaciones Qt, siendola mas importante QGLWidget, una widget que admite y ejecuta todos los comandosOpenGL.

QtNetwork

Aglomera las clases creadas para interaccionar con la red y crear aplicaciones que lohagan, tales como QFtp, QSslKey o QTcpSocket.

QtMultimedia

Es un modulo esencial que proporciona un conjunto de clases para el manejo decontenido multimedia y el acceso al hardware multimedia, camara, microfono y altavoces,tales como QCamera, QAudioInput o QMediaPlayer.

QtSql

Permite la programacion de aplicaciones para el tratamiendo de bases de datos. LasAPIs de este modulo estan divididas en tres capas: driver, SQL API e interfaz de usuario.La primera de ellas Driver Layer proporciona el puente a bajo nivel para conectar la basede datos y las APIs SQL usando clases como QSqlDriver o QSqlResult. La capa APISQL API Layer proporciona acceso a las bases de datos usando las clases QSqlDatabaseo QSqlQuery. Finalemenet, la capa de interfaz de usuario User Interface Layer comunicalos batos de la base de datos con las widgets preparadas para acogerlos usando clasescomo QSqlQueryModel.

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 8

Page 9: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Otros

Qt dispone ademas de otros modulos para la programacion de dontenidos especıficos,como QtSvg, QtQml, etc. Se puede obtener una informacion mas completa ası como laenumeracion de todas las clase implicads y ejemplos de uso en:

http : // qt−p r o j e c t . org /doc/ qt −5.0/ q tdoc / modules . html

1.2 qmake y archivos de proyecto .pro

Los ficheros de proyecto *.pro contienen toda la informacion necesaria para queqmake construya la aplicacion, librerıa o plugin. Las fuentes utilizadas en el procesose especifcan en el fichero mediante una serie de declaraciones. Modificadores adicionalespermiten la especificacion de recursos especıficos de cada plataforma. A continuacionaparece un resumen del contenido del manual on-line sobre qmake,

http : // qt−p r o j e c t . org /doc/ qt −4.8/qmake−manual . html

1.2.1 Variables

En el fichero de proyecto las varables se utlizan como contenedores de listas de cadenasde caracteres (strings). En un fichero de proyecto muy simple aparecen unicamente laconfiguracion a usar y los nombres de ficheros involucrados

TARGET = pruebaTEMPLATE = appSOURCES += main . cpp mainwindow . cppHEADERS += mainwindow . h

qmake busca ciertas variables en el fichero de proyecto y usa su contenido para lacreacion del fichero Makefile. En el ejemplo anterior, se debe de construir una aplicacionllamada prueba con los ficheros fuente main.cpp y mainwindow.cpp y el cabecera main-window.h. Veamos algunas de estas variables:

• CONFIG Opciones generales del proyecto (release, debug, warn on, ...)

• DESTDIR El directorio en el que se situara el ejecutable o fichero final

• FORMS Lista de ficheros .ui con la informacion de la interfaz grafica

• HEADERS Lista de ficheros cabecera .h usados en el proyecto

• QT Opciones de configuracion especıficas de Qt (+opengl)

• RESOURCES lista deficheros .rc a incluir eb el proyecto final

• SOURCES lista de ficheros de codigo fuente utilizados en la construccion del programa

• TEMPLATE el patro usado en la construccion de la aplicacion (app, lib, vcapp, ...)

Se puede acceder a los contenidos de una variable con el operador $$ y asignar, porejemplo, los contenidos de una variable a otra:

TEMP SOURCES = $$SOURCES

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 9

Page 10: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

1.2.2 Otros conceptos

Espacios en blanco

Normalmente, las variables contiene listas de valores separados por espacios en blanco.Sin embargo, cuando uno de estos valores contiene un espacio en blanco, el valor debeaparecer entre comillas,

DEST = ”Program F i l e s ”INCLUDEPATH += ”C: / mylibs / extra headers ”

tratandose al texto entre comillas como un elemento de la lista de valores. Se usa tambienel entrecomillado para especificar paths que contengan espacios

Comentarios

Es posible anadir comentarios en un fichero de proyecto. Los comentarios debencomenzar con el caracter # y pueden extenderse solo una lınea

# Comments u s u a l l y s t a r t at the beg inning o f a l i n e , but they# can a l s o f o l l o w other content on the same l i n e .

Funciones internas y control del flujo

Existen funciones internas a qmake que permiten el procesamiento del contenido delas variables. La mas usada es la funcion include seguida del nombre de un fichero deproyecto cuyo contenido es incluido en lugar de la funcion.

i n c lude ( other . pro ) .

Se pueden usar tambien contenidos condicionados, como los llamados scope que per-miten condicionar una parte del fichero a la plataforma, pues solo se ejecutan cuando lacondicion se cumple:

win32 {SOURCES += paintwidget win . cpp}

La variable win32 adquiere automaticamente el valor true bajo el sistema opertivo Win-dows, pero puede inicializarse tambien en otras plataformas con la opcion -win32 en laejecucion de qmake. hay que destacar que el primer parentesis debe situarse en la mismalınea que la condicion. Hay que destacar que kas opciones especificadas en CONFIGpueden usarse tambien como condicionante:

CONFIG( opengl ) {message ( Bui ld ing with OpenGL support . )} else {

message (OpenGL support i s not a v a i l a b l e . )}

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 10

Page 11: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

1.2.3 Declaracion de librerıas

Si la variable CONFIG contiene el valor qt se habilita el soporte para aplicacionesQt. Esto posibilita ajustar los modulos de Qt que van a utilizarse en la aplicacion. Estose sonsigue utilizando la variable QT, que puede utilizarse para declarar los modulos querequerira la aplicacion. Ası, por ejemplo, para utlizar los modulos de red y bases de datosintroducirıamos en el fichero de proyecto:

CONFIG += qtQT += network xml

Por defecto, qmake incluye los dos modulod basicos en la construccion del programaQtCore y QtGui. Si, por ejemplo, no queremos usar interfaz grafica podemos eliminar elsegundo de ellos con

QT −= gui

Si se desea utilizar otras librerıas externas en la aplicacion, hay que decalararlas en elfichero de proyecto. Los directorios en los que qmake debe buscar las librerıas especifi-cadas se anaden a la variable LIBS usando la notacion tıpica de los sistemas estilo UNIX:−L para especificar directorios y −l para ficheros, sin espacios en blanco:

LIBS += −L/ usr / l o c a l / l i b −lmath

La especificacion de las directorios de los ficheros cabecera se realiza usando la variableINCLUDEPATH, separados por un espacio en blanco.

INCLUDEPATH = c : / msdev/ inc lude d : / s t l / i n c lude

1.2.4 Resources: Imagenes, iconos, etc

Se pueden usar imagenes para mejorar el impacto visual, iconos para personalizar elejecutable, sonidos para determinados eventos, etc. Qt permite que sus proyectos utiliceno incorporen dichos elementos, llamandolos fuentes (resources). Este tipo de archivosestan almacenados en diferentes directorios del disco lo que dificulta la portabilidad delproyecto. La ventaja de incorporar dependencias como estas en el fichero de proyecto esque se puede acceder a ellas usando paths que no dependen de la computadora en uso yque se incorporan automaticamente al instalar el ejecutable.

Qt proporciona dos metodos para usar iconos estandar: uno es obtenerlo del estilousado en la presentacion del desktop QStyle::standardIcon() y el otro del algun plug-in con temas o iconos QIcon::fromTheme(). Tambien es posible usar iconos o imagenesde otras fuentes. Para ello se crea un fichero de fuentes (.qrc), en formato XML, que seha de anadir al proyecto:

<!DOCTYPE RCC><RCC v er s i o n=” 1 .0 ”><qresource>

< f i l e >images /copy . png</ f i l e >< f i l e >images / cut . png</ f i l e >< f i l e >images /new . png</ f i l e >

</qresource></RCC>

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 11

Page 12: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Por defecto, los ficheros son accesibles desde la aplicacion usando el mismo nombreespecificado en el fichero de fuentes, con el prefijo :/ (:/images/cut.png) o accediendo enformato URL qrc (qrc:///images/cut.png). Pero podemos ismplificar el acceso, caso deque el nombre resultaria demasiado largo, usando el atributo alias del comenado file:

< f i l e a l i a s=” cut . png”>images / cut . png</ f i l e >

y accediendo a el como :/cut.png. Tambien es posible especificar un path comun paratodos los ficheros usando el atributo prefix del comando qresource y accediendo con elpath :/resources/cut.png :

<qre source p r e f i x=”/ r e s o u r c e s ”>< f i l e a l i a s=” cut . png”>images / cut . png</ f i l e >

</qre source

Antes de usarse, el fichero de fuentes ha de ser compilado. Para ello se introduce enel proyecto anadiendo en el archivo .pro la lınea (normalmente nombre coincide con elnombre de la aplicacion):

RESOURCE += nombre . qrc

Qt-Creator es tambien un editor de archivos de fuentes y puede ser utilizado para sucreacion o modificacion, siendo mas sencillo anadir ası nuevos ficheros.

1.3 QObject: Signals y Slots

1.3.1 QObject

QObject es la clase base de todos los objetos Qt (clases derivadas de ella), la basede su modelo de funcionamiento con signals y slots para comunicarse con otros objetos.Se puede conectar una signal con un slot con connect() y deshacer la conexion condisconnect(), bloquear senales con blockSignals() o seguir la estela de conexionescon las funciones protegidas connectNotify() y disconnectNotify().

Los objetos se organizan en arboles. Cuando se crea unobjeto nuevo especificandootro objeto como padre, este ultimo le anade de forma automatica a su lista de hijos,tomando posesion de el, es decir, destruira automaticamente todos sus hijos en su destru-tor. Cuando se destruye un objeto, se emite de forma autmatica la senal destroyed().

QObject es la clase base en la mayorıa de las clases QT. Algunos ejemplos de excep-ciones son las clases que deben ser pequenas o ligeras (como las primitivas graficas), lasclases que son contenedores de datos (como QString o Qlist) y las clases que necesitanla posibilidad de ser copiadas (los QObjects no puden copiarse). Esto se debe a unacaracterıstica de QObject, cada instancia es unica:

QObject instances are individuals!

y, por lo tanto, pueden tener un nombre propio (QObject::objectName),pueden comu-nicarse con otros objetos y ocupan un lugar en la jerarquıa de objetos.

Todos los objetos se preprocesan y convierten en meta-objetos. Cada clase que se de-rive de un QObject (o de otra clase derivada) y quiera contar con el mecanismo de signals

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 12

Page 13: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

y slots debe incorporar en la primera linea de coodigo de su definicion la macro Q OBJECT.El meta-objeto tiene informacion sobre la clase del objeto (QObject::className), suspropiedades, sus signals y slots e informacion en general suminstrada en la definicion dela clase. Esta informacion se recopila en tiempo de compilacion de los ficheros de cabeceraque contienen las declaraciones de las clases mediante el met-object compiler o moc:

Figure 1.4: Proceso de construccion de un proyecto Qt C++

Las propiedades de los QObjects son manipuladas usando metodos estadar denomi-nados coloquialmente setter y getter, uno para dar un valor a la propiedad y otro paraobtenerlo: setter devuelve void y lleva el valor a asignar como unico argumento mientrasque getter no tiene argumentos y devuelve el valor. La existencia de este tipo de fun-ciones otorga ciertas ventajas, como la posibilidad de comprobar los valores asignados oreaccionar a los cambios. Existe tambien un convenio para sus nombres:

• No boleanas : propiedad - setPropiedad

• boleanas : isEnabled - setEnabled

Estas propiedades pueden accederse directamente, usando getter y setter o a traves delsistema de meta-objetos:

QString text = labe l−>t ex t ( ) ;QString text = object−>property ( ” text ” ) . t oS t r i ng ( ) ;l abe l−>setText ( ” He l lo World” ) ;ob ject−>se tProper ty ( ” text ” , ” He l lo World” ) ;

para finalizar volvamos con el manejo de memoria. Como se menciono con anteriori-dad, cuando en la creacion de un objeto se especifica su padre, el objeto creado pasaa pertenecer al arbol del progenitor y por lo tanto sera destruido de forma automaticacuando este se destruya, lo que simplifica enormementa la programacion al no tener queverificar la destruccion de dichos objetos; resulta muy util al implementar jerarquiasvisuales en las ventanas:

QDialog ∗padre = new QDialog ( ) ;QGroupBox ∗ ca ja = new QGroupBox( padre ) ;QPushButton ∗boton = new QPushButton ( padre ) ;QRadioButton ∗ opcion1 = new QRadioButton ( ca ja ) ;QRadioButton ∗ opcion2 = new QRadioButton ( ca ja ) ;delete parent ;

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 13

Page 14: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

donde padre destruye caja y boton mientras caja borra opcion1 y opcion2. Por supuesto,los objetos pueden cambiar de progenitor:

obj−>setParent ( nuevoPadre ) ;

1.3.2 Signals y Slots

Signals y Slots, o senales y procedimientos, constituyen la herramienta basica enla comunicacion entre QObjects y la caracterıstica principal de las librerıas Qt, que hacefacil la implementacion del Observer Pattern.

Cualquier Widget (o clase derivada de QObject creada por el usuario) emite senalescuando ciertos eventos tienen lugar. Por ejemplo, un boton emite la senal clicked cuandoes presionado. El usuario puede optar por conectar esa senal (signal) creando una funcion(slot) y luego conectando ambas con la funcion connect().

connect ( button , SIGNAL( c l i c k e d ( ) ) , qApp , SLOT( qu i t ( ) ) ) ;

Esta comunicacion no requiere que las clases que emite la senal y la que ejecutara elprocedimiento se conozcan entre sı, lo que simplifica la reutilizacion de las clases. Signalsy Slots son type-safe, es decir, solo admiten argumentos del tipo declarado y los erroresde tipo se anuncian como advertencias sin causar la interrupcion del programa.

Figure 1.5: Mecanismo Signal-Slot de Qt

Ademas, se pueden anadir o eliminar conexiones en tiempo de ejecucion, se puedenejecutar los meetodos de forma inmediata cuando se emite la senal o ponerlos en cola parauna ejecucion retardada e incluso se pueden comunicar objetos que se estan ejecutandoen distintos hilos.

La implementacion del mecanismo signal-slot se realiza en C++ usando el preproce-sador y el compilador moc (Meta-object Compiler). La generacion de este codigo se realiza

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 14

Page 15: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

de forma automatica y el programador no necesita editar o incluso ojear dicho codigo.Para finalizar, un apunte sobre codificacion 2, Signals y Slots son mas reutilizables sino utilizan argumentos de tipos especiales.

Signals

Un objeto emite una senal cuando su estado interno ha cambiado de forma que puedaresultar interesante para el cliento o el propietario de dicho objeto. Solo la clase en laque esta definida una senal, o sus derivadas, pueden emitir dicha senal.

Cuando se emite una senal, los slots conectados a ella suelen ser ejecutados inmedi-atamente, como cualquier llamada a una funcion, haciendo al mecanismo signal-slot to-talmente independiente de cualquier evento generado por la GUI. La ejecucion del codigosituado detras de la funcion emit se llevara a cabo una vez que todos los slots hayanterminado su ejecucion. Cuando se ejecutan conexiones a cola, el codigo que sigue a emit

se ejecuta inmediatamente y los slots se ejecutaran posteriormente.Si hay varios slots conectados con la misma signal, estos seran ejecutados uno tras

otro en el mismo orden en que se declaro la conexion tras la emision de la senal.El moc genera automaticamente la implementacion de las senales que el programador

debe unicamente definir, en el fichero de declaracion de la clase (un fichero cabecera .h),usando el tipo void, ya que no pueden devolver ningun valor.

Slots

Un slots es ejecutado cuando la senal a la que esta conectado es emitida. Los slotsson funciones C++ normales y pueden ser ejecutados fuera de la conexion signal-slots,siendo si caracterıstica peculiar el hecho de que pueden ser conectados con senales.

Al ser funciones normales, siguen las reglas basicas de acceso segun su tipo de declaracio(public, protected o private). Como slots, sin embargo, peden ser llamados fuera de esasreglas via conexion con senales. Esto significa que una senal emitida por un ejemplar deuna clase arbitraria puede causar la ejecucion de un private slot en un ejemplar de unaclase no relacionada.

Comparados con otro tipo de tratamiento de eventos, como los callbacks, signalsand slots es logeramente mas lento debido a su mayor flexibilidad, aunque dicha diferenciaen aplicaciones reales es insignificante. En general, emitir una senal conectada a variosslots es unas 10 veces mas lento que evocar los procedimientos directamente. Aunquepueda parecer mucho, este retraso es menor que le conlleva laejecucion de operacionescomo new o delete. Para una mayor ilustracion del tiempo requerido, comentar que conun procesador i586-500 se pueden emitir unos 2.000.000 de senales por segundo, si estanconectadas a un solo slot o unas 1.200.000 si tienen dos receptores.

Conexion

Una senal de un objeto puede conectarse con slots de uno o mas objetos siempre ycuando dichos slots existan y los parametro sean compatibles. la sintaxis completa de lafuncion de asignacion connect es :

2http://qt-project.org/doc/qt-4.8/signalsandslots.html

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 15

Page 16: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Figure 1.6: Conexiones viables segun los argumentos

bool QObject : : connect ( QObject ∗ ,char∗ , QObject ∗ ,char∗ ,Qt : : ConnectionType )

siendo su redaccion usual algo como:

connect ( emisor ∗ , SIGNAL( s i g n a l ( type ) ) , recep ∗ , SLOT( s l o t ( type ) ) ) ;

El ultimo argumento enum Qt::ConnectionType es opcional siendo e valor por de-fecto Qt::AutoConnection. Esta variable enum describe el tipo de conexion a establecer,en particular, determina cuando la senal es enviada al receptor inmediatamente o a travesde una cola. Los posible valores que puede tomar son:

• Qt::AutoConnection (0) : es el valor por defecto. Si la senal es emitida desde unhilo distinto al del receptor, se situa a la cola (Qt::QueuedConnection), si no ocurreası, el slot es invocado inmediatamente (Qt::DirectConnection). Esto hace que eltipo de conexion se determine en el momento en que se emite la senal.

• Qt::DirectConnection (1) : el slot se ejecuta justo despues de emitirse la senal.

• Qt::QueuedConnection (2) : la ejecucion del slot se retrasa hasta el momentoen que el control vuelve al ciclo de eventos del hilo del receptor: el slot se ejecutaen el ciclo del receptor.

• Qt::BlockingQueuedConnection (4) : Igual que el anterior salvo que el hilo enejecucion se bloquea hasta que el slot devuelve el control. Esta conexxion solo debeusarse cuando emisor y receptor estan en distintos hilos de ejcucion, de no hacerseası la aplicacion puede entrar en un ciclo infinito.

• Qt::UniqueConnection (0x80) : Igual que el primero pero la conexion se realizasolo si no repite una conexion pre-existente, es decir, si la misma senal ya estaconectada con el mismo slot.

• Qt::AutoCompatConnection (3) : Es la conexion por defecto cuando se habilitala compatibilidad con Qt 3. Es igual que la primera pero causara algunas alarmasen determinadas situaciones.

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 16

Page 17: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Con conexion a cola, los parametros deben ser de tipos conocidos por moc, puesto queQt debe almacenarlos en un evento oculto. Qt puede ignorar argumentos pero no puedecrearlos de la nada. Esta regla sirve para saber que conexiones son posibles y cuales no,como muestra la figura ??. La conexion signal-slot se rompe cuando cualquiera de losobjetos involucrados es destruido o cuando se realiza dicha desconexion usando la funcion

bool QObject : : d i s connec t ( QObject ∗ ,char∗ , QObject ∗ ,char∗)

1.3.3 QApplication y el bucle de eventos

Las aplicaciones Qt con interfaces graficas interactivas tienen un control de flujo dis-tinto de las aplicaciones de linea de comando: estan guiadas por eventos (event-driven).

Patron de Diseno OBSERVER

Al escribir programas guiados por eventos las GUI necesitan responder al cambio deestado de ciertos objetos. Cunado se produce un cambio de estado en un objeto senecesita una forma de advertir (y quizas enviar informacion) a los objetos son obser-vadores. Los observadors son objetos que estan esperando eventos de cambio de estadoy, cuando se producen, responden adecuadamente. El patron de diseno que permite losmecanismos de transmision de mensajes de este tipo entre objetos se llama PatronObservvador. Por supuesto, hay muchas formas de implementar este patron, perotodas ellas tienen algunas caracterısticas comunes:

• Se permite la separacion concreta entre clases sujeto y clases observador

• Se permite la emision multiple de comunicaciones 1 a n

• El mecanismo utilizado para enviar la informacion del sujeto al observador quedaespecificado en la definicion de clase del sujeto

La clase QEvent encapsula un evento de bajo nivel. Es la clase base para las clases aso-ciadas con eventos especıficos como QActionEvent, QFileOpenEvent, QHoverEvent, QIn-putEvent o QMouseEvent. El sistema grafico crea eventos de este tipo como respuesta aacciones del usuario (QMouseEvent), a intervalos de tiempo determinados (QTimerEvent)o de forma explıcita por una aplicacion. La funcion miembro type() devuelve una variableenum identificando el evento (Close, DragEnter, Enter, MouseMove, Resize, etc).

El bucle de eventos (event-loop) es una estructura de programa que permite priorizar,poner en lista de espera y enviar eventos y mensajes entre objetos. Escribir una aplicacionbasada en eventos implica implementar una estructura pasiva de funciones que respondana eventos como clicks de raton, teclas, senales emitidas, eventos del gestor de ventanaso mensajes de otros prgramas hasta la recepcion del evento que pare su ejecucion. Estebucle de eventos se gestioan en una aplicacion Qt en el programa main mediante elprocedimiento exec() de la clase QApplication, como sucede en la aplicacion ejemplocreada anteriormente:

#inc lude ”mainwindow . h”#inc lude <QApplication>

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 17

Page 18: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

int main ( int argc , char ∗argv [ ] ){QApplication a ( argc , argv ) ;MainWindow w;w. show ( ) ;return a . exec ( ) ;}

La llamada a la funcion QApplication::exec() se ejecuta en la sentencia return al finaldel programa dando lugar al inicio de la parte interactiva de la aplicacion.

1.4 Widgets

Una widget es un objeto grafico de una clase derivada de QWidget que tiene unarepresntacion visual en la pantalla. La estructura original de QWidget, figura ??, muestramulti-herencia: es un QObject, lo que le permite tener padres e hijos junto con senales yslots, y un QPaintDevice, la clase base de todos los objetos mostrados en pantalla.

Figure 1.7: Linaje de QWidget en el arbol de clases de Qt

Al ser elementos graficos, las widgets incorporan relaciones visuales en el parentaje:una widget sin padre es una ventana o una widget hijo esta contenida dentro del padre ycolocada segun indique la disposicio asociada a esta. Aunque QWidget es la mas sencillade las clases de QtGui (consiste en un rectangulo vacıo), es una cas complicada concientos de funciones y capaz de manejar eventos respondiendo a mensajes, pintarse en lapanatalla, borrarse de la misma y respetando siempre el resto de elementos presentes.

Una aplicacion con GUI para computadoras Desktop puede contener muchas (a vecescientos) de widgets creadas segu una relacion padre-hijo determinada y dispuestas deacuerdo a las espcificaciones de ciertos layouts.

1.4.1 Tipos o categorıas de widgets

Las QWidgets se pueden ordenar en tipos o categorıas par facilitar su busqueda. Algu-nas de ellas, las mas complicadas, podrıan pertenecer a mas de una de las cuatro categorıas

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 18

Page 19: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Figure 1.8: Algunos ejemplos de widgtes

basicas: Button widgets (QPushBotton), Input widgets (QSpinBox), Display widgets(QLabel) y Container widgets (QToolBar). Estas widgets basicas son los ladrillos conlos que se construyen widgets mas complicadas con funciones muy determinadas comoQFileDialog (para seleccionar un archivo del sistema) o QErrorMessage (para mostrarmensajes de error).

1.4.2 Layouts: disposicion espacial de las widgets

Hay widgets que se presentan como ventanas individuales (QDialog) pero la mayorıapueden formar parte de una ventana de mayor tamano. Cuando queramos organizarwidgets pequenas dentro de una mayor debemos usarLayouts. Un layout es un objeto(hereda QObject pero no QPaintDevice, luego no es una widget) que pertenece (es hijode) una sola widget y su tarea es controlar de forma dinamica el espacio ocupado y ladistribucion de las wodget hijas de su duena.

Hay varios tipos de layouts que organizan las widgets de distinta forma: QHBoxLayouthorizontalmente, QVBoxLayout verticalmente, QGridLayout en una tabla o QFormLayout

en un impreso. Los layouts pueden usarse recurrentemente (de forma anidada).Las widgets se organizan secuencialmente cuando se anaden al layout usando la

funcion:

void QLayout : : addWidget (QWidget∗)

Cuando se anade una widget a un layout, pasa a ser hija de la widget que posee el layout(porque una widget no puede ser nunca hija de un layout y solo puede tener un hijolayout). Finalmente, los layouts pueden tener hijos layouts: pueden anadirse igual queuna widget usando le funcion:

void QLayout : : addLayout ( QLayout∗)

1.4.3 Tamano de widgets y layouts

Aunque cada widget puede tener un tamano fijo establecido con setGeometry(),posiciones y ta,anos absolutos no suelen usarse por eliminar la flexibilidad del cambio de

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 19

Page 20: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

tamano de la ventana. Sin embargo, puede controlarse el comportamiento por defectocuando haya un redimensionamiento usando sizePolicy() y sizeHint(). La priopiedadsizeHint almacena el tamano recomendado para cada widget (el utilizado en su primerapresentacion en la pantalla) mediante un valor QSize (almacena anchura y altura). Haytambien varias funciones que permiten controlar el tamano de una widget en tiempode ejcucion como setMinimumSize(), setMaximumSize(), setMinimumHeight(), setMax-imumWidth(), setSizeHint(), etc. Ademas, cada widget (y layout) tienen reglas pararegular su redimensionamiento vertical y horizontal expresados usando QSizePolicy.

QBoxLayout tiene funciones especıficas para regular los espacios entre las widgets quemaneja:

• addSpacing(int size) anade un numero fijo de pixels al final del layout

• addStretch(int stretch=0) anade un numero de pixels expandible: empieza con unmınimo y se puede expandir hasta usar todo el espacio disponible.

• addStrut(int size) impone un mınimo al tamano del layout en su direccion perpen-dicular (anchura de un QVBoxLayout o altura de un QHBoxLayout).

Estas caracterısticas se pueden utilizar para regular el comportamiento de la widgetcuando esta se redimensiona.

1.4.4 Widgets complejas

Frente a las widgets simples que componen los elemntos basicos de una GUI, Qt ofrecetambien widgets mas complejas, productos terminados, listos para ser utilizados con unproposito muy determinado. Veamos algunos ejemplos.

• Para la obtencion del nombre de un archivo con el que posteriormente trabajar, Qtofrece un procedimiento asociado con la clase QFileDialog :getOpenFileName() conuna flexibilidad total de uso, sin argumentos o especificando path inicial y filtrospara los ficheros a mostrar:

QString f i c h e r o = QFileDia log : : getOpenFileName ( ) ;QString f i c h e r o = QFileDia log : : getOpenFileName

( this , ”Open F i l e ” , ”/home” , ” Images ( ∗ . png ∗ .xpm ∗ . jpg ) ” ) ;

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 20

Page 21: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

• Para mostrar un dialogo de opcion SI o NO (por ejemplo respondiendo a la pre-gunta Desea abandonar la aplicacion? ), utilizando el procedimiento ligado a la claseQMessageBox, una heredera de QDialog, QMessageBox::question

int r e spue s ta = QMessageBox : : ques t i on ( this ,NULL,”Desea abandonar l a a p l i c a c i o n ?” , QMessageBox : : Yes |QMessageBox : : No ) ;

• Existen tambien dialogos ya creados para elegir un color o un tipo de letra usandolos metodos QColorDialog::getColor y QFontDialog::getFont, por ejemplo dela siguiente forma:

bool ok ;QColor c o l o r = QColorDialog : : getColor ( ) ;QFont font = QFontDialog : : getFont(&ok , QFont( ” He lve t i ca ” , 10 ) , this ) ;

1.5 Odds and Ends

1.5.1 Memoria

A la hora de crear interfaces graficas se nos plantea el problema de la localizacion:heap o stack. Cuando se crea un objeto con el comando new la memoria utilizada estasituada en el heap y debe ser liberada explicitamente con el comando delete, aunquehasta ese momento esta accesible. Las variables locales se almacenan en el stack y son

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 21

Page 22: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

destruidas automaticamente al abandonar el entorno (normalmente una funcion) en elque se crearon.

Recordando entonces la relacion de los objetos con sus progenitores, solo el padredebe ser almacenado en la pila o stack:

int main ( int argc , char ∗∗ argv ) mainWindow : : mainWindow ( . . . ){ {QApplication a ( argc , argv ) ; QLabel ∗ lb = new QLabel ( this ) ;mainWindow w; new . . . . . .w. show ( ) ;return a . exec ( ) ;} }

To get automatic memory management, only the parent needs to be allocated on thestack.

1.5.2 Constructores

Existen algunas reglas de etiqueta a seguir en la codificacion de constructores. Veamosalgunas de ellas:

• Casi todos los QObjects pueden tener un progenitor con valor por defecto nulo 0

QObject ( QObject ∗parent =0);

• Los progenitores de QWidgets son otras QWidgets

• En Qt las clases tienden a proporcionar muchos constructores, incluyendo uno conel progenitor como unico argumento.

QPushButton (QWidget ∗parent =0);QPushButton ( const QString &text , QWidget ∗parent =0);QPushButton ( const QIcon &icon , const QString &text , QWidget ∗parent =0);

• El progenitor es, normalmente, el primer argumento con un valor por defecto

QLabel ( const QString &texto , QWidget ∗parent =0, Qt : : WindowFlags f =0);

Segun esto, al crear un QObject (una QWidget por ejemplo) conviene permitir queel progenitor tenga valor nulo, tener un constructor que tenga como unico argumento alprogenitor y que cuando tenga mas, que sea este el primero con valor por defecto.

1.5.3 Impresion de informacion en tiempo de ejecucion

Para obtener informacion de algunos parametros en tiempo de ejecucion sin entraren modo Debug, podemos usar la clase QDebug. Su utlizacion es muy sencilla, se debeincluir el include en el fichero cpp correspondiente y luego redirigir variables o cadenassegun formato C++

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 22

Page 23: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

class MiClase : public QObject{Q OBJECT \\ MacroQ CLASSINFO( ” autor ” , ” Luis M. Fuentes ” ) \\ Informacion GeneralQ PROPERTY ( Dato dato READ dato WRITE setDato )public :

MiClase ( const Dato &dat , QObject ∗parent =0) ;Dato dato ( ) const ; \\ Getterpublic s l o t s : \\ Palabra Clave de Qtvoid setDato ( const Dato &dat ) ; \\ S e t t e rs i g n a l s : \\ Palabara Clave de Qtvoid datoCambiado ( Dato ) ;private :Dato mDato ;} ;

Figure 1.9: Ejemplo de codigo de una clase basada en QObject

#inc lude <QDebug>. . . . . . . . . . . . .int va lo r = 234 , va lo r1 = 564 ;QString s t = QString ( ” terminada mainWindow” ) ;QDate hoy = QDate (2013 ,2 ,21) ;QSize sz (18 ,9 ) ;

qDebug ( ) << va lo r << ” metros y ” << va lo r1 << ” cent imet ros ” ;qDebug ( ) << s t << hoy << hoy . toJul ianDay ( ) << sz ;

Es capaz de mostrar variables definidas por Qt como el dıa con QDate, un tamano conQSize, ası en el ejemplo mostrado se obtendrıa una salida como:

234 metros y 564 centimetros

"terminada mainWindow" QDate("Thu Feb 21 2013") 2456345 QSize(18, 9)

1.6 Ejercicios y preguntas

1. Que es Qt?

2. Que lineas de codigo necesitas para una aplicacion minima de Qt?

3. Que es un fichero .pro?

4. Que es qmake y cuando es una buena idea su uso?

5. Que es un modulo Qt y como lo habilitas en tu proyecto?

6. Conexion entre widgets. Relacionar dos widgets ( QSpinBox y QSlider o QSpinBoxy QDial) de forma que el cambio en una se refleje inmediatamente en la otra.

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 23

Page 24: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Figure 1.10: Ejemplo de una aplicacion Qt para el tratamiento de sequencias de video

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 24

Page 25: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Chapter 2

OpenCV

2.1 Introduccion a OpenCV

2.1.1 Presentacion

OpenCV (Open Source Computer Vision) es una librerıa abierta que contiene masde 500 algoritmos oprimizados para el analisis de imagenes y videos y disponible enhttp://SourceForge.net/projects/opencvlibrary. Esta librerıa esta escrita en C yC++, existiendo versiones para Windows, Linux y Mac OS X, con desarrollo activo paraotros lenguajes como Python, Ruby, Matlab etc.

Desde su creacion en 1999 ha sido adoptada como la herramienta de referencia porla comunidad de investigadores en Computer Vision1. Desarrollado originalemente comoun proyecto de Intel R© liderado por Gary Bradski como una iniciativa para lanzar lainvestigacion el algoritmos de vison artificial. Despues de una serie de lanzamientos beta,la version 1.0.0 se lanzo en octubre de 2006. A ella le siguieron la 2.0.0 en octubre de2009 y la 2.1.0 en abril del 2010. A partir de entonces los lanzamientos se sucedieron aun ritmo mayor hasta llegar a la version actual 2.4.3 lanzada en noviembre del 2012.

OpenCV fue disenada pensando en su eficiencia computacional y con vistas a apli-caciones a tiempo real (desarrollado en un principio en paralelo con la librerıa Intel’sIntegrated Performance Primitives -IPP- y que OpenCV utiliza de forma automatica siestan disponibles). Desarrollada inicialmente en C y con posibilidad de utilizar proce-sadores multinucleo, la version 2.0 introdujo un cambio sustancial al incorporar el uso deC++. Las funciones disponibles abarcan multitud de areas dentor de Computer Visioncomo inspeccion de productos, tratamiento de imagenes medicas, calibracion de camaras,vision estereo, robotica e inteligencia artificial (Machine Learning Library).

1En estas notas se usara el termino ingles Computer Vision en vez de su traduccion al espanolVision por ordenador o vision artificial

Page 26: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

2.1.2 Instalacion

Se pueden descargar los ficheros de instalacion del link principal del proyecto enSpurceForge o de la nueva web OpenCV.org :

• http://SourceForge.net/projects/opencvlibrary

• http://opencv.org/downloads.html

• http://opencv.willowgarage.com/

que ofrece versiones para Windows, Linux/Mac, Android e iOS, con links a las paginascorrespondientes en SourceForge. En el primer caso el archivo descargado es un ejecutable(.exe) y en el segundo un archivo comprimido (.tar.bz2). Para obtener informacionsobre OpenCV, como su instalacion, se puede consultar tambien la tercera opcion.

Windows

La instalacion es extremadamente sencilla, simplemente se ejecuta el programa deinstalacion que instalara los ficheros necesarios, registraa los filtros DirectShow y crearalas variables de entorno necesarias para que el compilador encuentre los archivos.

Linux

Debido a que los sistemas linux son muy variados y las versiones del compilador gccy las librerias basicas como glibc varıan con la distribucion, bajo linux deben compilarsetodas las librerıas de OpenCV. Como regla general se necesitara la instalcion previa delas siguientes librerıas y cabeceras: pkconfig, libpng, zlib, libjpeg, libtiff and libjasper.Tambie se necesitara Python 2.6 en version development ası como las librerıas asociadasa ffmpeg : libavcodec, libavformat and libavutil. Para compilar e instalar OpenCV, seejecutara desde un terminal en el directorio principal creado al descomprimir el archivo:

$> . / c o n f i g u r e$> make$> sudo make i n s t a l l$> sudo l d c o n f i g

La librerıas se instalaran, por defecto, en /usr/local/lib/ y los ficheros cabecera en /us-r/local/include/opencv/. Para que los compiladores o IDEs encuentren dichas librerıas,se puede especificar dicho directorio en el fichero de configuracion o anadirlo en el archivo/etc/ld.so.con y ejecutar ldconfig despues. Tambien existe la posibilidad de anadirlo alla variable de entorno LD LIBRARY PATH.

2.1.3 Linux o Mac

Tambien es posible construir OpenCV usando el compilador del sistema, gcc 4.3o superior en linux y XCode 3.2 o superior en Mac OSX, y el programa CMake(http://www.cmake.org) en version 2.6 o superior. El sistema debe tener instalado elsiguiente software opcional en version de desarrollo (librerıas y ficheros de cabecera):

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 26

Page 27: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

1. Python en versiones 2.6.x o 2.7.x tambien en version de desarrollo

2. Intel TBB version 2.2 o superior, para permitir codificacion en paralelo de algunosalgoritmos (opcion WITH TBB=ON en CMake).

3. Qt version 4.6 o superior, con lo que las ventanas HighGUI utilizaran esas librerıasgraficas (opcion WITH QT=ON en CMake).

4. CUDA la version del toolkit mas reciente, para aprovechar la GPU (solo paraNVidia GPUs).

A continuacion ejecutamos el programa CMake con interfaz grafica. Tras elegir eldirectorio donde esta descomprimida la version de OpenCV a construir y el directoriodonde se generaran los binarios, se presiona la opcion Configure y se enmendan los erroresque surjan o se completa la informacion requerida (valores en rojo). Se presiona Configureotra vez y, cuando no se reclame correcciones u opciones se prsiona Generate, que generaralos archivos necesarios (Makefile) para que la orden make compile OpenCV para el sistemaoperativo instalado.

Figure 2.1: Pantalla de Cmake tras ejecutar Configure

Si la compilacion se llevo a cabo sin errores, ya hay una librerıa OpenCV instaladay lista para su uso en el directorio especificado en CMake. Comprobar que las variablesde entorno estan definidas para que los compiladores puedan acceder a los ficheros decabecera y librerıas (en Windows → Control Panel → System Utility → Advanced Tab→ Environment variables).

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 27

Page 28: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

2.2 Usando OpenCV

Desde la version 2.2 OpenCV se divide en varios modulos (algo similar a lo que ocurrecon Qt). Estos modulos se corresponden con ficheros de librerıas que habra que incluiren el proyecto:

• opencv core, el modulo basico que contiene las funcionalidades centrales, in-cluyendo las estructuras de datos basicas y las funciones aritmeticas.

• opencv imgproc contiene las principales funciones usadas en el tratamiento deimagenes.

• opencv highgui es el modulo que contiene las funciones de lectura y escriturade imagenes y videos, ası como la creacion de interfaces de usuario ofrecida porOpenCV.

• opencv features2d contiene las funcionalidades para Feature Point Detectors yel marco de trabajo de Feature Point Matching.

• opencv calib3d que contiene las funciones para la calibracion de camaras, esti-macion de la geometrıa con dos vistas y las funciones de vision estereo.

• opencv video se utiliza en la estimacion de movimiento, seguimiento y extraccionde objetos.

• opencv objdetect contiene las funciones de detccion de objetos, especialmente decaras y personas.

Existen ademas otros modulos que contienen utilidades como funciones de aprendizajeMachine Learning (opencv ml), algoritmos de geometrıa computacional (opencv flann)y codigo especializado (opencv contrib), obsoleto (opencv legacy) o disenado parasacar provecho de la GPU (opencv gpu).

Cada uno de estos modulos dispone del fichero de cabecera asociado y que tiene queser incluıdo si vamos a hacer uso de las funciones incluıdas en el modulo:

#inc lude <opencv2/ core / core . hpp>#inc lude <opencv2/ imgproc/ imgproc . hpp>#inc lude <opencv2/ h ighgu i / h ighgu i . hpp>

Ademas hay que proporcionar el acceso a la ruta de dichos includes, lo que haremos en elfichero de proyecto de Qt anadiendo tantas como sistemas operativos en los que se puedacompilar el proyecto, por ejemplo, Windows en el ordenador de casa y Linux en el dellaboratorio:

macx : INCLUDEPATH += / opt / l o c a l / in c ludel inux−g++: INCLUDEPATH += / usr / inc ludewin32 : INCLUDEPATH += C:\OpenCV2.2\ i n c lude \

macx : LIBS += −L”/ opt / l o c a l / l i b ” −l opencv co r el inux−g++: LIBS += −l opencv co r e −l opencv h ighgu i −lopencv imgprocwin32 : LIBS += −LC:\OpenCV2.2\ l i b −l opencv core220

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 28

Page 29: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Figure 2.2: Vistazo modular de la bibioteca de funciones OpenCV

2.3 Bibliografıa

Se pueden encontrar textos de OpenCV,

• Learning OpenCV: Computer Vision with the OpenCV Library.

• OpenCV 2 Computer Vision Application Programming Cookbook

• Mastering OpenCV with Practical Computer Vision Projects.

Figure 2.3: Libros de OpenCV

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 29

Page 30: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Chapter 3

Imagenes : Qt + OpenCV

3.1 Introduccion

Todos tenemos una idea de lo que constituye una imagen. El diccionario de la RealAcademia de la Lengua nos da varias definiciones:

• Figura, representacion, semejanza y apariencia de algo.

• Estatua, efigie o pintura de una divinidad o de un personaje sagrado.

• Reproduccion de la figura de un objeto por la combinacion de los rayos de luz queproceden de el.

• Representacion viva y eficaz de una intuicion o vision poetica por medio del lenguaje.

Todas ellas identificadas en el momento de leerlas. Ninguna de estas definiciones es validaen el marco en el que nos encontramos. Necesitamos hablar de la imagen digital. En elcaso partucular de imagen digital monocroma, la definicion es sencilla: una imagen digitales una representacion bidimensional de una imagen a partir de una matriz numerica, esdecir, es una funcion discreta I de N2 en N restringida a unos intervalos determinados:

I : [0, w]× [0, h] −→ [0, 2n − 1]

(x, y) −→ I(x, y)

donde w es la anchura y h la altura de la imagen y n es la profundidad de bits (normal-mente n = 8). Cada punto del conjunto P = [0, w]× [0, h] se denomina Pixel mientras queel valor I(x, y) esta relacionado con la irradiancia de la zona representada por el punto(x, y) en el mundo real.

La generalizacion a imagen digital en color es inmediata: en lugar de asignar a cadapixel de la imagen un valor numerico correspondiente a su intensidad luminosa, le asoci-amos un conjunto de numeros que nos permita reproducir su color y alguna caracterısticaadicional. En general se utilizan tres valores numericos que determinan su color RGB,pudiendo anadir uno extra para informacion adicional (como el grado de transparencia oel valor γ en un monitor), RGBA. En general para una imagen en color de tres canales,hay tres valores numericos (u1,u2,u3), normalmente de 8 bits, asociados con cada pixel

Page 31: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

p0(x, y) de la imagen. Estos valores caracterizan el color del pixel en el espacio de colorelegido[?].

Desde el punto de vista de la imagen digital, existen dos grupos de espacio de color,aquellos que separan la informacion de luminancia o intensidad luminosa de la informacionde color (Y UV, Y CBCR, Lab, ...) y los basados en las curvas de sensibilidad espectral delos receptores dej ojo humano (RGB,XY Z, ...). La gran mayoria de las imagenes enformato digital se almacenan en el sistema RGB, pero el tratamiento o la codificacionpueden mejorarse usando otros sistemas con separacion de color como el Lab o el Y uvrespectivamente.

3.2 Imagenes en Qt

Las librerıas de Qt proporcionan tres clases para trabajar con imagenes: QImage,

QPixmap and QPicture. La primera de ellas, QImage esta disenada para permitir elacceso directo a los pıxeles, su manipulacion y sencillas operaciones de lectura/escritura(I/O). QPixmap esta disenada y optimizada para su representacion en pantalla mientrasque QPicture es un lienzo (paint device) que permite grabar y reproducir comandosQPainter (de escritura de palabras, dibujar cırculos, rectangulos, lıneas, etc.). Parececlaro que para el tratamiendo digital de imagenes nos interesa trabajas con QImage1.Antes de desarrolar las caracetrısticas especıficas de QImage, debemos mencionar quehereda QPaintDevice y, por lo tanto, se puede utilizar directamente como lienzo encualquier comando de QPainter.

3.2.1 Formatos

QImage esta disenada para almacenar imagenes y puede hacerlo usando diferentes for-matos, descritos por una variable enum denominada Format. A continuacion se enumeranalgunas de los posibles formatos para el almacenamiento de la imagen:

• QImage::Format Invalid (0) : La imagen no es valida.

• QImage::Format Mono (1) : se usa un bit por pixel (blanco o negro), almace-nando primero el bit mas significativo (MSB).

• QImage::Format Indexed8 (3) : ındice de 8 bits a un mapa de color.

• QImage::Format RGB32 (4) : formato RGB con 32 bits (0xffRRGGBB).

• QImage::Format ARGB32 (5) : formato ARGB usando 32 bits (0xAARRGGBB).

• QImage::Format RGB16 (7) : formato RGB de 16 bits (5-6-5).

• QImage::Format RGB888 (13) : formato RGB de 24 bits (8-8-8).

Ademas de almacenar la imagen, la clase QImage proporciona una coleccion demetodos para la obtencion de una gran variedad de informacion sobre la imagen, para sumanipuacion o su transformacion.

1http://qt-project.org/doc/qt-5.0/qtgui/qimage.html

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 31

Page 32: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Extension Descripcion Soporte Qt

BMP Windows Bitmap Read/write

GIF Graphic Interchange Format (optional) Read

JPG Joint Photographic Experts Group Read/write

JPEG Joint Photographic Experts Group Read/write

PNG Portable Network Graphics Read/write

PBM Portable Bitmap Read

PGM Portable Graymap Read

PPM Portable Pixmap Read/write

TIFF Tagged Image File Format Read/write

XBM X11 Bitmap Read/write

XPM X11 Pixmap Read/write

Table 3.1: Formatos manejados por QImage

3.2.2 Lectura/Escritura

La clase QImage proporciona varios metodos para cargar una imagen con los datosque la representan. Se pueden extraer de un archivo en disco, bien al crear el objet0:

QImage ( const char ∗ const [ ] xpm )QImage ( const QString & fileName , const char ∗ format = 0 )

leyendo una imagen XPM en el primer caso o un archivo imagen con extensiones varias,tabla ??, o posteriormente leyendo de un archivo con el metodo load:

bool QImage : : load ( QString & fileName , char ∗ format = 0 )

que intentara leer una imagen del archivo filename con el formato format, de no proveerdicho formato, el metodo lee la cabecera del fichero para conocer el formato. Finalmente,tambien es posible crear una QImagen con una conjunto de datos si se especifica el formatopara poder interpretarlos:

QImage ( uchar ∗data , int width , int height , Format fm )QImage ( uchar ∗data , int width , int height , Format fm )QImage ( uchar ∗data , int wid , int hei , int bytesLine , Format fm )QImage ( uchar ∗data , int wid , int hei , int bytesLine , Format fm )

Para grabar la imagen almacenada por QImage se usa el metodo save(), con posibilidadde especificar el formato (“PNG”) siendo el factor de calidad un valor entero comprendidoentre 0 (pequena y muy comprimida) y 100 (grandes y sin comprimir) siendo −1 el valor pordefecto.

bool save ( QString &fileName , char ∗ format =0, int q u a l i t y=−1 )

Es, por lo tanto, muy sencillo leer y escribir imagenes desde QImage. Existe un anadido oplug-in que proporciona soporte para otros tipos de formato (MNG, TGA, TIFF o WBMP).

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 32

Page 33: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

3.2.3 Informacion sobre la imagen

La clase QImage proporciona una coleccion muy completa de funciones que proporcionanuna muy variada informacion sobre la imagen almacenada por ella:

• Geometrıa. Podemos obtener informacion sobre la forma de la imagen con metodos comosize() para obtener el tamano de la imagen en una varoable QSize o los metodos width()y height() para obtener la anchura y la altura separadamente. Tambien hay acceso adatos mas tecnicos como el equivalente a pıxeles por pulgada (ppi) dotsPerMeterX()

o dotsPerMeterY() mientras que rect() devuelve un objeto QRect con el rectanguloocupado por la imagen, o (0, 0, width(), height()).

• Color. El color correspondiente a un pixel de la imagen se obtiene con la funcion pixel()

que devuelve una variable QRgb (una definicion de tipo equivalente a cuatro bytes paraalmacenatr el formato 0xAARRGGBB) independientemente del formato de la imagen osu equivalente para establecer el valor (230,128,45) del pixel en un punto dado P (a, b):

s e t P i x e l ( QPoint ( a , b ) , QRgb(230 ,128 ,45) )

En caso de imagenes monocromas o de color a 8-bits, las funciones colorCount() ycolorTable()+pixelIndex() proveen de la informacion necesaria para interpretar elvalor almacenado. Podemos extraer informacion generica sobre si hay canal alpha presentehasAlphaChannel() o si la imagen es en balnco y negro (niveles de gris en lugar de colores,los tres colores on el mismo valor) isGrayscale() o allGray().

• Low level. La informacion de la imagen a bajo nivel nos servira para interaccionar conotras librerıas, como OpenCV, para inetrcambiar los datos que constituyen la imagenbits() o scanline(). Asi la funcion depth() devuelve el tamano en bits del pixel,con valores posibles 1 para imagenes monocromas o 8, 16, 24 y 32 bits. Funciones comobitPlaneCount(), format(), bytesPerLine() y byteCount() proporcionan informacionadicional. Por ultimo, una funcion curiosa: cacheKey() que devuleve un umero queidentificara el contenido de la imagen de forma unica.

3.2.4 Mostrar una imagen en Qt

La forma mas sencilla de mostrar una imagen en Qt es asociarla con el pixmap de unawidget QLabel. Si tenemos ya una imagen cargada en un objeto QImage llamado img y el labelya esta creado siendo un puntero llamado lab:

lab−>setPixmap ( QPixmap : : fromImage ( img ) ) ;

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 33

Page 34: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Figure 3.1: Programa de lectura de imagenes

Codigo

MainWindow : : MainWindow(QWidget ∗parent ) : QMainWindow( parent ){QWidget ∗cw = new QWidget ( this ) ;imgL = new QLabel ( ) ;imgL−>setPixmap (QPixmap ( 3 8 4 , 2 8 8 ) ) ;QPushButton ∗ l o ad I = new QPushButton ( ”Load Image” ) ;QPushButton ∗ s a l i r = new QPushButton ( ” S a l i r ” ) ;QHBoxLayout ∗ hl = new QHBoxLayout ( ) ;QVBoxLayout ∗ v l = new QVBoxLayout ( ) ;hl−>addWidget ( l oad I ) ; hl−>addWidget ( s a l i r ) ;vl−>addWidget ( imgL ) ; vl−>addLayout ( h l ) ;cw−>setLayout ( v l ) ; setCentra lWidget (cw) ;connect ( s a l i r ,SIGNAL( c l i c k e d ( ) ) , this ,SLOT( c l o s e ( ) ) ) ;connect ( loadI ,SIGNAL( c l i c k e d ( ) ) , this ,SLOT( loadImage ( ) ) ) ;s e tF ix edS i z e ( s i z e H i n t ( ) ) ;}

MainWindow : : ˜ MainWindow (){ }

bool MainWindow : : loadImage ( ){QString fname = QFileDia log : : getOpenFileName( this , ” Abrir Imagen” , ”path/ to / Images” , ” Images ( ∗ . png ∗ . jpg ) ” ) ;imgL−>setPixmap (QPixmap( fname ) ) ;return true ;}

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 34

Page 35: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

3.3 Imagenes en OpenCV

La evolucion de OpenCV ha producido varias formas de almacenamiento de imagenes2:IplImage, CvMat y Mat. La primera y mas antigua se corresponde con la epoca de desarrolloparalelo con las Intel Performance Libraries, la segunda es la version en C y la tercera es la claseC++. Por ser la version mas avanzada y en la que se utilzara en posteriores versiones, usaremosla version C++. Como no especificaremos espacios de trabajo (namespaces) por defecto, la clasedebe ir asociada con su namespace, cv::Mat. Esto lo usaremos con todas las clases y funcionesde OpenCV.

La clase cv::Mat es la estructura de datos utilizada en OpenCV para almacenar imagenes.Como su nombre indica, es la misma estructura que se utiliza con matrices de datos. The classcv::Mat is the data structure used to hold your images (and obviously other matrix data). Pordefecto, crea una matriz de tamano nulo, pero puede especificarse su tamano en el constructor demultiples maneras. Por ejemplo, los creadores siguientes crean una imagen de tamano 240×320)de 1 byte de profundidad (monocroma) y llena con el valor 100:

cv : : Mat imagen (240 ,320 ,CV 8U, cv : : Sca l a r ( 1 0 0 ) ) ;

donde aparece una variable CV 8U, que especifica la profundidad de la imagen (numero de bitspor pixel), si es de variable entera sin signo o con signo (U o S) o real(F) y el numero de canales(imagen en color tres o cuatro canales):

CV <bit depth >(U |F)C<number of channels>

es decir, para crear una imagen en color compatible con el formato Qt deberıamos poner:

cv : : Mat imagen (240 ,320 ,CV 8UC4 , cv : : Sca l a r ( 1 0 0 ) ) ;

OpenCV tambien implementa un mecanismo de borrado cuando se abandona el ambito deaplicacion de un objeto cv::Mat. Ademas, esta clase implementa un mecanismo de referenciasy asigna copias huecas hasta que una de ellas se modifica (cuando una imagen se asigna a otracon un = los datos no se copian sino que ambos objetos comparten la direccion de memoriade los datos). Mantener la cuenta de las referencias a los mismos datos permite que solo aldestruirse la ultima se destruyan los datos (se incluye imagenes devueltas por funciones que seasignan antes de destruirse al acabr la funcion). Para crear una copia real (dos imagenes enmemoria) se debe usar el procedimiento copyTo():

cv : : Mat image2 , image3 ;image2= r e s u l t ; // l a s dos usan l o s mismos datosr e s u l t . copyTo ( image3 ) ; // se crea una copia nueva

El almacenamiento en memoria de la imagen por OpenCV presenta una peculiaridad adi-cional: se almacena por tripletes ordenados BGR en vez de hacerlo segun el orden convencionalRGB (sigue siendo el mismo espacio de color). OpenCV siempre ha usado este orden, que secorresponde con el orden del espctro de luz visible en longitudes de onda, azlu la mas corta yrojo la mas larga.

Finalmente indicar que, por supuesto, OpenCV tambien dispone de funciones para la lecturay escritura de imagenes de disco:

cv : : Mat cv : : imread ( s t r i n g& fname , int f l a g s )bool cv : : imwrite ( s t r i n g& fname , InputArray img , vector<int>& par )

2http://docs.opencv.org

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 35

Page 36: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

3.4 Conversion entre formatos OpenCV y Qt

La conversion de imagenes entre formatos Qt y OpenCV tiene dos puntos delicados, elorden de los canales de color y el canal alpha adicional. Veamos en primer lugar como pasarde una imagen Mat a una QImage. Si la transformacion es unicamente para mostrar la imagensolo requiere de la reordenacion de los canales, para lo que se utiliza la funcion de OpenCVcvtColor:

void cvtColor ( InputArray src , OutputArray dst , int code , int dstCn=0)

una funcion generalista que sirve para cambiar los valores de los pıxeles entre distintos espaciosde color (CV BGR2Lab, CM RGB2YUV, etc.). Posteriormente, solo hay que acceder a losdatos de la imagen con imageD.data y usarlos en la construccion de un objeto QImage juntocon el numero de filas imageD.rows y el de columnas imageD.cols teniendo en cuenta que nohay canal alpha (formato RGB de 24 bits). Finalmente se escribe en el QLabel usado paramostrar imagenes:

cv : : cvtColor ( imageO , imageD ,CV BGR2RGB) ;QImage img = QImage ( ( const unsigned char ∗ ) ( imageD . data ) ,

imageD . co l s , imageD . rows , QImage : : Format RGB888 ) ;imgL−>setPixmap ( QPixmap : : fromImage ( img ) ) ;

O, de un modo alternativo, podemos poner tambien, aprovechando para cambiar el formato aARGB (32 bits) y usando la funcion de QImage para rotar canales:

Codigo

QImage i 1 , i 2 , imgF ;cv : : Mat frm ;const uchar ∗qIB ;\\ Se obt i ene u opera con l a imagen en OpenCV frmqIB = frm . ptr ( ) ;i 1 = QImage ( qIB , frm . co l s , frm . rows , frm . step , QImage : : Format RGB888 ) ;i 2 = i 1 . convertToFormat (QImage : : Format ARGB32 , Qt : : AutoColor ) ;imgF = i 2 . rgbSwapped ( ) ;

La conversion opuesta, es un poco mas complicada. Implica la creacion de un objeto Mat

de cuatro canales para almacenar los datos de la imagen, ası como otros dos objetos Mat,uno con tres canales, para la imagen, y otro de uno para almacenar los datos del canal alpha.Aprovechando el metodo mixChannels, una funcon que permite barajar y separar canales dentrode una imagen, para cambiar el orden de los canales y separar el canal alpha.

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 36

Page 37: Notas de Clase - UVa · integra un sistema de ayuda presionando F1 sobre la palabra clave o clase elegida, o activando el modo de ayuda con busqueda por temas, etc. En de nitiva,

DRAFT

Codigo

cv : : Mat matF ;QImage imgO ;uchar ∗ptr ;int a l t o , ancho , bpl ;\\ Se obt i ene u opera con l a imagen en Qt imgOa l t o = imgO . he ight ( ) ; ancho = imgO . width ( ) ;ptr = ( uchar ∗) b i t s ( ) ; bpl = bytesPerLine ( ) ;cv : : Mat mat = cv : : Mat ( a l to , ancho , CV 8UC4 , ptr , bpl ) ;cv : : Mat rgbI = cv : : Mat (mat . rows , mat . co l s , CV 8UC3 ) ;cv : : Mat alph = cv : : Mat (mat . rows , mat . co l s , CV 8UC1 ) ;cv : : Mat ocvI [ ] = { rgbI , alph } ;int fromTo [ ] = { 0 , 2 , 1 , 1 , 2 , 0 , 3 , 3 } ;cv : : mixChannels ( &mat , 1 , ocvI , 2 , fromTo , 4 ) ;matI = rgbI ;

Luis M. Fuentes Tratamiento de Imagen y Sonido, UVa 37