Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de...

35
1 Universidad Tecnológica Nacional Facultad Regional Buenos Aires Técnicas Digitales III Trabajo Práctico N o 3 Aplicaciones de procesamiento digital de señales e Imágenes sobre Linux Ciclo Lectivo 2012

Transcript of Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de...

Page 1: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

1

Universidad Tecnológica Nacional

Facultad Regional Buenos Aires

Técnicas Digitales IIITrabajo Práctico No 3

Aplicaciones de procesamiento digital de señalese Imágenes sobre Linux

Ciclo Lectivo 2012

Page 2: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

2

Page 3: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

Índice general

1. General 11.1. Alcance y Condiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1. Acerca de la Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2. Acerca de los entregables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.3. Acerca de la documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.4. Acerca de los Autores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2. Enunciado 52.1. Sistema de procesamiento y distribución de video en tiempo real . . . . . . . . . . . . . . . . . . . . 52.2. Proceso principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3. Procesamiento en tiempo real de las imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3.1. Rotar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.2. Smalltiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.3. Blit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.4. Monocromatizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.5. Sepia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.6. Edge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.7. Scale 2x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3.8. Blur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3.9. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3.10. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3.11. Código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3.12. Consideraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

A. Doxygen 13A.1. ¿Que es doxygen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

A.1.1. ¿Quienes usan Doxygen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13A.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13A.3. Comenzando... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14A.4. Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

A.4.1. Doxyfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15A.5. Generando la documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15A.6. Preparando el código para su documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

A.6.1. Documentando variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3

Page 4: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

4 ÍNDICE GENERAL

A. Opencv 19

A.1. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

A.1.1. Componentes y Nomenclaturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

A.2. Primer Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

A.2.1. Invocar funciones básicas y compilar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

A.2.2. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

A.2.3. IplImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

A.2.4. Opencv gira alrrededor deIplImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

A.3. Aplicaciones y más funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

A.3.1. Crear una imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

A.3.2. Operaciones Básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

A.3.3. Manejando pixeles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

A.4. Segundo Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

A.4.1. Manejando video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

A.4.2. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Page 5: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

Capítulo 1

General

1.1. Alcance y Condiciones

1.1.1. Acerca de la Aplicación

El presente trabajo práctico tiene como objetivo desarrollar una aplicación para un sistema de cómputo de propó-sito general, que trabaje en modo cliente servidor. El cliente debe ser apto para acceder a la aplicación servidor, desdecualquier plataforma de cómputo de escritorio o portátil (embedded).El código se debe escribir en lenguaje C, con los comentarios suficientes y en el formato necesario para emplear algu-

na herramienta de documentación automática que genere documentación clara y consistente acerca de las diferentesfunciones y módulos que componen el software. El código específico de tratamiento de la(s) señal(es) y/o imagen(es),debe ser escrito además en assembler utilizando instrucciones SIMD, de modo de comparar el rendimiento de éstasinstrucciones respecto del mismo código escrito en C compilado con opciones de optimización de código.El servidor debe trabajar con procesamiento paralelo, es decir debe ser una aplicación multiprocess o multithreaded,

sincronizando las instancias child (en multiprocess) o los threads (en multithreaded) mediante mecanismos de inter-comunicación vistos en case.El cliente debe acceder a los servicios de la aplicación servidor, mediante una conexión de red utilizando el protocoloadecuado a la aplicación (conectado o no según se requiera).Las aplicaciones componentes de la solución, deben manejar todas las condiciones de error, presentando los mensajes

adecuados al usuario y terminando la aplicación de forma ordenada y limpia.

1.1.2. Acerca de los entregables

El producto a entregar debe constar de los siguientes ítems (obligatoriamente)

Programas fuente, .c y .asm.

Doxyfile (o equivalente para generar la documentación de desarrollo)

Makefile. Este script debe contener como regla principal la compilación y linkeo completo del proyeto, y ademásdebe contener las reglas clean, encargada de limpiar por completo los objetos y ejecutables, y documentar lacual debe ejecutar la script de generación de la documentación.

1

Page 6: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

2 CAPÍTULO 1. GENERAL

Informe en formato pdf con una breve explicación del uso del sistema y una sección en donde se muestren losresultados de la comparación de performance entre las rutinas escritas en C y las correspondientes en Assemblerutilizando instrucciones SIMD

Los ítems componentes del proyecto deben entregarse en el SVN, en la carpeta correspondiente.

1.1.3. Acerca de la documentaciónNo se considerará aprobado un Trabajo presentado sin una documentación adecuada. La documentación es tan

importante como los fuentes en sí. En los programas fuentes debe existir una mínima descripción de los diferentesmódulos, y dentro de cada uno, de las diferentes funciones que componen cada uno.Como ejemplo, considerando el uso de Doxygen para lo cual se dispone de un tutorial en el Apéndice A, se ilustra amodo de ejemplo el encabezado mínimo que debe contar cada uno de los archivos fuente que componen el proyecto.

1 /∗ ∗2 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗3 \ f i l e tp12 −4. c4 \ d e t a i l s5 ∗ " Depar t amen to de E l e c t r ón ica , FRBA, UTN"6 ∗ E j e r c i c i o 4 d e l TP 1 2 .7 ∗ O b j e t i v o mane ja r señ a l e s , c r e a r y c o n t r o l a r p r o c e s o s , j ugando con l a s s y s c a l l8 ∗ POSIX9 \ a u t h o r A l e j a n d r o F u r f a r o , Marce lo Doal lo , Darío Alpern , Juan Montenegro , Gustavo

Nudelman10 \ d a t e 2 0 1 1 . 0 5 . 0 811 \ v e r s i o n 1 . 0 . 012 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗13 ∗ /

Listing 1.1: Comentario Doxygen: Modelo de encabezado de un archivo fuente

Por otra parte, cada función debe tener del mismo modo un encabezado que la describa. A modo de ejemplo seprovee el siguiente código con los mínimos datos requeridos.

1 /∗ ∗2 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗3 \ f n vo id s e t _ a u i o _ p a r a m s ( i n t fd )4 \ b r i e f Func ión que s e t e a p a r á me t ro s de l a p l a c a de a u d i o5 \ d e t a i l s Se e n c a r g a de e s t a b l e c e r l o s v a l o r e s de v e l o c i d a d de m u e s t r e o ( Sampl ing Rate )

Sample S i z e ( tamaño de l a m u e s t r a ) , y número de c a n a l e s , en l a p l a c a de a u d i o d e ls i s t e m a .

6 U t i l z a l a s y s c a l l i o c t l ( ) , ( i n p u t o u t p u t c o n t r o l ) , p a r a a c c e d e r a l d i s p o s i t i v om e d i a n t e e l f o r m a t o e s t a b l e c i d o por l a i n t e r f a z de s o n i d o de LINUX , y e l f o r m a t ogené r i c o de i o c t l ( f i l e _ d e s c r i p t o r , nombre d e l p a r ámetro , p u n t e r o a l v a l o r ae s c r i b i r ) ;

7 \ param fd F i l e d e s c r i p t o r o b t e n i d o de l a p l a c a de a u d i o8 \ r e t u r n vo id9 \ a u t h o r C r i s t i a n N i g r i

10 ∗ /11

12 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗13 ∗ /

Page 7: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

1.1. ALCANCE Y CONDICIONES 3

Listing 1.2: Comentario Doxygen: Modelo de encabezado de una función

Finalmente, se requiere documentar adecuadamente las estructuras, uniones, campos de bits y demás variablescomplejas definidas en el programa, describiendo cada uno de los miembros que la componen, como se muestra enlos siguientes ejemplos.

1 /∗ ∗2 ∗ \ s t r u c t f l o a t _ b i t s3 ∗ \ b r i e f E s t r u c t u r a de campo de b i t s de un f l o a t4 ∗ \ d e t a i l s C o n t i e n e l o s t r e s campos de un f l o a t : m a n t i s a o p a r t e f r a c c i o n a l ,

e x p o n e n t e ( r e c o r d a r que es en complemento a 2 ) , y b i t de s i g n o (1 s i e l número esn e g a t i v o y 0 s i e s p o s i t i v o ) . \ n

5 ∗ \ a u t h o r Oscar P a n i a g u a6 ∗ \ d a t e 2 1 . 0 8 . 2 0 1 27 ∗ /8 t y p e d e f s t r u c t f9 {

10 u n s i g n e d i n t m a n t i s a : MANTISA_SP ;11 u n s i g n e d i n t e x p o n e n t e : EXPONENTE_SP ;12 u n s i g n e d i n t s i g n o : SIGNO ;13 } f l o a t _ b i t s ;

Listing 1.3: Comentario Doxygen: Modelo de documentación de una estructura

1 /∗ ∗2 ∗ \ un ion s i n g l e _ p r e c i s i o n3 ∗ \ b r i e f Unión de un f l o a t y l a E s t r u c t u r a de campo de b i t s de un f l o a t4 ∗ \ d e t a i l s C o n t i e n e un f l o a t y una e s t r u c t u r a de campo de b i t s de un f l o a t , de modo

de poder a c c e d e r a un número en forma c o m p l e t a o pode r r e p r e s e n t a r s u s campos demanera i n d i v i d u a l ( m a n t i s a o p a r t e f r a c c i o n a l , e x p o n e n t e y s i g n o ) . \ n

5 ∗ \ a u t h o r Mariano Gonza lez6 ∗ \ d a t e 2 1 . 0 8 . 2 0 1 27 ∗ /8 t y p e d e f un ion _ s i n g l e9 {

10 f l o a t numero ;11 f l o a t _ b i t s b i t s ;12 } s i n g l e _ p r e c i s i o n ;

Listing 1.4: Comentario Doxygen: Modelo de documentación de una estructura

1.1.4. Acerca de los AutoresEl Trabajo puede ser elaborado en forma individual o en grupos de hasta 3 miembros máximo (sin excepción).

La autoría de cada módulo debe figurar en el archivo fuente correspondiente, en el comentario correspondiente en elencabezado de cada función, utilizando (en el caso de Doxygen la macro \author.En el momento de la firma de los trabajos prácticos, cada autor mantendrá un breve coloquio con el ayudante deTrabajos Prácticos del curso para demostrar su autoría.

Page 8: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

4 CAPÍTULO 1. GENERAL

Page 9: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

Capítulo 2

Enunciado

2.1. Sistema de procesamiento y distribución de video en tiempo realEl sistema a desarrollar debe adquirir video de resolución estándar desde una cámara conectada por USB al equipo

servidor para su procesamiento y transmisión en vivo, y de imágenes almacenadas en archivos avi o flv en una carpetaespecífica del file system del sistema operativo que opera el equipo, en nuestro caso Linux.El sistema tiene un módulo servidor que opera en el equipo de adquisición y almacenamiento de los videos, y uncliente a instalar en cualquier dispositivo remoto también operado bajo Linux.El servidor se compone del proceso principal, los procesos de adquisición, y los hilos de procesamiento y distribución.

2.2. Proceso principalEl proceso principal consiste de un servidor concurrente. Ni bien inicia su ejecución inicializa el sistema y crea

el primer nivel de procesos mediante llamadas a fork () y execlp (). En este nivel de procesos hijos del principal, sedeben desarrollar las diferentes funciones principales de adquisición a razón de una por proceso, de acuerdo con elsiguiente detalle: El manejo de procesos es el siguiente.

1. Lectura de una cámara de video conectada a port usb del sistema. Este servicio se denomina video en vivo.El proceso asociado a este servicio obtiene imágenes de la cámara y arma un buffer de video(∗) dimensiona-do para almacenar un frame completo, para su posterior distribución. El código del proceso está en el archivo/usr/bin/videostreamer/cameracapture. El proceso ejecuta de manera indefinida y se lo visuali-zará mediante el comando ps con el mismo nombre del archivo binario que contiene su código.

2. Lectura de un archivo de video, almacenado en /usr/share/videostreamer/. Este servicio se denomina video recor-ded. El proceso asociado a este servicio obtiene imágenes del archivo especificado, y al igual que el proceso an-terior almacena para su posterior distribución en un buffer de video(∗) dimensionado exactamente para el tamañodel frame leído. El código del proceso está almacenado en el archivo /usr/bin/videostreamer/vstreamer.El proceso ejecuta de manera indefinida y se lo visualizará mediante el comando ps con el mismo nombre delarchivo binario que contiene su código.

Nota ∗: La distribución del contenido del buffer no corre por cuenta de este proceso.

5

Page 10: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

6 CAPÍTULO 2. ENUNCIADO

Luego de creados estos dos procesos, el proceso padre queda escuchando pedidos de conexión por el puerto TCP23444. Cada vez que reciba una conexión por dicho puerto, creará un POSIX thread que vivirá hasta resolver el pedidoy terminará ya sea de manera inmediata o luego de un lapso requerido para sincronizar su finalización de acuerdo conel criterio de diseño adoptado.Cada thread formará parte del subsistema de Procesamiento de imágenes en tiempo real.

2.3. Procesamiento en tiempo real de las imágenes

Trabaja con el contenido de los buffers de video adquiridos desde las dos fuentes anteriores. Se compone de unpool de 18 funciones, 9 escritas en assembler utilizando los recursos SIMD del procesador y 9 escritas en C. Cada parde funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento de imágenes a aplicar a cadaframe de video antes de su transmisión. Dependerá del pedido del cliente el filtrado a utilizar.Cada thread creado por el proceso principal utilizará el port 23444, para consultar al cliente que requirió conexión,cual es el filtro que desea aplicar, y que servicio desea acceder (Video en vivo o video recorded). Esta consulta laresuelve simplemente leyendo el socket TCP duplicado provisto por la función accept () en el server. Una vez resueltoel filtro a utilizar y el tipo de servicio, el thread accede a los buffers utilizados por los procesos de adquisición yutilizando los valores de tamaño de frame de cada uno informa los mismos al cliente.Una vez resuelto este handshake inicial comienza a transmitir a razón de un buffer completo al nodo remoto, esperan-do mediante un mutex, o mecanismo de intercomunicación que considere mas apropiado, para volver a leer el bufferuna vez que este esté lleno con nueva información de modo de evitar una retransmisión de video.La transmisión de video se efectuará por medio de un socket UDP, empleándose los ports 23445 para video en vivo, y23446 para video recorded.El servicio de streaming de video en cualquiera de sus dos alternativas deberá efectuarse hasta que el cliente lo indi-que. Para tal fin, el cliente enviará por el port TCP original, un paquete que contenga el mensaje “Keep Alive“ cada30 segundos, para indicar al server que aun sigue leyendo el video transmitido. Transcurridos 60 segundos sin recibirel keep alive desde el cliente, el thread termina su ejecución.Los filtros están en funciones que componen el proyecto definidas de acuerdo a su funcionalidad y al lenguaje en elque están escritas de la siguiente manera:

2.3.1. Rotar

Consiste en rotar los canales de color entre si, de la siguiente manera:

R −→ GG −→ BB −→ R

2.3.2. Smalltiles

Esta operación consiste en repetir la imagen original 4 veces, de forma más chica en la imagen destino. Es decir,que si se tiene en destino una imagen de tamaño w x h, en el destino se tendrán 4 imágenes de tamaño w/2 x h/2, unaen cada cuadrante.Para copiar los píxeles, a cada (i, j) de la primera imagen destino, le corresponde el valor de la posición (2i, 2j) en laimagen fuente.Nota: En el caso que la entrada sea una imagen impar se debe duplicar la linea que sobra en su extremo derecho einferior según corresponda.

Page 11: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

2.3. PROCESAMIENTO EN TIEMPO REAL DE LAS IMÁGENES 7

2.3.3. Blit

Esta operación recibe mas parámetros que las demás; además de tener las imágenes fuente y destino (de tamañow x h), se recibe una imagen adicional blit también con su respectivo tamaño (bw x bh), que se utilizará a modo demáscara. Se cumple que bw ≤ w ∧ bh ≤ h.La aplicación de este filtro consiste en generar una nueva imagen combinando la original con el blit. Un color de laimagen blit es considerado como transparente, para que en la combinación algunos píxeles del blit queden por encimade la imagen original y otros no se vean. Para este trabajo práctico, la imagen blit será una imagen del logo de nuestraUniversidad (nuestra querida “araña”). Decimos que una imagen ha sido “aragnizada” cuando en su extremo inferiorderecho podemos ver la “araña” de nuestra UTN. Para cada píxel p en la imagen de UTN.BA (blit):

dst(p) =

{src(p) si blit(p) es de color blanco, es decir sus colores son (255, 255, 255)

blit(p) si no

Es decir que si el píxel en la imagen de UTN.BA es blanco, entonces el nuevo píxel tendrá los colores del píxelcorrespondiente en la imagen original; y si no los colores del píxel en la imagen de UTN.BA.Las columnas y filas que no se puedan procesar de esta manera, es decir, las primeras h − bh filas; y de las filasrestantes, las primeras w − bw columnas; quedarán igual que como estaban originalmente.Nota: como debe valer la restricción bw ≤ w ∧ bh ≤ h, esta operación no podrá ser aplicada a imágenes cuyo tamañosea menor a 89 píxeles de ancho x 128 de alto.

2.3.4. Monocromatizar

Para convertir una imagen a escala de grises debemos contar con una función que sea capaz de monocromatizaruna imagen a color. La función mas sencilla para hacer esto es:

f(p) = αR+ βG+ γB

La función f se aplica a cada píxel p de la imagen; R, G, B son sus componentes de color y α, β y γ son loscoeficientes 0.07, 0.71 y 0.21 respectivamente. El resultado f(p) debe replicarse en las 3 componentes del píxel paralograr el efecto:

R −→ f(p)G −→ f(p)B −→ f(p)

2.3.5. Sepia

Esta operación consiste en cambiar la información de color de cada píxel de la siguiente manera:

R −→ tmp * 0.5G −→ tmp * 0.3B −→ tmp * 0.2

donde tmp = R+G+B.

2.3.6. Edge

Puede definirse como un borde a los píxeles donde la intensidad de la imagen cambia de forma abrupta. Si seconsidera una función de intensidad de la imagen, entonces lo que se busca son saltos en dicha función. La idea básica

Page 12: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

8 CAPÍTULO 2. ENUNCIADO

detrás de cualquier detector de bordes es el cálculo de un operador local de derivación.Vamos a usar en este caso el operador de Laplace, cuya matriz es

M =

0,5 1 0,51 −6 10,5 1 0,5

Para obtener los bordes, se posiciona el centro de la matriz de Laplace en cada posición (x, y) y se realiza la siguienteoperación

dst(x, y) =

2∑k=0

2∑l=0

src(x+ k − 1, y + l − 1) ∗M(k, l)

Es decir dst(x, y) =

src(x− 1, y − 1) ∗M00 + src(x− 1, y) ∗M01 + src(x− 1, y + 1) ∗M02 +src(x, y − 1) ∗M10 + src(x, y1) ∗M11 + src(x, y + 1) ∗M12 +

src(x+ 1, y − 1) ∗M20 + src(x+ 1, y) ∗M21 + src(x+ 1, y + 1) ∗M22

Este filtro opera sobre imágenes en escala de grises (1 componente de color por píxel)

2.3.7. Scale 2xEl escalado de una imagen consiste en expandir un píxel combinando sus datos con los datos de sus vecinos.

La combinación respeta las siguientes reglas:

Si B 6= H y D 6= F

• Si D = B ⇒ E0 = D, si no E0 = E

• Si B = F ⇒ E1 = F , si no E1 = E

• Si D = H ⇒ E2 = D, si no E2 = E

• Si H = F ⇒ E3 = F , si no E3 = E

si no

• E0 = E1 = E2 = E3 = E

La operación se realiza solamente sobre el primer cuarto de la imagen, es decir tomando la primera mitad de lasfilas y de las columnas. Deberá procesarse a partir del píxel en la posición (1,1). Para mas información: http://scale2x.sourceforge.net/algorithm.html

Page 13: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

2.3. PROCESAMIENTO EN TIEMPO REAL DE LAS IMÁGENES 9

2.3.8. BlurPara lograr un efecto de suavizado en una imagen, se realiza un promedio del valor de cada píxel con el de sus

vecinos. En este caso para cada posición, se tienen en cuenta los vecinos cuya distancia es ≤ 2.Es decir blur(x, y) =

(src(x, y − 2) + src(x− 1, y − 1) + src(x, y − 1) + src(x+ 1, y − 1)+

src(x− 2, y) + src(x− 1, y) + src(x, y) + src(x+ 1, y) + src(x+ 2, y)+

src(x− 1, y + 1) + src(x, y + 1) + src(x+ 1, y + 1) + src(x, y + 2))/13

2.3.9. EjemplosLos resultados de aplicar los filtros son los siguientes:

Imagen original Monocromatizar Blur

Scale 2x Edge Sepia

Smalltiles Rotar Blit

2.3.10. ObjetivoUno de los objetivos de esta parte del trabajo práctico es analizar la performance de un procesador al hacer uso de

las operaciones SIMD para el procesamiento de imágenes. A tal efecto, se implementarán ocho funciones, cada una endos versiones: una en lenguaje C, y una en lenguaje ensamblador haciendo uso de las instrucciones SSE. Finalmente,

Page 14: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

10 CAPÍTULO 2. ENUNCIADO

se compararán ambas versiones analizando las mejoras de performance obtenidas.Para lograr esto, el Proceso principal disparará dos threads por cada pedido del cliente invocando a la función C y ala función apropiada de procesamiento en su versión ASM pero deberá también crear u thread para ejecutar la mismafunción escrita en C. COmo resultado de ambas ejecuciones, mediante la instrucción rdtsc del procesador se puedetemporizar la cantidad de ciclos de clock que demandó una y otra función, logueando en un archivo de log por cadasesión (o se uno por cada requerimiento del cliente) los tiempos, en formato csv para su posterior procesamiento.

2.3.11. CódigoImplementar los filtros descriptos anteriormente, tanto en lenguaje C como en lenguaje ensamblador. Mas preci-

samente, deberán implementar las siguientes funciones:

void rotar_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void rotar_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void smalltiles_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void smalltiles_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void blit_c (unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size, unsigned char *blit, int bh, int bw, int b_row_size)

void blit_v (unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size, unsigned char *blit, int bh, int bw, int b_row_size)

void monocromatizar_c (unsigned char* src, unsigned char* dst, int h, int w, int src_row_size, int dst_row_size)

void monocromatizar_asm (unsigned char* src, unsigned char* dst, int h, int w, int src_row_size, int dst_row_size)

void sepia_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void sepia_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void edge_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void edge_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void scale2x_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void scale2x_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void blur_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

void blur_c(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

Nota: Sólo edge funciona con imágenes en escala de grises.

- src: Es el puntero al inicio de la matriz de elementos de 32 bits sin signo que corresponde a la imagen de entrada.El primer byte es al canal azul de la imagen (B), el segundo el verde (G) y el tercero el rojo (R). El cuarto canalpuede considerarse “de alineación”. Puede asumirse que el valor de este canal es siempre 0. En el caso de unaimagen en escala de grises, sólo tiene un canal de 8 bits sin signo.

- dst: Es el puntero al inicio de la matriz de elementos de 32 bits sin signo que representa a la imagen de salida.Puede asumirse que el valor del cuarto canal (“de alineación”) es desestimado al momento de guardar la imagen.En el caso de una imagen en escala de grises, cada elemento es de 8 bits sin signo.

- h: Representa el alto en píxeles de la imagen, es decir, la cantidad de filas de las matrices de entrada y salida.

Page 15: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

2.3. PROCESAMIENTO EN TIEMPO REAL DE LAS IMÁGENES 11

- w : Representa el ancho en píxeles de la imagen, es decir, la cantidad de columnas de las matrices de entrada ysalida.

- src_row_size: Representa la cantidad de bytes que ocupa una fila de la matriz de entrada. Dependiendo delformato se extiende el tamaño (en bytes) de las filas de la imagen, de forma que sea múltiplo de un valorconveniente para su posterior acceso, por ejemplo, 16. Esto no afecta a la imagen, pero se debe tener en cuentaa la hora de recorrer la misma. Por ejemplo, si una imagen tiene 10 píxeles de ancho ocuparía 10 bytes, si se laextiende a 12 bytes, corresponderán dos bytes de relleno al final de cada linea. No debe accederse a estos bytesde relleno.

- dst_row_size: Idem src_row_size pero para la imagen destino.

2.3.12. Consideraciones

Las funciones a implementar en lenguaje ensamblador deben utilizar el set de instrucciones SSE, a finde optimizar la performance de las mismas. Tener en cuenta lo siguiente:

El ancho de las imágenes es siempre mayor a 16 píxeles.

No se debe perder precisión en ninguno de los cálculos.

La implementación de cada filtro deberá estar optimizada para el filtro que se está implementando.No se puede hacer una función que aplique un filtro genérico y después usarla para implementar losque se piden.

Para el caso de las funciones implementadas en lenguaje ensamblador, deberán trabajar con almenos 8 bytes simultáneamente, procesando la mayor cantidad de píxeles posibles según el caso.

Para los filtros en los que no se puedan procesar los bordes, estos quedarán en negro.

En el caso de filtros donde se vea afectado el tamaño original de la imagen (smalltiles, scale2x) paraimágenes de ancho impar habrá una tolerancia de 1 píxel en los bordes de la imagen. Deberánjustificar en el caso de que esto suceda.

Puede asumir que la cuarta componente de color es siempre 0 y no se tiene en cuenta al final.

Puede asumir que la imagen de destino se inicializa en negro.

El procesamiento de los píxeles se deberá hacer exclusivamente con instrucciones SSE, no estápermitido procesarlos con registros de propósito general.

El TP se tiene que poder ejecutar en las máquinas del laboratorio.

Page 16: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

12 CAPÍTULO 2. ENUNCIADO

Page 17: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

Apéndice A

Doxygen

A.1. ¿Que es doxygen?

Doxygen es una herramienta para convertir los comentarios de un programa escrito en C, C++, VHDL,PHP, C#, y Java (entre otros lenguajes), en documentación suficientemente prolija y presentable comopara poser publicarse. Maneja la salida de documentación en formatos: html, LATEX, pdf, rtf, entre otros. Ylo mas interesante es que la documentación se genera de manera automática, y a partir de los archivosfuente de modo que siempre será consistente con éstos.Entre Ventajas de usar Doxygen podemos conntar:

1. Al escribir la documentación en el mismo archivo fuente en forma de comentarios, nos releva demantener otra documentación separada de los fuentes.

2. La documentación se genera en forma automática agregando además diagramas de interacción entrelos diferentes módulos

3. Permite documentar variables, estructuras de datos además de las funciones.

4. Es una herramienta de documentación automática. Hay otras pero su uso genera el hábito metodo-lógico de trabajo.

A.1.1. ¿Quienes usan Doxygen?

A.2. Instalación

Hace falta instalar los siguientes paquetes

1 sudo apt−get i n s t a l l doxygen2 sudo apt−get i n s t a l l g raphv iz

Listing A.1: Doxygen: Comandos para instalar Doxygen

Opcionalmente (aunque no estaría de mas...)

1 sudo apt−get i n s t a l l kate

13

Page 18: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

14 APÉNDICE A. DOXYGEN

Listing A.2: Doxygen: Comando para instalar Kate

A.3. Comenzando...

1. Escribir comentarios claros, y suficientes para describir cada función, antes de comenzar a “codear-la”.

2. Una vez dentro de ella, insertar comentarios de modo de describir la operación (al menos los “bigsteps”)

3. Observar buenas prácticas de programación: Identar código, Usar convenciones para nombres devariables y funciones, Escribir código de manera “legible”.

4. Entender al comentario como parte escencial de la aplicación: Cada agregado o modificación debeser documentado describiendo sus características, fecha y autor.

Page 19: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.4. CONFIGURACIÓN 15

A.4. Configuración

Abrimos una terminal e ingresamos al directorio que contiene nuestros archivos de trabajo.En ese directorio generamos el archivo de configuración para Doxygen.Para ello tipear:

1 doxygen −g

Listing A.3: Doxygen: Generación de un archivo de configuración genérico

A.4.1. DoxyfileEs el archivo de texto plano utilizado para la configuración de doxygen. Todo lo que comienza con # se

toma como comentario. Cada línea válida tiene el formato siguiente:PARAMETRO = VALOR Si bien el archivo aparece como gigantesco al editarlo, los Parámetros de interésson los siguientes:

Parámetro Descripción / ValorPROJECT_NAME Nombre del Proyecto. Ejemplo: Trabajo Práctico No 4.PROJECT_NUMBER Número o versión del proyecto. Ej: Ejercicio 3.4..OUTPUT_DIRECTORY Es el directorio a partir del cual se generará el árbol de archivos y subdirectorios

(ver opción siguiente) que componen la documentación. Generalmente usamos=./doxy, de modo que se genere dentro del directorio del proyecto.

CREATE_SUBDIRS Valor default YES. En este caso crea dos niveles de subdirectorios a partir delde documentación para almacenar, los diferentes archivos que la componen.

OUTPUT_LANGUAGE Lenguaje en el que queremos generar la documentación. Default English.TAB_SIZE Es la cantidad de espacios por los que reemplazará cada Tab encontrado en el

código. Default: 8.OPTIMIZE_OUTPUT_FOR_C Si el proyecto es enteramente escrito en C conviene activar esta opción para

que Doxygen optimice la salida para este lenguaje. En tal caso es = YES.EXTRACT_ALL Si está en YES, doxygen agregará a la documentación todo lo que encuentre

(funciones, variables, etc), aunque no se hayan documentado.INPUT Es el directorio del proyecto, que se toma como entrada de información para

Doxygen. En caso de poner Doxyfile en el mismo directorio del proyecto (comoes nuestro caso) colocamos =./

INPUT_ENCODING Establece el sistema de codificación de caracteres con el que se generará ladocumentación: Si se trabaja en inux colocamos UTF-8, para Windows ISO-8859.

GENERATE_LATEX Conviene ponerlo en NO (el default es YES) si no queremos generar la docu-mentación en LATEX.

A.5. Generando la documentación

Es la parte mas fácil. Solo hace falta tipear en una consola dentro del directorio del proyecto el siguientecomando:

1 doxygen Doxy f i l e

Listing A.4: Doxygen: Comando para la generación de la documentación del proyecto

Luego, simplemente hay que abrir el archivo ./doxy/index.html con un navegador cualquiera y tenemos listala documentación.

Page 20: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

16 APÉNDICE A. DOXYGEN

A.6. Preparando el código para su documentación

Básicamente la clave consiste en como armar los comentarios:

1 /∗ ∗2 ∗ E s t i l o JavaDoc : I n i c i a r con ’ / ∗ ∗ ’3 Apto para programas en C4 Los as te r i scos in te rmed ios son opcionales5 ∗ /6

7 /∗ !8 ∗ E s t i l o QT9 Los as te r i scos in te rmed ios son opcionales

10 ∗ /11

12 / / /13 / / E s t i l o C++

Listing A.5: Doxygen:Estilos de comentarios por lenguaje para generar documentación

Luego, conocer algunas de las Macros que permiten mejorar y organizar la documentación general delprograma.

1 /∗ ∗2 \ f i l e programa . c3 \ b r i e f Este arch ivo cont iene e l programa4 p r i n c i p a l5 \ d e t a i l s Aquí nos explayamos sobre l a ta rea6 que r e a i z a r á e l programa o l a7 f u n c i ón8 \ author A le jandro Fur fa ro afur faro@ieee . org9 \ date 30 de Marzo de 2011

10 \ ve rs ion 1 .0 .011 ∗ /

Listing A.6: Doxygen: Comentario tipo para encabezamiento de programa

Las mismas y algunas otras Macros ayudan con la Documentación general de las funciones.

1 /∗ ∗2 \ fn vo id p r i n t _ t i m e (∗ s t r uc t v )3 \ b re f Funcion para obtener l a fecha y l a hora4 con formato .5 \ d e t a i l s En pr imer i n s t a n c i a se l lama a get t imeofday ,6 pasando como argumento e l puntero a una7 e s t r u c t u r a t imeva l ( t v ) . Luego con s t r f t i m e ( )8 se l e da un formato apto para presentar un9 t ime stamp con e l formato

10 año−mes−día horas : minutos : segundos .11 \ param [ i n ] ∗ s t r uc t v : puntero a una12 e s t r u c t u r a t imeva l ( t v )13 \ r e t u r n Nada (No regresa no regresa va lo res

Page 21: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.6. PREPARANDO EL CÓDIGO PARA SU DOCUMENTACIÓN 17

14 \ author A le jandro Fur fa ro afur faro@ieee . org15 \ date 2011.05.0816 \ ve rs ion 1 .0 .017 ∗ /

Listing A.7: Doxygen: Comentario tipo para encabezamiento de función

A.6.1. Documentando variables

Versión compacta:

1 unsigned char Bu f fe r [ B u f f e r s i z e ] ; / / ! < Bu f fe r para r e c i b i r carac te res

Listing A.8: Doxygen: Comentario tipo para una variable

Versión extendida

1 /∗ ∗2 \ var unsigned char Bu f fe r [ B u f f e r s i z e ] ;3 \ b r i e f Bu f fe r para r e c i b i r carac te res4 \ d e t a i l s Aquí s i es necesar io podemos explayarnos5 acerca de l a v a r i a b l e .6 ∗ /7 unsigned char Bu f fe r [ B u f f e r s i z e ] ;

Listing A.9: Doxygen: Documentación extendida para una variable

Estructuras

1 /∗ ∗2 \ s t r u c t coordenada3 \ b r i e f Var iab le para almacenar un par de coordenadas ( x , y )4 \ d e t a i l s Aquí s i es necesar io podemos explayarnos acerca de l a e s t r u c t u r a .5 ∗ /6 s t r u c t coordenada {7 i n t x ; / / ! < Coordenada x ;8 i n t y ; / / ! < Coordenada y ;9 } ;

Listing A.10: Doxygen: Comentario tipo para documentación de una estructura

En general

1 \ s t r u c t2 \ enum3 \ union4 \ c lass5 \ def6 \ typedef

Listing A.11: Doxygen: Macro tipo para documentación de las diferentes variables y tipos de C

Page 22: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

18 APÉNDICE A. DOXYGEN

Page 23: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

Apéndice A

Opencv

A.1. Características

OpenCV es una biblioteca open source para C/C++ para procesamiento de imágenes y visión compu-tarizada, desarrollada inicialmente por Intel. Su primer versión estable fue liberada en 2006. En Octubrede 2009, se libera el segundo release mayor: OpenCV v2.Su documentación no es muy exhaustiva. Mas bien la descripción de las diferentes funciones y sus princi-

pales variables tipos, y estructuras de datos. Se puede acceder en: http://opencv.willowgarage.com/wiki/.OpenCV se encuentra disponible para los sistemas operativos Linux, Mac, y Windows, y sus funciones

de acceso a recursos gráficos interactúan con las API de las GUI de cada sistema de modo de proveerun conjunto de recursos, si bien limitado en cuanto a posibilidades, 100 % portable a cada una de estasplataformas.Tiene estructuras básicas de datos para operaciones con matrices y procesamiento de imágenes, permitevisualizar datos muy sencillamente y extraer información de imágenes y videos, independientemente delos diversos formatos que soporta en cada caso. Tiene funciones de captura y presentación de imágenes.

A.1.1. Componentes y Nomenclaturas

Opencv se compone de 4 Módulos.

cv. Contiene las Funciones principales de la biblioteca

cvaux. Contiene las Funciones Auxiliares (experimental)

cxcore. Contiene las Estructuras de Datos y Funciones de soporte para Álgebra lineal

Highgui. Funciones para manejo de la GUI

Cada uno de estos está relacionado con un header.

1 # inc lude <cv . h>2 # inc lude <cvaux . h>3 # inc lude <h ighgu i . h>4 # inc lude <cxcore . h> / / innecesar io , i n c l u i d o en cv . h

Listing A.1: Opencv: Headers para incluir en los programas

19

Page 24: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

20 APÉNDICE A. OPENCV

Existen convenciones para los Nombres de las Funciones y Datos. En general el formato es:cvActionTargetMod (...)

Action: Función core. Ej: set, create.

Target: Elemento destino de la Acción. Ej: Contorno, polígono.

Mod : Modificadores opcionales. Ej: Tipo de argumento.

Respecto de Parámetros de imágenes, están definidos diferentes parámetros y sus valores, como porejemplo:

IPL_DEPTH_<bit_depth>(S|U|F)

Ejemplos de este parámetro:

1 IPL_DEPTH_8U / / imagen de 8 b i t s no signados .2 IPL_DEPTH_32F / / imagen de 32 b i t s punto f l o t a n t e .

Listing A.2: Opencv: Ejemplos de definición de la profundidad de bit

A.2. Primer Ejemplo

A.2.1. Invocar funciones básicas y compilar

Nos proponemos simplemente abrir un archivo de imagen cualquiera y presentarlo en la pantalla enuna ventana.

1 /∗ ∗2 ∗ \ f i l e imgproc3 ∗ \ b r i e f Programa s e n c i l l o para a b r i r una imagen y p resen ta r l a en una ventana4 ∗ \ d e t a i l s U t i l i zamos l a b i b l i o t e c a Opencv para a b r i r l a imagen aprovechando5 ∗ sus func iones independientes de l t i p o de archivo , y también para crear una6 ∗ ventana s e n c i l l a ( s in menú) , para p resen ta r l a en l a GUI de l sistema opera t i vo7 ∗ que se tenga ( Linux , Windows , o MAC OS) .8 ∗ Este programa compila en Linux , mediante e l comando s i g u i e n t e :9 ∗ gcc −o img img . c ‘ pkg−con f i g −−c f l a g s −− l i b s opencv ‘ −g −ggdb −Wall

10 ∗ \ author A le jandro Fur fa ro . a fu r fa ro@elec t ron . f r ba . utn . edu . ar11 ∗ \ date 12.05.201112 ∗ /13

14 # inc lude <cv . h>15 # inc lude <h ighgu i . h>16

17 i n t main ( )18 {19 / / I n s t a n c i a una e s t r u c t u r a Ipl Image , d e f i n i d a en openCV para20 / / cargar l a i n fo rmac ión de l a imagen or igen21 Ip l Image ∗ image = cvLoadImage ( "LENA.JPG" ,0 ) ;22 / / Creamos una ventana llamada " ejemplo1 " , au toa jus tab le a l

Page 25: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.2. PRIMER EJEMPLO 21

23 / / tamaño de l a imagen que l e vamos a co locar dentro24 cvNamedWindow( " ejemplo1 " ,CV_WINDOW_AUTOSIZE) ;25 / / Movemos l a ventana a l p i x e l 100 de l a f i l a 10026 cvMoveWindow ( " ejemplo1 " ,100 ,100) ;27 / / Mostramos l a imagen l e ída en l a ventana creada28 cvShowImage ( " ejemplo1 " , image ) ;29 / / Esperamos que e l usuar io pres ione cua lqu ie r t e c l a . . .30 cvWaitKey ( 0 ) ;31 / / Liberamos los recursos u t i l i z a d o s32 cvReleaseImage(&image ) ;33 / / Terminamos e l programa34 r e t u r n 0 ;35 }

Listing A.3: Listado de código del programam de ejemplo No1

Para empezar a trabajar abrir con el editor de texto preferido, el archivo eje1.c que contiene el código dellistado A.3. Además se necesita una consola cuyo prompt esté posicionado en el directorio de trabajo en elque está el programa eje1.c. Para compilar, ejecutar en la consola el comando indicado en el encabezadodel programa del listado A.3, que reproducimos a continuación para mayor claridad:

1 gcc −oeje1 eje1 . c −g −ggdb ‘ pkg−con f i g −−c f l a g s −− l i b s opencv ‘ −Wall

Listing A.4: Comando de compilación del código de A.3

A.2.2. Análisis

Los comentarios del programa listado en A.3, son suficientes para entender que hace cada línea decódigo.En principio vemos lo simple del mismo, en especial la manipulación de ventanas a cargo de la biblioteca

highgui, que nos independiza del manejo de los detalles que requiere el software de base. Revisemos la

nomenclatura explicada anteriormente en el código ejemplo. Es muy fácil de ver cuales son funciones deesta biblioteca y cuales nó, simplemente teniendo en cuenta que las funciones Opencv comienzan con elprefijo cv.

Carga de una imagenIplImage *image = cvLoadImage("Lena.bmp");

Crear y Ubicar una ventanacvNamedWindow ("ejemplo1", CV_WINDOW_AUTOSIZE);cvMoveWindow ("ejemplo1", 100, 100);//desde borde superior izquierdo

Mostrar la imagen en la ventana creadacvShowImage("ejemplo1", image);

Liberar recursoscvReleaseImage(&image);

Page 26: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

22 APÉNDICE A. OPENCV

Con respecto a la acción de cada función:

Carga de una imagenIplImage *image = cvLoadImage("Lena.bmp");

Crear y Ubicar una ventanacvNamedWindow ("ejemplo1", CV_WINDOW_AUTOSIZE);cvMoveWindow ("ejemplo1", 100, 100);//desde borde superior izquierdo

Mostrar la imagen en la ventana creadacvShowImage("ejemplo1", image);

Liberar recursoscvReleaseImage(&image);

Y finalmente respecto del Destino de la función:

Carga de una imagenIplImage *image = cvLoadImage("Lena.bmp");

Crear y Ubicar una ventanacvNamedWindow("ejemplo1", CV_WINDOW_AUTOSIZE);cvMoveWindow("ejemplo1", 100, 100);//desde borde superior izquierdo

Mostrar la imagen en la ventana creadacvShowImage("ejemplo1", image);

Liberar recursoscvReleaseImage(&image);

A.2.3. IplImage

IplImage es “La” Estructura

1 typedef s t ruc t_ Ip l Image2 {3 i n t nSize ;4 i n t ID ;5 i n t nChannels ;6 i n t alphaChannel ;7 i n t depth ;8 char colorModel [ 4 ] ;9 char channelSeq [ 4 ] ;

10 i n t dataOrder ;11 i n t o r i g i n ;12 i n t a l i g n ;13 i n t width ;14 i n t he igh t ;

Page 27: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.2. PRIMER EJEMPLO 23

15 s t r u c t _IplROI ∗ r o i ;16 s t r u c t _Ipl Image ∗maskROI ;17 vo id ∗ imageId ;18 s t r u c t _ I p l T i l e I n f o ∗ t i l e I n f o ;19 i n t imageSize ;20 char ∗ imageData ;21 i n t widthStep ;22 i n t BorderMode [ 4 ] ;23 i n t BorderConst [ 4 ] ;24 char ∗ imageDataOrigin ;25 }26 Ip l Image ;

Listing A.5: Declaración de la estructura IplImage

Si bien está en la documentación de la Biblioteca, es oportuno desglosar aquí el significado de cada unode sus miembros

Nsize: sizeof (IplImage), es decir su tamaño en bytes.

ID: Versión, siempre igual a 0

nchannels: Número de canales. La mayoría de las funciones OpenCV soportan 1 a 4 canales.

alphaChannel: Ignorado por OpenCV

depth: Profundidad del canal en bits + el bit de signo opcional (IPL_DEPTH_SIGN).

• IPL_DEPTH_8U: entero no signado de 8 bits.

• IPL_DEPTH_8S: entero signado de 8 bits.

• IPL_DEPTH_16U: entero no signado de 16 bits.

• IPL_DEPTH_16S: entero signado de 16 bits.

• IPL_DEPTH_32S: entero signado de 32 bits.

• IPL_DEPTH_32F: Punto flotante simple precisión.

• IPL_DEPTH_64F: Punto flotante doble precisión.

colorModel: Ignorado por OpenCV. La función CvtColor de OpenCV requiere los espacios de colororigen y destino como parámetros.

channelSeq: Ignorado por OpenCV.

dataOrder:

• 0: IPL_DATA_ORDER_PIXEL - canales de color entrelazados.

• 1: canales de color separados.

• CreateImage solo crea imágenes con canales entrelazados. Por ejemplo, el layout común decolores de una imagen es: b_00 g_00 r_00 b_10 g_10 r_10 ...

origin:

• 0: origen extremo superior izquierdo.

• 1: origen extremo inferior izquierdo, (estilo Windows bitmap).

Page 28: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

24 APÉNDICE A. OPENCV

align: Alineación de las filas de la imagen(4 u 8). OpenCV ignora este campo usando en su lugarwidthStep.

width: Ancho de la Imagen en pixels.

height: Alto de la Imagen en pixels.

roi: Region Of Interest (ROI). Si no es NULL, se procesa solo esta región de la imagen.

maskROI: Debe ser NULL en OpenCV.

imageId: Debe ser NULL en OpenCV.

tileInfo: Debe ser NULL en OpenCV.

imageSize: Tamaño en bytes de la imagen. Para datos entrelazados, equivale a: image->height * image->widthStep

imageData: Puntero a los datos alineados de la imagen.

widthStep: Tamaño en bytes de una fila de la imagen alineada

BorderMode y BorderConst: Modo de completamiento del borde, ignorado por OpenCV.

imageDataOrigin: Puntero el origen de los datos de la imagen (no necesariamente alineados). Usa-do para desalojar la imagen.

A.2.4. Opencv gira alrrededor deIplImage

La estructura IplImage se hereda de la Librería original de Intel. Su formato es nativo, aunqueOpenCV solo soporta un subset de formatos posibles de IplImage.Además de las restricciones anteriores, OpenCV maneja las ROIs de modo diferente. Las funciones de

OpenCV requieren que los tamaños de las imágenes o los de las ROI de todas las imágenes fuente ydestino coincidan exactamente.Por otra parte, la Biblioteca de Intel de Procesamiento de Imágenes procesa el área de intersección entre

las imágenes origen y destino (o ROIs), permitiéndoles variar de forma independiente.El tema es que cualquier imagen va a parar a una estructura de este tipo, incluso video. Al respecto,

OpenCV permite visualizar videos desde dos fuentes de información: cualquier Cámara web conectada ala PC, o desde archivo formato avi, o flv. Una imagen de video se compone de cuadros de n*m pixeles.Cada cuadro se carga en una estructura IplImage

A.3. Aplicaciones y más funciones

A.3.1. Crear una imagen

El siguiente bloque de código permite crear una imagen. Su contenido inicial es vacío.

1 Ip l Image∗ cvCreateImage ( CvSize size , i n t depth , i n t channels ) ;

Listing A.6: Función para creación de una imagen

Page 29: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.3. APLICACIONES Y MÁS FUNCIONES 25

size: Tamaño en pixels del frame que va a contener la imagen:

typedef struct CvSize. Es una estructura que contiene la dimensión de una imagen:

1 Typedef s t r u c t CvSize2 {3 i n t width ;4 i n t he igh t ;5 } CvSize ;

Listing A.7: Estructura CvSize

Por su parte en general para muchas estructuras simples ocurre lo mismo, existe una función rela-cionada que oficia de “Constructora”. En este caso:

1 cvSize ( i n t width , i n t he igh t ) ;

Listing A.8: Estructura CvSize

depth:profundidad del pixel en bits: IPL_DEPTH_8U, IPL_DEPTH_32F.

channels: Número de canales por pixel. Sus valores posibles son 1, 2, 3 o 4. Los canales estánentrelazados. El layout de datos usual de una imagen color es b0 g0 r0 b1 g1 r1.

Utilizando estas funciones tenemos los ejemplos de creación de una imagen.

1 / / Crear una imagen con canal de 1 byte2 Ip l Image∗ img1=cvCreateImage ( cvSize (640 ,480) , IPL \_DEPTH\ _8U , 1 ) ;3 / / Crear una imagen con t r e s canal de f l o a t4 Ip l Image∗ img2=cvCreateImage ( cvSize (640 ,480) , IPL \_DEPTH\ _32F , 3 ) ; } }

Listing A.9: Ejemplos de creación de una imagen con cvSize y CvSize

A.3.2. Operaciones Básicas

Es necesario además Cerrar y Clonar Imágenes. Los siguientes códigos ilustran estas operaciones conlas funciones que se utilizan.

Cerrar una imagen

1 cvReleaseImage ( \& img ) ;

Listing A.10: Función para Cerrar una imagen

Clonar una imagen

Page 30: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

26 APÉNDICE A. OPENCV

1 Ip l Image∗ img1=cvCreateImage ( cvSize (640 ,480) , IPL \_DEPTH\ _8U , 1 ) ;2 Ip l Image∗ img2 ;3 img2 = cvCloneImage ( img1 ) ; } }

Listing A.11: Código para Clonar una imagen

En la mayoría de las aplicaciones nos concentramos en cierta región de la pantalla, donde está la informa-ción que queremos procesar. Esta zona se denomina ROI, siglas de Región Of Interest. Es como una submatriz de la matriz general. Setear u obtener la región de interés (ROI), requiere de algunas funciones enOpencv.

1 vo id cvSetImageROI ( Ip l Image∗ image , CvRect r e c t ) ;2 CvRect cvGetImageROI ( const Ip l Image∗ image ) ;

Listing A.12: Prototipos de las funciones para setear u obtener una ROI

Al trabajar con ROIs estamos definiendo “cajas“ dentro de la Imagen. Para ello es importante la estructuraCvRect, que define las coordenadas de la esquina superior izquierda y el tamaño del rectángulo, quearma la caja de la ROI.

1 typedef s t r u c t CvRect {2 i n t x ; / / coordenada x de l a esquina super io r i zqu ie rda3 i n t y ; / / coordenada y de l a esquina super io r i zqu ie rda4 i n t width ; / / ancho de l r e c t ángulo5 i n t he igh t ; / / a l t o de l r e c t ángulo6 }7 i n l i n e CvRect cvRect ( i n t x , i n t y , i n t width , i n t he igh t ) ; / / i n i c i a l i z a c i ón

Listing A.13: Estructura CvRect y su función constructora

A.3.3. Manejando pixeles

Existen algunas otras Estructuras asociadas, para manejo de pixeles. Es una estructura CvScalar. Esun contenedor de un arreglo de 1, 2, 3, o 4 doubles. Cada double pertenece al valor R G B y Alfa. En casode imágenes monocromo contiene el valor en escala de gris en formato double. Su prototipo es:

1 typedef s t r u c t CvScalar {2 double va l [ 4 ] ;3 } CvScalar ;

Listing A.14: Estructura CvScalar

Para pixeles color y monocromáticos a continuación algunos ejemplos de código para inicializarlos envalores determinados.

1 / / I n i c i a l i z a r va l [ 0 ] con val0 , va l [ 1 ] con val1 , e tc .2 i n l i n e CvScalar cvScalar ( double val0 , double va l1 =0 , double va l2 =0 , double va l3 =0) ;3 / / I n i c i a l i z a r los cuat ro elementos va l [ 0 ] . . . va l [ 3 ] con e l va l o r val0123 .

Page 31: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.4. SEGUNDO EJEMPLO 27

4 i n l i n e CvScalar cvSca la rA l l ( double val0123 ) ;5 / / I n i c i a l i z a r va l [ 0 ] con val0 , y e l res to ( va l [ 1 ] . . . va l [ 3 ] ) con ceros6 i n l i n e CvScalar cvRealScalar ( double va l0 ) ;

Listing A.15: Inicialización de pixeles

Obtener el valor de un pixel es fundamental a menudo para aplicar cualquier acción de transformación, pro-cesamiento, etc. En al figura siguiente vemos su significado. La función CvGet2D es útil a estos propósitos

entregando CvScalar.

1 / / P r o to t i p o de cvGet2D2 CvScalar s = cvGet2D ( img , row , co l )

Listing A.16: Prototipo de cvGet2D

Si la imagen está en escala de grises, s.val[0] es el valor del pixel.

Si la imagen está en color,s.val[0],s.val[1], y s.val[2] son respectivamente R, G,y B.

Img es un puntero a la IplImage obtenida al abrir o crear la imagen.

row y col con x e y del slide anterior.

A.4. Segundo Ejemplo

A.4.1. Manejando video

Fuente: archivo avi

Page 32: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

28 APÉNDICE A. OPENCV

1 /∗ ∗2 ∗ \ f i l e aviexample . c3 ∗ \ b r i e f Programa s e n c i l l o para a b r i r un arch ivo av i y r e p r o d u c i r l o en una ventana4 ∗ \ d e t a i l s U t i l i zamos l a b i b l i o t e c a Opencv para a b r i r e l a rch ivo aprovechando5 ∗ sus func iones independientes de l t i p o de arch ivo ( con algunas l i m i t a c i o n e s a6 ∗ l os t i p o s mpeg , y también para crear una ventana s e n c i l l a ( s in menú) , para7 ∗ r e p r o d u c i r l o en l a GUI de l sistema opera t i vo que se tenga ( Linux , Windows , o8 ∗ MAC OS) .9 ∗ Este programa compila en Linux , mediante e l comando s i g u i e n t e :

10 ∗ gcc −o videmo aviexample . c ‘ pkg−con f i g −−c f l a g s −− l i b s opencv ‘ −g −ggdb −Wall11 ∗ \ author A le jandro Fur fa ro . a fu r fa ro@elec t ron . f r ba . utn . edu . ar12 ∗ \ date 22.06.201113 ∗ /14 \# inc lude <cv . h>15 \# inc lude <h ighgu i . h>16 i n t main ( i n t argc , char∗∗ argv )17 {18 / / Creamos una ventana llamada " VideoPlayer " , au toa jus tab le a l19 / / tamaño de l a imagen que l e vamos a co locar dentro20 cvNamedWindow( " VideoPlayer " , CV\_WINDOW\ _AUTOSIZE) ;21 / / Esta f u n c i ón Obtiene e l I d e n t i f i c a d o r de l d i s p o s i t i v o de captura , en este22 / / caso un arch ivo av i .23 CvCapture∗ capture = cvCreateFi leCapture ( argv [ 1 ] ) ;24 /∗ ∗25 ∗ Sol i c i tamos las ca rac te r í s t i c a s de l d i s p o s i t i v o mediante l a s i g u i e n t e26 ∗ f u n c i ón :27 ∗ double cvGetCaptureProperty ( CvCapture∗ capture , i n t p rope r t y_ id )28 ∗ Obtiene las propiedades de l d i s p o s i t i v o de captura de video .29 ∗ Parámetros :30 ∗ capture − Es t ruc tu ra de captura de video .31 ∗ prope r t y_ id − I d e n t i f i c a d o r de l a propiedad que se qu iere obtener .32 ∗ Puede ser alguno de los s igu ien tes va lo res :33 ∗ CV_CAP_PROP_POS_MSEC − Pos ic i ón ac tua l de l Fi lm en mseg . o34 ∗ t imestamp de captura de video .35 ∗ CV_CAP_PROP_POS_FRAMES − I nd i ce base−0 de l frame a d e c o d i f i c a r o36 ∗ cap tu ra r37 ∗ CV_CAP_PROP_POS_AVI_RATIO − Pos ic i ón r e l a t i v a de l a rch ivo de38 ∗ video (0 − s t a r t o f f i l m , 1 − end of39 ∗ f i l m ) .40 ∗ CV_CAP_PROP_FRAME_WIDTH − ancho de los frames de l stream de video41 ∗ CV_CAP_PROP_FRAME_HEIGHT − a l t o de los frames del stream de video42 ∗ CV_CAP_PROP_FPS − Frame ra te43 ∗ CV_CAP_PROP_FOURCC − Código de 4bytes de l codec44 ∗ CV_CAP_PROP_FRAME_COUNT − Número de frames de l a rch ivo de video .45 ∗ CV_CAP_PROP_BRIGHTNESS − B r i l l o de l a imagen ( so lo para cámaras )46 ∗ CV_CAP_PROP_CONTRAST − Contraste de l a imagen ( so lo para cámaras )47 ∗ CV_CAP_PROP_SATURATION − Satu rac ión de l a imagen ( so lo para48 ∗ cámaras )49 ∗ CV_CAP_PROP_HUE − Hue de l a imagen ( so lo para cámaras )50 ∗ /51 double fps=cvGetCaptureProperty ( capture ,CV_CAP_PROP_FPS) ;52 p r i n t f ( " Frame por seg : %d \ n " , ( i n t ) fps ) ;

Page 33: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.4. SEGUNDO EJEMPLO 29

53 getchar ( ) ;54 / / I n s t a n c i a una e s t r u c t u r a Ipl Image , d e f i n i d a en openCV para55 / / cargar l a i n fo rmac ión de cada frame56 Ip l Image∗ frame ;57 whi le ( 1 )58 {59 / / Lee un frame desde e l d i s p o s i t i v o de captura cuyo i d e n t i f i c a d o r obtuvo60 / / a l p r i n c i p i o61 frame = cvQueryFrame ( capture ) ;62 i f ( ! frame )63 break ; / / Si e l puntero es NULL, f a l l ó => Sale64 / / La l e c t u r a fue cor rec ta , por l o tan to presenta e l frame en l a ventana65 / / que d e f i n i ó66 cvShowImage ( " VideoPlayer " , frame ) ;67 / / Esta l ínea adapta l a ve loc idad de reproducc ión . Para entender la , comentar la

compi lar y rep roduc i r : )68 char c= cvWaitKey ( ( i n t ) (1000/ fps ) ) ;69 / / De paso . . . s i pulsa ESC sale70 i f ( c == 27 )71 break ; / / s i es tá aquí se pulsó ESC72 }73 / /O l l e g ó a l f i n de l a p e l i . . . o f a l l ó alguna l e c t u r a de frame . . .74 / / L ibera recursos y sa le75 cvReleaseCapture ( &capture ) ;76 cvDestroyWindow ( " VideoPlayer " ) ;77 r e t u r n 0 ;78 }

Listing A.17: Ejemplo2: Código para abrir y reproducir un archivo avi

Para empezar a trabajar abrir con el editor de texto preferido, el archivo aviexample.c que contiene el códigodel listado A.17. Además se necesita una consola cuyo prompt esté posicionado en el directorio de trabajoen el que está el programa aviexample.c. Para compilar, ejecutar en la consola el comando indicado en elencabezado del programa del listado A.17, que reproducimos a continuación para mayor claridad:

1 gcc −o videmo aviexample . c −g −ggdb ‘ pkg−con f i g −−c f l a g s −− l i b s opencv ‘ −Wall

Listing A.18: Comando de compilación del código de A.17

A.4.2. Análisis

¿Que hicimos?

Creamos una ventana llamada VideoPlayer.

1 cvNamedWindow( " VideoPlayer " , CV_WINDOW_AUTOSIZE) ;

Listing A.19: Creación de una ventana VideoPlayer

Tomar un dispositivo de captura de Video.

Page 34: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

30 APÉNDICE A. OPENCV

1 CvCapture∗ capture = cvCreateFi leCapture ( argv [ 1 ] ) ;

Listing A.20: Obtención de un identificador para el dispositivo de captura

Obtiene los Frames por segundo del video contenido en el archivo.

1 double fps=cvGetCaptureProperty ( capture ,CV_CAP_PROP_FPS) ;

Listing A.21: Obtención de un identificador para el dispositivo de captura

Crear un puntero a una estructura IplImage en donde se guardarán los frames.

1 Ip l Image∗ frame ;

Listing A.22: Instancia de una estructura IplImage para almacenar los frames leídos

Luego entramos a un bucle infinito

Se obtiene cada frame del avi

1 frame = cvQueryFrame ( capture ) ;

Listing A.23: Lee un frame desde el dispositivo de captura

Y lo mostramos (esto ya lo aprendimos). . .

1 cvShowImage ( " VideoPlayer " , frame ) ;

Listing A.24: Presenta el cuadro (frame) leido en la ventana

Finaliza cuando el puntero al frame es NULL (encontró EOF, o el archivo está corrupto).

1 i f ( ! frame ) break ;

Listing A.25: Presenta el cuadro (frame) leido en la ventana

Esperamos una tecla (Opencv tiene una función para esto también): Sin embargo la línea siguientesirve fundamentalmente para sincronizar los frame a la velocidad de Frames per second obtenida.

1 char c = cvWaitKey (33) ;

Listing A.26: Presenta el cuadro (frame) leido en la ventana

Liberamos recursos

Page 35: Universidad Tecnológica Nacional Facultad Regional …mdoallo/presentaciones.save.2012/... · de funciones equivalentes C y Asm, resuelven cada uno de los 9 filtros de procesamiento

A.4. SEGUNDO EJEMPLO 31

1 cvReleaseCapture ( &capture ) ;2 cvDestroyWindow ( " avidemo " ) ;

Listing A.27: Libera recursos antes de salir