You are on page 1of 63

UNIVERSIDAD TECNOLGICA NACIONAL FACULTAD REGIONAL SAN NICOLS INGENIERIA EN ELECTRNICA

TCNICAS DIGITALES III

PROYECTO INTEGRADOR DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV


Integrantes:
Calla, Bernardo Malespina, Gabriel Varela, Enzo Palomeque, Cristian

Profesores:
Poblete, Felipe F. Gonzlez, Mariano

AO 2007

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

INDICE DE SECCIONES: SECCION 0: INTRODUCCION, OBJETIVO Y DESARROLLO

SECCION 1: LA LIBRERA DE VISIN ARTIFICIAL OPENCV Esta seccin describe las caractersticas fundamentales de las libreras as como una breve referencia de su origen y comparativas con otros paquetes comerciales similares. SECCION 2: INSTALACION Y CONFIGURACION DE LIBRERIAS Esta seccin describe la adecuada instalacin de IPL 2.5, OpenCV beta 5 y highgui, descripcin y uso de los diferentes tipos de archivos generados en dicha instalacin y como efectuar la inclusin de las libreras en dev cpp 4.0. SECCION 3: IMAGEN DIGITAL Esta seccin describe los principales parmetros de una imagen digital y como es representada cada tipo de imagen digital en memoria SECCION 4: CAPTURA Y DIGITALIZACION Esta seccin describe como es la interfase entre la imagen real y la PC, principales caractersticas del digitalizador, ventajas y desventajas de dos de las actuales tecnologas de fotodetectores usadas en dispositivos de captura. Se incluye informacin de la cmara web utilizada en el proyecto. SECCION 5: TIPOS DE DATOS EN IPL Y OPENCV Esta seccin se muestra los tipos de datos de IPL y OPENCV utilizados en el lenguaje c. SECCION 6: REPRESENTACION DEL MOVIMIENTO Esta seccin es un fragmento traducido del manual proporcionado por OPENCV en el cual se detalla el grupo de funciones que permiten encontrar la orientacin de movimiento de algn objeto en una secuencia de capturas. SECCION 7: OPERACIONES LOCALES Esta seccin trata sobre como se realizan los diferentes anlisis a una imagen digital, se muestra en detalle la deteccin de bordes mediante el operador sobel el cual es usado por una de las funciones descriptas en la seccin anterior. SECCION 8: MOTORES PASO A PASO Esta seccin informa sobre los diferentes tipos de motores paso a paso, el funcionamiento y las diferentes de secuencia de excitacin que permiten distintos ngulos de giro. SECCION 9: MOTOR Y PUERTO PARALELO Esta seccin informa sobre la configuracin de puerto en Windows XP para el uso de los mismos en C, y se detalla la interconexin de nuestro proyecto a travs del mismo. SECCION 10: PROGRAMA PRINCIPAL

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-1-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Esta seccin describe el diagrama de flujo del programa principal, el cdigo fuente en desarrollado en DEVCPP. SECCION 11: FUNCIONES UTILIZADAS Esta seccin incluye las funciones utilizadas en el cdigo fuente proporcionada por el manual referente de OPENCV. SECCION 12: ANALISIS DEL FUNCIONAMIENTO DEL PROGRAMA Se muestra un analisis de una secuencia de imagenes de entrada y como se generan las siluetas de movimiento validas, que son parametros fundamentales para las funciones descriptas en la seccion REPRESENTACION DEL MOVIMIENTO

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-2-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

INTRODUCCION En la vida industrial se observa con gran frecuencia que es necesario realizar el control de procesos los cuales requieren aparte de simples sensores, de otros dispositivos ms complejos para tener una visin detallada del mismo. Hoy en da una de las armas para combatir este problema es la visin artificial, la cual a la vez de ayudar a resolverlos optimiza en gran medida el control. Adems de la rama industrial es posible realizar numerosas aplicaciones en diferentes reas como por ejemplo la vigilancia hogarea, etc. OBJETIVO: Mediante el uso de una cmara web de uso familiar realizaremos un dispositivo el cual ser capaz de interpretar el movimiento de un objeto cualquiera y hacer efectivo el seguimiento, estando este a una cierta distancia y movindose unidimensionalmente en un determinado rango. DESARROLLO: Como dijimos mediante una cmara web conectada a travs del puerto USB, son adquiridas las imgenes. Estas imgenes son interpretadas por un software desarrollado bajo el lenguaje de programacin dev C++ y las libreras OpenCV, IPL y Highgui, a travs del mismo programa, y dependiendo del movimiento y las condiciones de finales de carrera se generan seales que son tomadas y decodificadas por el driver controlador del motor paso a paso, que es el encargado de realizar los movimientos de la cmara web. Por lo tanto podemos desglosar el funcionamiento del sistema en distintas secciones, las cuales sern desarrolladas en detalle a continuacin.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-3-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

LA LIBRERA DE VISIN ARTIFICIAL OPENCV Caractersticas fundamentales de la librera de visin artificial y cdigo abierto The Open Computer Vision Library (OpenCV a partir de ahora). La librera OpenCV proporciona un marco de trabajo de alto nivel para el desarrollo de aplicaciones de visin por computador en tiempo real: estructuras de datos, procesamiento y anlisis de imgenes, anlisis estructural, etc. Este marco de trabajo facilita en gran manera el aprendizaje e implementacin de distintas tcnicas de visin por computador, tanto a nivel docente como investigador, aislando al desarrollador de las peculiaridades de los distintos sistemas de visin. 1. INTRODUCCION Son muchos los paquetes de procesamiento de imgenes comerciales y software libre disponibles actualmente, y muchas las ventajas e inconvenientes de cada uno de ellos. Entre los distintos paquetes comerciales disponibles actualmente destacan por su potencia The Martos Image Library (MIL) [1], Khoros, eVision, HIPS, Exbem, Aphelion, etc. sin embargo, el principal inconveniente es su elevado pr ecio y su ciclo de actualizaci n, muchas veces, relativamente largo. Algunos de ellos carecen de un entorno de desarrollo de alto nivel (i.e. HIPS), otros disponen de ste, pero estn ligados a la plataforma de desarrollo (i.e. Khoros - Unix, Linux; Exbem - MacOS; eVision, Aphelion - Windows) o al propio hardware de captura (i.e. MIL). Todos ellos proporcionan funciones de procesamiento y anlisis de imgenes, reconocimiento de patrones, estadsticas, calibracin de la cmara, etc. a travs del propio entorno o a travs de libreras de funciones, desarrollados en la mayora de las ocasiones en C/C++. Sin embargo, tan slo HIPS pone a disposicin del cliente su cdigo fuente, y en la mayora de los casos hablamos de libreras monolticas, muy pesadas y no demasiado rpidas. Por otro lado, son muchos los paquetes no comerciales (con y sin licencia Software Libre) disponibles en el mercado, entre ellos destacan OpenCV, Gandalf, TargetJr, VXL (basado en TargetJr), CVIPTools, ImageLib, ImLib3D (Linux), LookingGlass, NeatVision (Java), TINA y XMegaWave (Unix/Linux). Todos ellos disponen de herramientas para el procesamiento de imgenes, pero a excepcin de OpenCV y Gandalf ninguno proporciona un marco de trabajo completo para el desarrollo de aplicaciones relacionadas con la visin por computador. Esta capacidad de desarrollo contempla, no slo el procesamiento de imgenes, sino tareas mucho ms complejas como el reconocimiento de gestos, estimacin del movimiento y la posicin de un objeto, morphing, estimadores (filtros de Kalman, etc.), etc. Sin embargo, slo OpenCV proporciona bibliotecas de tipos de datos estticos y dinmicos (matrices, grafos, rboles, etc.), herramientas con la posibilidad de trabajar con la mayora de las capturadoras/cmaras del mercado, entornos de desarrollo fciles e intuitivos y todo ello, corriendo en dos de los sistemas operativos ms utilizados del mundo Microsoft Windows y Linux. 2. THE OPEN COMPUTER VISION LIBRARY El 13 de Junio del 2000, Intel Corporation anunci que estaba trabajando con un grupo de reconocidos investigadores en visin por c omputador para realizar una nueva librera de estructuras/funciones en lenguaje C. Esta librera proporcionara un marco de trabajo de nivel medio-alto que ayudara al personal docente e investigador a desarrollar nuevas formas de interactuar con los ordenadores. Este anuncio tuvo lugar en la apertura del IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR). Haba nacido The Open Computer Vision Library [5] y lo haca bajo licencia BSD (Software Libre).

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-4-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

La librera OpenCV es una API de aproximadamente 300 funciones escritas en lenguaje C que se caracterizan por lo siguiente: Su uso es libre tanto para su uso comercial como no comercial (ver licencias en [2], [3] y [4] para ms informacin). No utiliza libreras numricas externas, aunque puede hacer uso de alguna de ellas, si estn disponibles, en tiempo de ejecucin. Es compatible con The Intel Processing Library (IPL) y utiliza The Intel Integrated Performance Primitives (IPP) para mejorar su rendimiento, si estn disponibles en el sistema. Dispone de interfaces para algunos otros lenguajes y entornos: EiC - intrprete ANSI C escrito por Ed Breen. Hawk y CvEnv son entornos interactivos (escrito s en MFC y TCL, respectivamente) que utilizan el intrprete EiC; Ch - intrprete ANSI C/C++ creado y soportado por la compaa SoftIntegration; Matlab - gran entorno para el clculo numrico y simblico creado por Mathworks; y muchos ms. La librera OpenCV esta dirigida fundamentalmente a la visin por computador en tiempo real. Entre sus muchas reas de aplicacin desacaran: interaccin hombre-mquina (HCI4); t segmentacin y reconocimiento de objetos; reconocimiento de gestos; seguimiento del movimiento; estructura del movimiento (SFM5); y robots mviles. Las herramientas de alto nivel hacen uso de un paquete de clases C++ y funciones C de alto nivel que utilizan a su vez funciones muy eficientes escritas en C. Concretamente, el conjunto de funciones suministradas por la librera OpenCV se agrupan en los siguientes bloques: Estructuras6 y operaciones bsicas: matrices, grafos, rboles, etc. Procesamiento y anlisis de imgenes: filtros, momentos, histogramas, etc. Anlisis estructural: geometra, procesamiento del contorno, etc. Anlisis del movimiento y seguimiento de objetos: plantillas de movimiento, seguidores (i.e. Lucas-Kanade), flujo ptico, etc. Reconocimiento de objetos: objetos propios (eigen objects), modelos HMM, etc. Calibracin de la cmara: morphing, geometra epipolar, estimacin de la pose (i.e. POSIT), etc. Reconstruccin tridimensional (funcionalidad experimental): deteccin de objetos, seguimiento de objetos tridimensionales, etc. Interfaces grficos de usuarios y adquisicin de video. 2.2 INTERFACES GRAFICOS Y HERRAMIENTAS DE OpenCV La librera OpenCV proporciona varios paquetes de alto nivel para el desarrollo de aplicaciones de visin. Todos ellos se pueden agrupar en libreras de C/C++ dirigidas a usuarios avanzados y en herramientas de scripting dirigidas, en este caso, a usuarios de nivel medio (ideal para practicar con las distintas tcnicas de procesamiento de imgenes y visin). Al primer grupo pertenecen HighGUI y CvCam, mientras que al segundo pertenecen Hawk y OpenCV Toolbox para Matlab. HighGUI permite la escritura/lectura de imgenes en numerosos formatos (BMP, JPEG, TIFF, PxM, Sun Raster, etc.) y la captura de stream de video de capturadoras Matro x y cmaras/capturadoras con drivers VFW/WDM (la mayora del mercado); la creacin de ventanas para visualizar imgenes en ellas.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-5-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

INSTALACION Y CONFIGURACION DE LIBRERIAS IPL y OpenCV son dos libreras de procesamiento de imagen, desarrolladas por Intel (o bajo el patrocinio de Intel). Estn optimizadas para sus procesadores, aunque tambin son muy rpidas en otros procesadores. IPL (Intel Image Processing Library) est orientada al procesamiento de imgenes a bajo nivel. Su desarrollo fue abandonado en el 2000, ao en que f e sustituida por IPP (Intel u Performance Primitives), algo ms eficientes y que incluyen otras aplicaciones (como, por ejemplo, sonido, criptografa y vdeo), pero son ms difciles de manejar y no gratuitas (a diferencia de IPL). Por esta razn usaremos IPL. Pgina web de IPP: OpenCV (Intel Open Source Computer Vision Library) es una librera que contiene un conjunto de utilidades de pr ocesamiento de imgenes, visin artificial, captura de vdeo y visualizacin de imgenes. Es de cdigo abierto, gratuita (tanto para uso comercial como no comercial), multiplataforma, rpida, de fcil uso y en continuo desarrollo. Pgina web de OpenCV: Usaremos IPL 2.5 y OpenCV beta 5. INSTALACIN DE IPL 2.5 1. Descargar IPL 2.5: 2. Ejecutar el programa instalador (ipl25.exe). 3. Observar las entradas incluidas en el men de inicio y la estructura de directorios creada: C:\Archivos de Programa\Intel\plsuite bin Archivos DLL (Dynamic Link Library), libreras enlazadas en tiempo de ejecucin, necesarias para ejecutar funciones de IPL. doc Documentacin, manual y gua de referencia. examples ipledit (aplicacin sencilla de procesamiento de imgenes), tutorial.ipl (tutorial de uso la librera), video (algunos ejemplos de efectos de transicin). include Ficheros de cabecera de librera, para incluir en los programas C. lib Ficheros de descripcin de las libreras. Existe uno por cada archivo DLL. Los necesita el compilador para conocer las funciones disponibles en la DLL. INSTALACIN DE OpenCV beta 5 1. Descargar OpenCV b5: 2. Normalmente usaremos OpenCV, que ofrece un acceso transparente a muchas operaciones de IPL. Slo para las no incluidas en OpenCV usaremos IPL. 3. Ejecutar el instalador (OpenCV5.exe). Instalar las libreras en: C:\Archivos de Programa\OpenCV5 4. Observar las entradas incluidas en el men de inicio y la estructura de directorios creada: C:\Archivos de Programa\OpenCV5 bin Archivos DLL (Dynamic Link Library), y algunos ejecutables de prueba, test e informacin de las libreras. cxcore Cdigo de fuente del ncleo de la librera, operaciones de bajo nivel sobre arrays, matrices e imgenes. include Ficheros de cabecera, para incluir en los programas C. El principal es: cxcore.h src Cdigo fuente de la librera, necesario para recompilar.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-6-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

cv Cdigo de fuente de la librera, operaciones de procesamiento de imgenes y visin artificial. Tambin tiene un directorio include (para los ficheros de cabecera, siendo el principal cv.h) y src (para el cdigo fuente). cvaux Librera de funcionalidades avanzadas, en algunos casos en estado experimental, ms relacionadas con visin artificial que con procesamiento de imagen. Tambin tiene un directorio include (para los ficheros de cabecera, como cvaux.h) y src (para el cdigo fuente). otherlibs Otras libreras relacionadas con la entrada salida. highgui Libreras para crear ventanas, leer y escribir imgenes (formatos BMP, JPEG, PNG y TIF), archivos de vdeo (formato AVI) y captura de cmara (usando el interface Video for Windows). Usaremos la modificacin highgui2. docs Documentacin de las libreras. La mayor parte de la documentacin est en formato HTML (fichero index.html). lib Ficheros de descripcin de las libreras. Cuidado, slo estn para Visual C++. 5. Instalar HighGUI2. y descomprimir (marcando la opcin Use folder names) en: C:\Archivos de Programa\OpenCV5 Ver las novedades de HighGUI2 (respecto de HighGUI): otherlibs/HIGHGUI2.txt CXCORE Reference Manual operaciones bsicas, aritmticas y de dibujo CV Reference Manual filtros, geomtricas y anlisis de imgenes Procesamiento Audiovisual HighGUI Reference Manual entrada/salida de imgenes y vdeo CVCAM Reference Manual (RTF) irrelevante USO DE LAS LIBRERAS CON DEVCPP 4.0 1. La utilizacin de las libreras IPL y OpenCV permite aprovechar la potencia de las primeras para el procesamiento eficiente de imgenes y vdeo, y la facilidad de la segunda para el desarrollo rpido de aplicaciones interactivas en entornos Windows. 2. El cdigo de las libreras se encuentra en ficheros DLL (Dynamic Link Library), como ipl.dll, cxcore097.dll, cv097.dll y highgui0972.dll. Los ficheros DLL contienen cdigo objeto (cdigo ejecutable) que se enlaza de forma dinmica con la aplicacin. Por lo tanto, nuestros programas usan estas libreras, pero no las incluyen en su cdigo. Los ficheros DLL deben estar accesibles, o bien en el mismo directorio del programa o en el PATH del sistema. 3. Una vez abierto devcpp dirigirse a la solapa Herramientas + Opciones del Compilador

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-7-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

En la solapa Compilador aadir a la lnea de comandos del Linker como se muestra:

En la solapa Directorios y dentro de ella Binario:

En la solapa Directorios y dentro de ella Bibliotecas:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-8-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

En la solapa Directorios y dentro de ella Includes C:

En la solapa Directorios y dentro de ella Includes C++:

En la solapa Programas:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

-9-

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Verificar adems que la carpeta Bin este aadida al Path del sistema:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 10 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

IMAGEN DIGITAL Es una matriz, o array bi-dimensional, de nmeros. Cada celda de la matriz es un pxel.

NOMENCLATURA N de columnas de la matriz: ancho de la imagen (width). N de filas de la matriz: alto de la imagen (height). Eje horizontal: eje x. Eje vertical: eje y. Normalmente el tamao de la imagen se expresa como: ancho x alto Supondremos un acceso indexado a los pxeles si i es una imagen, i(x, y) ser el valor del pxel en la columna x, fila y. Ejemplo. Tamaos tpicos: 320x240, 640x480, 800x600, 1024x768, ... VALOR DE UN PIXEL Cada pxel representa el valor de una magnitud fsica. Cantidad de luz en un punto de una escena. Valor de color (cantidad de radiacin en la frecuencia del rojo, verde y azul). Nivel de radiacin infrarroja, rayos X, etc. En general, cualquier radiacin electromagntica. Profundidad (distancia) de una escena en una direccin. Cantidad de presin ejercida en un punto. Nivel de absorcin de determinada radiacin. Etctera, etctera. TIPOS DE DATOS DE CADA MATRIZ Imagen binaria: 1 pxel = 1 bit 0 = negro; 1= blanco Imagen en escala de grises: 1 pxel = 1 byte Permite 256 niveles de gris 0 = negro; 255 = blanco Imagen en color: 1 pxel = 3 bytes Cada pxel consta de 3 valores: 19/11/2007 - 11 -

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

(Rojo, Verde, Azul) Un byte por color 16,7 millones de colores posible. Profundidad de color (depth). Un nivel de gris, o un color, se puede representar con ms o menos bits:

2 bits por pxel

3 bits por pxel

4 bits por pxel

Hi-color: mtodo reducido para representar colores 1 pxel = 2 bytes 5 bits por cada color (Rojo, Verde, Azul) Imgenes multicanal: Cuando los pxeles representan magnitudes en distintos dominios fsicos, decimos que la imagen es multicanal. Ejemplo. Imagen en color Imagen con 3 canales: canal R (rojo), canal G (verde), canal B (azul).

Canal R

Canal G

Canal B

Ejemplo. RGBA Imagen RGB ms canal Alfa. El canal Alfa representa el nivel de transparencia del pxel. RESUMEN Parmetros de una imagen digital: Ancho y alto. Nmero de canales y significado de cada uno. Nmero de bits por pxel y canal (depth). Origen de coordenadas y modo de almacenamiento multicanal. Resolucin espacial: tamao de la imagen. Resolucin fotomtrica: profundidad de color. Resolucin temporal: aplicable en vdeos.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 12 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

CAPTURA Y DIGITALIZACION

Seal analgica

Seal digital

Escena

Cmara

Digitalizador

Ordenador

Seal analgica: seal de vdeo, foto impresa, diapositiva, etc. Digitalizadores: digitalizador de vdeo, escner, etc. Actualmente, la distincin es cada vez ms difusa. Captura y digitalizacin van incorporadas en los mismos dispositivos (cmaras y escneres). CARACTERISTICAS DE UN DIGITALIZADOR: Tamao de imagen. Ancho y alto de las imgenes tomadas. Depende del nmero de pxeles de fotodetector. En cmaras fotogrficas se mide en megapxeles. Por ejemplo, resolucin mxima: 2048x1536 3,34 megapxeles. En cmaras de vdeo es mucho menor. No suele pasar de 800x600 0,48 megapxeles. Tamao del pxel. Determina la densidad de pxeles. Es ms relevante, por ejemplo, en escneres. Propiedad fsica medida. Luz, infrarrojo, ultravioleta, etc. Linealidad. El nivel de gris debera ser proporcional al brillo de la imagen. Tb. es importante el nmero de niveles de gris. Nivel de ruido. Ante una escena de color uniforme todos los pxeles deberan ser iguales. Pero nunca lo son. El ruido se mide en relacin al nivel de contraste en la imagen. TIPOS DE CAPTURA DE DIGITALIZADOR Existen muchos tipos, segn el tipo de iluminacin, sensores y mecanismo de escaneado de la imagen. Entre ellos: CCD: Charge-Coupled Devices. Se han impuesto en muchos mbitos: fotografa digital, vdeo digital, cmaras de TV, astronoma, microscopa, escneres, etc. Utilizan sensores de silicio. El CCD es un chip que integra una matriz de fotodetectores. Esquema de una celda del CCD (o pxel). El CCD est construido en un semiconductor de silicio. Cuando llega un fotn, el semiconductor libera electrones. Cada celda es un pozo, que acumula los electrones que han saltado (similar a un condensador). El n de electrones es proporcional a la intensidad de luz. 19/11/2007 - 13 -

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

El detector es independiente del color Se usa un filtro de color (microfiltro). Distribucin tpica de los filtros de color en el CCD (patrn de Bayer).

Existen el doble de detectores de verde que de rojo y de azul. Razn: el ojo humano es mucho ms sensible al verde que a los otros colores. Cada fotodetector es un pxel. Los colores no presentes se interpolan usando los 2 4 pxeles vecinos de ese color. LECTURA DEL VALOR DE LOS PIXELES Hay un desplazamiento de la carga de los pozos, hasta salir por un extremo.

Esto es el llamado full frame CCD. Por sus buenas caractersticas, los CCD son muy usados en muchos mbitos. Pero tambin tienen sus limitaciones: Corriente oscura (dark current): los electrones saltan al llegar un fotn, pero tambin pueden hacerlo por el calor. Campo de estrellas: las imperfecciones provocan algunos pxeles con alta corriente oscura. Aunque no llegue luz, aparecen iluminados. Mayor cuanto peor es la cmara.
0 5 W F D Y N O S O R P M A C K I U Q

Ruido fotnico: debido a la naturaleza cuntica de la luz. Es mayor con escasa iluminacin.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 14 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Rebosamiento (blooming): cuando un pozo se llena de electrones, se desparrama su contenido a los pxeles cercanos.

CMOS: Complementary Metal-Oxide-Semiconductor. Tambin basados en semiconductores de silicio. Diferencia con CCD: cada pxel incorpora su propia circuitera, se pueden leer y seleccionar independientemente (sin necesidad de desplazamientos).

Ventajas: suelen ser ms rpidos, tienen mejor integracin (necesitan menos circuitera) y disminuyen el blooming. Inconvenientes: hay menos espacio de captura en el chip (menos luz), son menos uniformes (hay ms ruido) y necesitan bfferes. Las cmaras fotogrficas digitales suelen usar CCD. Las cmaras de videoconferencia suelen usar CMOS, aunque las de ms calidad usan CCD. Las diferencias entre unas y otras son cada vez menores.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 15 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

EUCC-961 300K INFRARED

CMOS sensor 300K pxeles Resolucin:640x480 pxeles Infrared Lente de vidrio USB Plug and Play Micrfono (opcional) Alta-precisin en lente de vidrio: f=4.4 / 4.4 / 6.0mm ngulo de visin: 61 / 88 / 50 Formato de video: RGB, AVI. Balance automtico de blancos Windows 98/98SE/XP/ME/2000 COMPROBACION DE LAS CARACTERISTICAS DE LA CAMARA WEB Se realizo la comprobacin mediante el software NERO

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 16 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

La

siguiente rutina es la utilizada para mostrar la imagen que captura la cmara: "cv.h" "highgui.h" <stdio.h> <ctype.h>

#include #include #include #include

main() { CvCapture* capture = 0; capture = cvCaptureFromCAM(-1); if( !capture ) { fprintf(stderr,"No se puede inicializar la captura...\n"); return -1; } cvNamedWindow( "Imagen", 0 ); for(;;) { IplImage* frame = 0; int g; frame = cvQueryFrame( capture ); if( !frame ) break; cvShowImage( "Imagen", frame ); g = cvWaitKey(10); } cvReleaseCapture( &capture ); cvDestroyWindow("Que capo"); }

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 17 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

TIPOS DE DATOS EN IPL Y OPENCV TIPOS DE DATOS AUXILIARES CvPoint: coordenadas de un punto (un pxel) en una imagen. La numeracin de filas y columnas empieza en 0. typedef struct CvPoint { int x; int y; } CvPoint; CvSize: tamao de una regin rectangular, en pxeles. typedef struct CvSize { int width; // Anchura int height; // Altura } CvSize; CvRect: rectngulo en la imagen, dado por el pxel superior izquierdo, anchura y altura. typedef struct CvRect { int x; int y; int width; // Anchura int height; // Altura } CvRect; CvScalar: escalar o valor de un pxel, que puede contener 1, 2, 3 4 nmeros (segn el nmero de canales). typedef struct CvScalar { double val[4]; } CvScalar;

En las funciones para dibujar (puntos, lneas, crculos, elipses, etc.) el color se representa mediante un CvScalar, que almacena los canales RGB.

EL TIPO IPLIMAGE: El tipo de datos para representar imgenes es el tipo IplImage, tanto en IPL como en OpenCV. Las imgenes se guardan descomprimidas, como una matriz de pxeles Principales propiedades de una imagen: Tamao (size): anchura (width) y altura (height). Profundidad de pxeles (depth): enteros de 8, 16 y 32 bits, reales de 32 y 64 bits. Nmero de canales (nChannels): 1, 2, 3 4. Origen de coordenadas (origin): top-left, bottom-left; y orden de los canales (dataOrder): entrelazado de pxeles (0) o por canales (1). Las variables manejadas sern punteros a IplImage.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 18 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

DEFINICION DEL TIPO IPLIMAGE. Observar que algunos campos no se usan en OpenCV (slo se usan en IPL). typedef struct _IplImage { int nSize; /* sizeof(IplImage) */ int ID; /* version (=0)*/ int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */ int alphaChannel; /* ignored by OpenCV */ int depth; /* pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported */ char colorModel[4]; /* ignored by OpenCV */ char channelSeq[4]; /* ditto */ int dataOrder; /* 0 - interleaved color channels, 1 - separate color channels. cvCreateImage can only create interleaved images */ int origin; /* 0 - topleft origin, 1 - bottom-left origin (Windows bitmaps style) */ int align; /* Alignment of image rows (4 or 8). OpenCV ignores it and uses widthStep instead */ int width; /* image width in pixels */ int height; /* image height in pixels */ struct _IplROI *roi; /* image ROI. when it is not NULL, this specifies image region to process */ struct _IplImage *maskROI; /* must be NULL in OpenCV */ void *imageId; /* ditto */ struct _IplTileInfo *tileInfo; /* ditto */ int imageSize; /* image data size in bytes (=image->height* image->widthStep) in case of interleaved data)*/ char *imageData; /* pointer to aligned image data */ int widthStep; /* size of aligned image row in bytes */ int BorderMode[4]; /* border completion mode, ignored by OpenCV */ int BorderConst[4]; /* ditto */ char *imageDataOrigin; /* pointer to a very origin of image data (not necessarily aligned) it is needed for correct image deallocation */ } IplImage; CREACION DE UNA IMAGEN: IplImage* cvCreateImage(CvSize size, int depth, int channels) size: tamao de la imagen depth: profundidad de pxel: IPL_DEPTH_8U - unsigned 8-bit integers IPL_DEPTH_8S - signed 8-bit integers IPL_DEPTH_16S - signed 16-bit integers IPL_DEPTH_32S - signed 32-bit integers IPL_DEPTH_32F - single precision floating-point numbers IPL_DEPTH_64F - double precision floating-point numbers channels: nmero de canales: 1, 2, 3 4 Implcitamente, el origen es top-left y el orden es entrelazado. Con imgenes RGB el orden es: b0, g0, r0, b1, g1, r1, .

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 19 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

REPRESENTACION DEL MOVIMIENTO La primer figura muestra el movimiento de una persona u objeto. Para obtener una silueta clara se usa la tcnica de substraccin de fondo descritas en la seccin sustraccin de fondo (Background Subtraction). Cuando los objetos se mueven se copia el mayor margen de movimiento de la silueta tomando los mayores gradientes de movimiento de la imagen. Generalmente este valor es un punto flotante llamado timestamp que tiene el tiempo desde que empez el movimiento en milisegundos. La otra figura muestra el resultado que es llamado historia de movimiento de imagen MHI. Un valor de pxel o el tiempo delta del threshold, como sea ms apropiado, es seteado a 0cuando un pxel en la MHI cambia y crece siguiendo el movimiento.

El movimiento ms reciente tiene el valor ms alto y los movimientos ms cercanos van decreciendo a medida que nos acercamos al ltimo valor que es 0. A continuacin se describen los procedimientos: ACTUIALIZANDO LAS IMGENES DE MHI: Generalmente estas imgenes se utilizan porque tienen diferencias de tiempo, como puede ser el tiempo transcurrido desde que la aplicacin se ejecut que es leda en mseg. para ser convertida luego en un valor numrico float que es el valor de la silueta ms reciente. Luego sigue escribiendo esta silueta sobre las pasadas siluetas con una umbralizacin subsecuente con los pxeles viejos para crear la MHI.

UpdateMotionHistory
Updates motion history image by moving silhouette

void cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi, double timestamp, double duration );
silhouette

Silhouette mask que tiene pixel distinto de cero donde el movimiento ocurre.
mhi

Motion history image, que es actualizada por la funcin (single-channel, 32-bit floating-point)
timestamp

Tiempo actual en milisegundos u otra unidad.


duration

Mxima duracin de la secuencia de movimiento en la misma unidad que timestamp. La funcin cvUpdateMotionHistory actualiza motion history image como sigue: mhi(x,y)=timestamp if silhouette(x,y)!=0 0 if silhouette(x,y)=0 and mhi(x,y)<timestamp-duracin mhi(x,y) de otra forma

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 20 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Esto es, los pixel de MHI donde el movimiento ocurre son llenados con el tiempo corriente timestamp, mientras que los pixel de MHI donde el movimiento no ocurre por tiempo atrs son borrados.

CREANDO EL GRADIENTE DE MOVIMIENTO: 1. Comienza con la MHI mostrada en la figura 2.2. 2. Se le aplica el algoritmo de Sobel al 3x3 con los operndoos X, Y. 3. Si el resultado responde a la localizacin del pxel x, y es Sx (x,y) para el operando Sobel x y Sy (x,y) para el y, despus la orientacin del gradiente se calcula como A(x,y)=arctg Sy/Sx. La magnitud es M(x,y)=Sx + Sy. 4. Las ecuaciones se aplican a la imagen dndole una direccin o un ngulo sobre una imagen superpuesta a la MHI como se muestra en la figura 2.2.
Figura 2.2

5. La frontera de la regin MH puede contener movimientos incorrectos como muestra la figura 2.2, umbral izando fuera las magnitudes que son muy largas o muy pequeas se puede corregir esto; Fig. 2.3.
Figura 2.3

CalcMotionGradient

Calcula la orientacin del gradiente de motion history image

void cvCalcMotionGradient( const CvArr* mhi, CvArr* mask, CvArr* orientation, double delta1, double delta2, int aperture_size=3 );
mhi

Motion history image.


mask

Mask imagen; marca pxeles donde los datos del gradiente del movimiento son correctos. Parmetro de salida.
orientation

imagen orientacin del gradiente de movimiento; contiene ngulos desde 0 a ~360.


delta1, delta2

la funcin busca mnimo (m(x,y)) y mximo (M(x,y)) mhi valores sobre cada vecindad del pixel (x,y) y asume que el gradiente es valido solo si min(delta1,delta2) <= M(x,y)-m(x,y) <= max(delta1,delta2).
aperture_size

Orden del operador derivada usados por la funcin: CV_SCHARR, 1, 3, 5 or 7 (ver cvSobel). La funcin cvCalcMotionGradient calcula la derivada Dx y Dy de mhi y luego calcula el gradiente de orientacin como: orientation(x,y)=arctan(Dy(x,y)/Dx(x,y))

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 21 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

where both Dx(x,y)' and Dy(x,y)' signs are taken into account (as in cvCartToPolar function). After that mask is filled to indicate where the orientation is valid (see delta1 and delta2 description).

ENCONTRANDO LA ORIENTACION DE UNA REGION: La fig. 2.4 muestra la salida de la funcin gradiente del movimiento, descripta anteriormente, con la direccin de flujo de l movimiento. La silueta actual est en azul brillante mientras que en los otros movimientos se muestra ms tenue, las lneas rojas muestran donde fueron encontrados los gradientes vlidos del movimiento, y la lnea blanca muestra la direccin global del movimiento. Para determinar el movimiento ms reciente se realiza lo sig: 1. Se calcula el histograma de los movimientos resultantes del proceso; fig. 2.3. 2. Encontrar la direccin de una funcin circular ; ngulo en grados: a) Se encuentra el mximo pico de orientacin del histograma. b) Se encuentran las mnimas diferencias con respecto a este ngulo base. Los movimientos ms recientes son tomados con mayores tamaos.

CalcGlobalOrientation
Calculates global motion orientation of some selected region

double cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* mask, const CvArr* mhi, double timestamp, double duration );
orientation

Motion gradient orientation image; calculada por la funcion cvCalcMotionGradient.


mask

Mask image. Debe ser un conjunto de validas gradient mask, obtenida con cvCalcMotionGradient y mask de la regin, en la cual la direccin necesita ser calculada
mhi

Motion history image.


timestamp

Tiempo actual en milisegundos o otra unidad, es mejor almacenar tiempo pasado antes de cvUpdateMotionHistory y usar esto a.C., porque ejecutando cvUpdateMotionHistory y cvCalcMotionGradient sobre gran imagen puede tomar tiempo.
duration

Mxima duracin de la secuencia de movimiento en milisegundos, el mismo como en cvUpdateMotionHistory. La funcin cvCalcGlobalOrientation calcula la direccin general del movimiento en la regin seleccionada y devuelve un Angulo entre 0 y 360. At first the function builds the orientation histogram and finds the basic orientation as a coordinate of the histogram maximum. After that the function calculates the shift relative to the basic orientation as a weighted sum of all orientation vectors: the more recent is the motion, the greater is the weight. The resultant angle is a circular sum of the basic orientation and the shift.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 22 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

SUBTRACCION DE FONDO: Esta seccin describe las funciones bsicas para hacer un modelo de substraccin de fondo (Background) para un modelo esttico. En este capitulo el trmino Background est dado por el seteo de los pxeles de imgenes que casi no tienen movimiento que son pxeles que no pertenecen a ningn objeto movindose frente a la cmara. Esta definicin puede variar si se consideran otras tcnicas para extracciones de objetos. Por ejemplo: si el fondo de la escena puede ser determinado por partes de la escena que estn bastante lejos de la cmara. El modelo ms simple de Background supone q los pxeles de brillo del f ndo vara ue o independientemente de acuerdo a una distribucin normal. Las caractersticas del fondo pueden ser calculadas almacenando algunas docenas de cuadros as como ellos tengan. Que significa encontrar una suma de valores de los pxeles en el lugar S(x,y) de los distintos cuadros (frames) y una suma de los valores Sq(x, y) para la ubicacin de cada pxel. El resultado calculado es: m(x, y)=S(x, y) / n n es el nmero de cuadros (frames). La desviacin estndar se calcula como: r(x, y) = sqrt(sq(x, y)/n)-(S(x, y)/n)^2) Luego que el pxel en una cierta ubicacin de pxel en un cierto cuadro (frame) es apreciado como condicin del movimiento del objeto si la condicin es conocida donde C es una constante. Si C=3 esto es conocido como la regla de las 3 sigmas. Para obtener el modelo de Background cualquier objeto debe ser alejado de la cmara por unos cuantos segundos para que la cmara tome la imagen del fondo. La tcnica de abajo puede ser aprovechada, pero es razonable proponer una adaptacin a un fondo para cambiar las condiciones de luz y las escenas del fondo como por ej. Cuando la cmara se mueve o algn objeto pasa delante del objeto que est enfrente de la cmara. La simple acumulacin para calcular este brillo puede ser reemplazado con las ordenes cvAbsDiff , cvthrehold y otras. Las funciones estas pueden hacer una diferencia aproximada del fondo pero no eliminarlo del todo. UMBRALIZACION: Esta seccin describe la umbralizacin por funciones de grupo, las funciones de umbralizacin se usan para 2 propsitos: 1. Sacar algunos pxeles que no pertenecen a cierto rango como por ejemplo extraer burbujas o cierto brillo o color de la imagen. 2. Convertir a la escala de grises o a un doble nivel blanco y negro. Usualmente la imagen resultante es usada como una mscara o una fuente para extraer los mayores niveles de informacin de una imagen como por ejemplo contorno(Active contours), esqueleto (Distance transform), lneas (Hough Transforms), etc. Generalmente la umbralizacin es una funcin de determinante en imgenes: A(P(x, y), F(x, y),P(x, y))= true B(P(x, y), F(x, y),P(x, y))= false La funcin nombrada F(x, y),P(x, y) es representada como g(x, y) < P(x, y) < h(x, y) donde g y h son funcin de los valores de los pxeles y generalmente son valores constantes. Hay 2 tipos bsicos de operaciones de umbralizamiento. El primero es una funcin predeterminada independiente de la localizacin que es g(x, y) y h(x, y) que son constantes de la imagen. Sin embargo para una imagen ms concreta el valor de la constante puede calcularse con un histograma de imgenes (histograms) o criterio esttico (image statics) T(x, y)

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 23 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

El segundo tipo de funcin elige g(x) y h(x) dependiendo del pxel de al lado para extraer regiones variando el contraste y el brillo las funciones descriptas en este captulo implementan estas aproximaciones: Soportan un solo canal de imagen IPL_DEPTH_8U, IPL_DEPTH_8S o IPL_DEPTH_32F.

AbsDiff
Calcula la diferencia absoluta entre dos arrays

void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst ); src1

Primer array fuente.


src2

Segundo array fuente.


dst

Array de destino.
dst(I)c = abs(src1(I)c - src2(I)c).

Todos los array deben tener el mismo tamao y tipo de datos.

Threshold
Applies fixed-level threshold to array elements

void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); src

Array fuente (single-channel, 8-bit of 32-bit floating point).


dst

Array Destino; debe ser del mismo tipo de src or 8-bit.


threshold

Valor Threshold.
max_value

Valor maximo para usar con tipos CV_THRESH_BINARY y CV_THRESH_BINARY_INV.


threshold_type

Tipo de Thresholding (ver la discusion) La funcion cvThreshold applies fixed-level thresholding to single-channel array. The function is typically used to get bi-level (binary) image out of grayscale image (cvCmpS could be also used for this purpose) or for removing a noise, i.e. filtering out pixels with too small or too large values. There are several types of thresholding the function supports that are determined by
threshold_type: threshold_type=CV_THRESH_BINARY: dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise threshold_type=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>threshold max_value, otherwise threshold_type=CV_THRESH_TRUNC: dst(x,y) = threshold, if src(x,y)>threshold src(x,y), otherwise threshold_type=CV_THRESH_TOZERO: dst(x,y) = src(x,y), if src(x,y)>threshold 0, otherwise threshold_type=CV_THRESH_TOZERO_INV: dst(x,y) = 0, if src(x,y)>threshold

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 24 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

src(x,y), otherwise

Motion Representation
Figure 2-1 (left) shows capturing a foreground silhouette of the moving object or person. Obtaining a clear silhouette is achieved through application of some of background subtraction techniques briefly described in the section on Background Subtraction. As the person or object moves, copying the most recent foreground silhouette as the highest values in the motion history image creates a layered history of the resulting motion; typically this highest value is just a floating point timestamp of time elapsing since the application was launched in milliseconds. Figure 2-1 (right) shows the result that is called the Motion History Image (MHI). A pixel level or a time delta threshold, as appropriate, is set such that pixel values in the MHI image that fall below that threshold are set to zero.

The most recent motion has the highest value, earlier motions have decreasing values subject to a threshold below which the value is set to zero. Different stages of creating and processing motion templates are described below. A) Updating MHI Images Generally, floating point images are used because system time differences, that is, time elapsing since the application was launched, are read in milliseconds to be further converted into a floating point number which is the value of the most recent silhouette. Then follows writing this current silhouette over the past silhouettes with subsequent thresholding away pixels that are too old (beyond a maximum mhiDuration) to create the MHI.

UpdateMotionHistory Updates motion history image by moving silhouette


void cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi, double timestamp, double duration );
silhouette

Silhouette mask that has non-zero pixels where the motion occurs.
mhi

Motion history image, that is updated by the function (single-channel, 32bit floating-point)
timestamp

Current time in milliseconds or other units.


duration

Maximal duration of motion track in the same units as timestamp. The function cvUpdateMotionHistory updates the motion history image as following: mhi(x,y)=timestamp 0 mhi(x,y) if silhouette(x,y)!=0 if silhouette(x,y)=0 and mhi(x,y)<timestamp-duration otherwise

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 25 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

That is, MHI pixels where motion occurs are set to the current timestamp, while the pixels where motion happened far ago are cleared.

B) Making Motion Gradient Image 1. Start with the MHI image as shown in Figure 2-2(left). 2. Apply 3x3 Sobel operators X and Y to the image. 3. If the resulting response at a pixel location (X,Y) is Sxxy to the Sobeloperator operator Y, then the orientation of the gradient iscalculated as:
Axy= arctanSyxySxxy

and

Syxy

to the

and the magnitude of the gradient is: . Mxy2=Sxxy2 +Syxy2 4. The equations are applied to the image yielding direction or angle of a flow image superimposed over the MHI image as shown in Figure 2-2.

5. The boundary pixels of the MH region may give incorrect motion angles and magnitudes, as Figure 22 shows. Thresholding away magnitudes that are either too large or too small can be a remedy in this case. Figure 2-3 shows the ultimate results.

CalcMotionGradient
Calculates gradient orientation of motion history image

void cvCalcMotionGradient( const CvArr* mhi, CvArr* mask, CvArr* orientation, double delta1, double delta2, int aperture_size=3 );
mhi

Motion history image.


mask

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 26 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Mask image; marks pixels where motion gradient data is correct. Output parameter.
orientation

Motion gradient orientation image; contains angles from 0 to ~360.


delta1, delta2

The function finds minimum (m(x,y)) and maximum (M(x,y)) mhi values over each pixel (x,y) neihborhood and assumes the gradient is valid only if min(delta1,delta2) <= M(x,y)-m(x,y) <= max(delta1,delta2).
aperture_size

Aperture size of derivative operators used by the function: CV_SCHARR, 1, 3, 5 or 7 (see cvSobel). The function cvCalcMotionGradient calculates the derivatives Dx and Dy of mhi and then calculates gradient orientation as: orientation(x,y)=arctan(Dy(x,y)/Dx(x,y)) where both Dx(x,y)' and Dy(x,y)' signs are taken into account (as in cvCartToPolar function). After that mask is filled to indicate where the orientation is valid (see delta1 and delta2 description).

C) Finding Regional Orientation or Normal Optical Flow


Figure 2-4 shows the output of the motion gradient function described in the section above together with the marked direction of motion flow.

The current silhouette is in bright blue with past motions in dimmer and dimmer blue. Red lines show where valid normal flow gradients were found. The white line shows computed direction of global motion weighted towards the most recent direction of motion. To determine the most recent, salient global motion: 1. Calculate a histogram of the motions resulting from processing (see Figure 2-3). 2. Find the average orientation of a circular function: angle in degrees. a. Find the maximal peak in the orientation histogram. b. Find the average of minimum differences from this base angle. The more recent movements are taken with lager weights.

CalcGlobalOrientationof some selected region Calculates global motion orientation


double cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* mask, const CvArr* mhi,

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 27 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

double timestamp, double duration );


orientation

Motion gradient orientation image; calculated by the function cvCalcMotionGradient.


mask

Mask image. It may be a conjunction of valid gradient mask, obtained with cvCalcMotionGradient and mask of the region, whose direction needs to be calculated.
mhi

Motion history image.


timestamp

Current time in milliseconds or other units, it is better to store time passed to cvUpdateMotionHistory before and reuse it here, because running cvUpdateMotionHistory and cvCalcMotionGradient on large images may take some time.
duration

Maximal duration of motion track in milliseconds, the same as in cvUpdateMotionHistory. The function cvCalcGlobalOrientation calculates the general motion direction in the selected region and returns the angle between 0 and 360. At first the function builds the orientation histogram and finds the basic orientation as a coordinate of the histogram maximum. After that the function calculates the shift relative to the basic orientation as a weighted sum of all orientation vectors: the more recent is the motion, the greater is the weight. The resultant angle is a circular sum of the basic orientation and the shift.

Background Subtraction
This section describes basic functions that enable building statistical model of background for its further subtraction. In this chapter the term "background" stands for a set of motionless image pixels, that is, pixels that do not belong to any object, moving in front of the camera. This definition can vary if considered in other techniques of object extraction. For example, if a depth map of the scene is obtained, background can be determined as parts of scene that are located far enough from the camera. The simplest background model assumes that every background pixel brightness varies independently, according to normal distribution.The background characteristics can be calculated by accumulating several dozens of frames, as well as their squares. That means finding a sum of pixel values in the location S(x,y) and a sum of squares of the values Sq(x,y) for every pixel location. Then mean is calculated as , where N is the number of the frames collected, and standard deviation as .

After that the pixel in a certain pixel location in certain frame is regarded as belonging to a moving object if condition is met, where C is a certain constant. If C is equal to 3, it is the well-known "three sigmas" rule. To obtain that background model, any objects should be put away from the camera for a few seconds, so that a whole image from the camera represents subsequent background observation. The above technique can be improved. First, it is reasonable to provide adaptation of background differencing model to changes of lighting conditions and background scenes, e.g., when the camera moves or some object is passing behind the front object. The simple accumulation in order to calculate mean brightness can be replaced with running average. Also, several techniques can be used to identify moving parts of the scene and exclude them in the course of background information accumulation. The techniques include change detection, e.g., via cvAbsDiff with cvThreshold, optical flow and, probably, others.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 28 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

The functions from the section (See Motion Analysis and Object Tracking Reference) are simply the basic functions for background information accumulation and they can not make up a complete background differencing module alone.

Thresholding
This section describes threshold functions group. Thresholding functions are used mainly for two purposes: masking out some pixels that do not belong to a certain range, for example, to extract blobs of certain brightness or color from the image; converting grayscale image to bi-level or black-and-white image. Usually, the resultant image is used as a mask or as a source for extracting higher-level topological information, e.g., contours (see Active Contours), skeletons (see Distance Transform), lines (see Hough Transform functions), etc. Generally, threshold is a determined function t(x,y) on the image:

The predicate function f(x,y,p(x,y)) is typically represented as g(x,y) < p(x,y) < h(x,y), where g and h are some functions of pixel value and in most cases they are simply constants. There are two basic types of thresholding operations. The first type uses a predicate function, independent from location, that is, g(x,y) and h(x,y)are constants over the image. However, for concrete image some optimal, in a sense, values for the constants can be calculated using image histograms (see Histogram) or other statistical criteria (see Image Statistics). The second type of the functions chooses g(x,y) and h(x,y)depending on the pixel neigborhood in order to extract regions of varying brightness and contrast. The functions, described in this chapter, implement both these approaches. They support single-channel images with depth IPL_DEPTH_8U, IPL_DEPTH_8S or IPL_DEPTH_32F and can work in-place.

Threshold

Applies fixed-level threshold to array elements

void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); src

Source array (single-channel, 8-bit of 32-bit floating point).


dst

Destination array; must be either the same type as src or 8-bit.


threshold

Threshold value.
max_value

Maximum value to use with CV_THRESH_BINARY and CV_THRESH_BINARY_INV thresholding types.


threshold_type

Thresholding type (see the discussion) The function cvThreshold applies fixed-level thresholding to single-channel array. The function is typically used to get bi-level (binary) image out of grayscale image (cvCmpS could be also used for this purpose) or for removing a noise, i.e. filtering out pixels with too small or too large values. There are several types of thresholding the function supports that are determined by threshold_type:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 29 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

threshold_type=CV_THRESH_BINARY: dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise threshold_type=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>threshold max_value, otherwise threshold_type=CV_THRESH_TRUNC: dst(x,y) = threshold, if src(x,y)>threshold src(x,y), otherwise threshold_type=CV_THRESH_TOZERO: dst(x,y) = src(x,y), if src(x,y)>threshold 0, otherwise threshold_type=CV_THRESH_TOZERO_INV: dst(x,y) = 0, if src(x,y)>threshold src(x,y), otherwise

And this is the visual description of thresholding types:

Umbralizacin/binarizacin de una imagen: void cvThreshold (const CvArr* src, CvArr* dst, double threshold, double maxValue, int thresholdType) Umbraliza la imagen segn el mtodo dado en thresholdType. y el umbral es threshold. P.ej., CV_THRESH_BINARY para binarizar: C(x,y):= si A(x,y) > threshold entonces maxValue sino 0 La umbralizacin se hace con un valor constante.

OPERACIONES LOCALES

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 30 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

La imagen se transforma en funcin de los niveles de gris de cada pxel considerado y de los de su entorno. A estas operaciones se las conoce comnmente como filtros. Se clasifican, a su vez, segn la funcin de transformacin, en: Lineales. La imagen resultante es la convolucin de una imagen inicial con una funcin local denominada mscara. Esta mscara puede ser de dimensin cual uiera y puede estar q centrada en cualquier pxel. En las siguientes fig uras se muestra el mecanismo d e convolucin de una imagen con una mscara de 3x3 centrada en el pxel de posicin central.

OPERADOR DE SOBEL.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 31 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Accin conjunta de las mscaras:

El filtro de Sobel permite calcular derivadas conjuntas en X e Y, derivadas segundas, terceras, etc. Realmente, en dos o ms dimensiones, en lugar de la derivada tiene ms sentido el concepto de gradiente. El gradiente indica la direccin de mxima variacin de una funcin (en 2D, la mxima pendiente).

VECTOR GRADIENTE. Se define el vector gradiente de una funcin f(x,y) como:

Magnitud

ngulo o argumento.

El gradiente en un punto es un vector (u, v): ngulo: direccin de mxima variacin. Magnitud: intensidad de la variacin.

El gradiente est relacionado con las derivadas: u = Derivada en X del punto Dx (por ejemplo, con un filtro de Sobel) v = Derivada en Y del punto Dy (por ejemplo, con un filtro de Sobel) VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 32 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 33 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

MOTORES PASO A PASO Introduccin: Se define un motor como aquella mquina elctrica rotativa que es capaz de transformar energa elctrica en energa mecnica. Los denominados motores paso a paso, son un caso bastante particular dentro de los motores en general. La seal elctrica de alimentacin no es ni c.c. ni c.a. como en otros casos, sino un tren de pulsos que se suceden con una secuencia, previamente definida, a cada una de las bobinas que componen el estator. Cada vez que a alguna de estas bobinas se les aplica un pulso, el motor se desplaza un paso, y queda fijo en esa posicin. Dependiendo de las caractersticas constructivas del motor este paso puede ser desde 90 hasta incluso 0,9. Por lo tanto, si somos capaces de mover el motor en pequeos pasos, esto nos va a permitir controlar su posicin, con mayor o menor precisin dependiendo del avance de cada paso. Adems, variando la frecuencia con la que se aplican los pulsos, tambin estaremos variando la velocidad con que se mueve el motor, lo que nos permite realizar un control de velocidad. Por ltimo si invertimos la secuencia de los pulsos de alimentacin aplicados a las bobinas, estaremos realizando una inversin en el sentido de giro del motor. Resumiendo, definimos el motor paso a paso, como aquel motor cuyas bobinas del estator son alimentadas mediante trenes de pulsos, con una determinada frecuencia, y que permite: Controlar posicin. Controlar velocidad. Controlar sentido de giro. Debido a las caractersticas anteriores se pueden encontrar motores paso a paso en robtica, control de discos duros, flexibles, unidades de CDROM o de DVD e impresoras, en sistemas informticos, manipulacin y posicionamiento de herramientas y piezas en general. Algn inconveniente de los motores PaP es que presentan una velocidad angular limitada. Dicha limitacin surge ya que para realizar un paso, el motor requiere un tiempo para alcanzar la posicin de equilibrio. Si dicho tiempo no se respeta (si la frecuencia de los pulsos es demasiado elevada) perderamos el control sobre l, es decir, se movera en forma de vaivn, no se movera, o incluso podra moverse en sentido contrario al deseado. TIPOS DE MOTORES PaP Desde el punto de vista constructivo existen tres tipos de motores PaP: 1. De imn permanente: es el tipo de motores PaP ms utilizado, sus caractersticas constructivas son las siguientes: El rotor est formado por un i n permanente, en forma de disco, y en cuya m superficie se encuentran mecanizados un determinado nmero de dientes. El estator tienen forma cilndrica, y en su interior se encuentran diversos bobinados, que al ser alimentados secuencialmente generan un campo magntico giratorio. Como resultado de las fuerzas de atraccin-repulsin, el rotor se orientar dentro de este campo magntico giratorio, lo que provocar su movimiento. La conmutacin en la alimentacin de las bobinas tiene que ser manejada por un controlador externamente.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 34 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

2. De reluctancia variable: El estator es similar al caso anterior. El rotor no es un imn permanente, sino que est formado por un ncleo de hierro dulce, e igualmente con dientes tallados a lo largo de su superficie. En este tipo de motor, al alimentar una de las bobinas del estator, se crea un campo magntico. En estas condiciones, el rotor se orienta hacia aquella posicin en la que la reluctancia que presenta el circuito es mnima. Esta posicin ser aquella en la que el entrehierro sea el ms pequeo posible. Al cambiar la alimentacin a otra de las bobinas, el punto de mnima reluctancia tambin cambia, con lo cual el rotor gira de nuevo.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 35 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Funcionamiento de un motor paso a paso de reluctancia variable

3. Hbridos: este tipo de motores son una mezcla de los dos anteriores. El rotor est formado por una serie de anillos de ac ero dulce que tienen en su superficie un n de dientes ligeramente distinto a los del estator. Dichos anillos estn montados sobre un eje que es un imn permanente. MOTORES PaP DE IMN PERMANENTE Nos centramos en este tipo de motores, ya que como se ha citado anteriormente son los ms utilizados. Los motores de imn permanente pueden ser clasificados en funcin del sentido de la intensidad que recorre los bobinados en dos grupos: 1. MOTORES PAP BIPOLARES: estn formados por dos bobinas, y la intensidad que circula por ellas invierte su sentido sucesivamente (de ah surge el nombre de bipolares). Se pueden reconocer externamente porque presentan cuatro conductores, uno para cada extremo de una bobina.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 36 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

2. MOTORES PAP UNIPOLARES: en este caso el estator est formado por dos bobinas con tomas intermedias, lo que equivale a cuatro bobinas. Las tomas intermedias de las dos bobinas pueden estar interconectadas en el interior o no. Externamente se apreciarn cinco conductores en el primer caso, y seis en el segundo. La forma de alimentar este motor consiste en poner a masa la toma centrar e ir aplicando segn una secuencia determinada pulsos de valor +V a un extremo de la bobina y al otro. De tal manera que la intensidad que circula por cada media bobina siempre lo hace en el mismo sentido, por eso se denominan unipolares.

PRINCIPIO FUNCIONAMIENTO El principio de funcionamiento de los motores PaP de imn permanente, como ya se ha citado anteriormente, est basado en las fuerzas de atraccin-repulsin que experimentan los cuerpos sometidos a un campo magntico. MOTOR BIPOLAR Si aplicamos intensidad a ambas bobinas, de la manera que indica en la figura A, el rotor girar hasta la posicin indicada en dicha figura. Si se invierte el sentido de la intensidad aplicada a la bobina de terminales AB, el campo magntico variar, y el rotor girar de nuevo orientndose ahora de la manera mostrada en la figura B. Se observa que el motor se ha desplazado un paso (90). Invirtiendo sucesivamente el sentido de la corriente en amba bobinas, obtendremos el giro s completo del motor, como se muestra en la siguiente figura:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 37 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

A continuacin se detalla la secuencia de excitacin para el funcionamiento de un motor bipolar en modo paso completo.

Paso 1 2 3 4

A +V -V -V +V

B -V +V +V +V

C +V +V -V -V

D -V -V +V +V

Como cada vez que se aplica un pulso distinto a la entrada del motor, ste gira un paso completo se dice que est funcionando en modo paso completo. En este caso el paso es de 90, demasiado grande para poder realizar ningn tipo de control. Para aumentar la resolucin, se tienen varias opciones. La ms sencilla de todas y que no necesita un cambio constructivo del motor, consiste en cambiar la secuencia de alimentacin. En modo de funcionamiento de paso completo, las bobinas nunca quedan sin alimentacin. Pues bien, si entre cada cambio en la tensin de alimentacin de una bobina, esta se deja sin alimentar, podemos conseguir una posicin del rotor interme dia entre dos pasos. A esta forma de funcionamiento se le denomina medio paso. Las distintas posiciones por las que pasa el rotor, as como las polaridades de las bobinas del estator, se pueden apreciar en las siguientes figuras:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 38 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 39 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

A continuacin se detalla la secuencia de excitacin para el funcionamiento de un motor bipolar en modo medio paso.

Paso 1 2 3 4

A +V 0 -V -V -V 0 +V +V

B -V 0 +V +V +V 0 -V -V

C +V +V +V 0 -V -V -V 0

D -V -V -V 0 +V +V +V 0

MOTORES UNIPOLARES Al igual que en los motores bi olares, encontramos dos modos de funcionamiento, en paso p completo y en medio paso. 1. Paso completo Las bobinas se van alimentando de dos en dos, siempre teniendo en cuenta, que no pueden estar alimentadas simultneamente las dos partes de una misma bobina (A y B C y D). El paso en este caso equivale a 90.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 40 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

A continuacin se muestra la secuencia de excitacin de bobinas para el funcionamiento de un motor unipolar en modo paso completo.

Paso 1 2 3 4

Comn Masa Masa Masa Masa

A +V 0 0 +V

B 0 +V +V 0

C +V +V 0 0

D 0 0 +V +V

2. Medio paso Igual que con los motores bipolares, se puede conseguir una resolucin mayor si entre paso y paso dejamos una bobina sin alimentar. A continuacin se muestra la secuencia de excitacin de bobinas para el funcionamiento de un motor unipolar en modo medio paso. Paso 1 2 3 4 5 Comn Masa Masa Masa Masa Masa Masa Masa Masa Masa A +V 0 0 0 0 0 +V +V +V B 0 0 +V +V +V 0 0 0 0 C +V +V +V 0 0 0 0 0 +V D 0 0 0 0 +V +V +V 0 0

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 41 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

MOTOR Y PUERTO PARALELO Configuracin del puerto para Dev-C++ El problema de la configuracin del puerto paralelo radica en que el Sistema Operativo XP lo bloquea y no puede ser accedido por el usuario. Por lo tanto para solucionar este inconveniente debe copiarse el archivo inpout32.dll en el directorio C:\Windows\System32. A continuacin mostramos un programa con el cual se puede comprobar el correcto funcionamiento del puerto:
#include <stdio.h> #include <conio.h> #include <windows.h> // prototype (function typedef) for DLL function Inp32: typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); int main(void) { HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; short x; int i,j,h; //cargamos la librera para poder usar los puertos hLib = LoadLibrary("inpout32.dll"); if (hLib == NULL) {printf("LoadLibrary Failed.\n"); return -1;} // Comprobamos en funcionamiento de las funciones inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); if (inp32 == NULL) {printf("GetProcAddress for Inp32 Failed.\n"); return -1;} oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (oup32 == NULL) {printf("GetProcAddress for Oup32 Failed.\n"); return -1;} // Escribiendo el puerto paralelo i=0x378; x=0x00; for (j=1;j<5000;j++) {if (x==0x00) {(oup32)(i,x); x=0x02; for(h=1;h<5000000;h++);} else {(oup32)(i,x); x=0x00; for(h=1;h<5000000;h++);} } getch();

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 42 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Driver Motor paso a paso: Para el control del motor paso a paso se diseo un Driver, el cual posee 2 entradas de control para comandar el motor. Una de ellas comanda la direccin o sentido de movimiento y la otra se encarga de variar la velocidad mediante un tren de pulsos de frecuencia variable. Adems estas entradas se encuentran opto-aisladas con el fin de brindar proteccin al puerto paralelo del ordenador, que es el encargado de brindar dichas seales. Es decir separar el circuito de potencia del circuito de control. Esta opto-aislamiento se logra mediante el circuito integrado 4N25. Luego estas seales son tomadas por el controlador SAA1027 el cual genera una secuencia de salida dada por la tabla siguiente:

La secuencia de salida es usada para producir el disparo de Transistores PNP encargados de excitar las bobinas del motor. El esquemtico es el siguiente:
12v 24v 6 5 4 Puerto paralelo 2 4N25 U2 1 6 5 4 2 4N25 2 4 3 15 5 12 SAA1027 13 14 6 8 9 11 PNP U1 bit2 GND bit1 1

bobina N

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 43 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Interconexin de los dispositivos: El control del motor se realiza mediante dos bits, como ya fue descripto anteriormente, correspondiendo el Bit0 al sentido de giro (conectado a la salida Data 0), y el bit1 a la velocidad de giro (conectado a la salida Data 1). A continuacin puede observarse grficamente la configuracin de un puerto paralelo.

Por otro lado la toma de seal de los sensores se realiz mediante las entradas de datos 10 (ACK) y 11 (BUSY).

Puerto Paralelo Bit0 bit1 Bit10 Bit11

Finales de Carrera

Controlador del motor Paso a Paso

Motor

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 44 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

PROGRAMA PRINCIPAL
INICIO

Definiciones Globales de Variables y Estructuras

Inicializacion Para el uso del puerto Paralelo

Verificacion de sensores

Reposicionamiento de la camara

Posicionamiento Inicial de la Camara

Verificacion de sensores

Mensaje de Chequeo de la integridad de los sensores

Inicializacion de Captura de imagenes y ventana de visualizacion

Funcion Actualiza MHI

Visualizacion en pantalla

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 45 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Funcion Actualiza MHI

Inicializacion de varibles

Inicio o nuevo posicionamiento

Actulizar tamaos y/o estructuras de datos

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer

Obtener diferencia de imagenes

Umbralizacion para obtencion de silueta valida

Actualizacion MHI

Calculo gradientes de movimiento

Calculo Orienteacion Global

Verificacion Sensores

Movimiento de la Camara

Fin

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 46 -

Proyecto Integrador TD III


#include #include #include #include #include #include "cv.h" "highgui.h" <time.h> <stdio.h> <conio.h> <windows.h>

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

IplImage **buffer = 0; int inicio = 1; int ultimo = 0; int Posiciono=0; int pasos=0,Posicionamiento,PasoAct; int i,j,t,io=0x378,ii=0x379; short x,y,a; // parmetros de captura (en segundos) const double MHI_DURACION = 1, MAX_TIEMPO_DELTA = 0.5, MIN_TIEMPO_DELTA = 0.05; // numero de estructuras en buffer usados para crear siluetas const int N = 3; // Imgenes temporarias IplImage*mhi=0,*orientacin=0,*mascara=0,*silueta=0; // definicin del prototipo de la funcin Inp32 (tipo de definicin): typedef short _stdcall (*inpfuncPtr)(short portaddr); typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum); void actualizar_mhi( IplImage* entrada ) { int j,k, indice2, umbral=30, indice1; double cuenta, angulo, magnitud,lado=0; double timestamp = (double)clock()/CLOCKS_PER_SEC; CvPoint centro; CvScalar color; CvRect comp_rect; CvSize Size = cvSize(entrada->width,entrada->height); //////////Definiciones para el uso del puerto////////// HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; //cargamos la librera para poder usar los puertos// hLib = LoadLibrary("inpout32.dll"); inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); // Coloca imgenes en el comienzo o recambia si el tamao de la estructura a cambiado o si se posiciono if( !mhi || mhi->width != Size.width || mhi->height != Size.height { if( buffer == 0 ) { buffer = (IplImage**)malloc(N*sizeof(buffer[0])); memoria memset( buffer, 0, N*sizeof(buffer[0])); ejecucin devuelve } posicin cero for( i = 0; i < N; i++ ) imagenes en buffer { // N numero de || Posiciono==1 )

// tomar tiempo actual en seg.

//tomar actual tamao

// malloc reserva // en tiempo de // puntero a la primer // La inicializa con

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 47 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV


// Libera contenido de // crea imagen del

cvReleaseImage( &buffer[i] ); buffer buffer[i] = cvCreateImage( Size, IPL_DEPTH_8U, 1 ); tamao cvZero( buffer[i] ); } cvReleaseImage( &mhi ); contenidos de: cvReleaseImage( &orientacin ); cvReleaseImage( &mascara ); mhi = cvCreateImage( Size, IPL_DEPTH_32F, 1 ); del tamao actual cvZero( mhi ); comienzo orientacion = cvCreateImage( Size, IPL_DEPTH_32F, 1 ); mascara = cvCreateImage( Size, IPL_DEPTH_8U, 1 ); Posiciono=0; inicio=1; angulo=90; } cvCvtColor( entrada, buffer[ultimo], CV_BGR2GRAY ); if (ultimo==2) inicio=0; indice1 = ultimo; indice2 = (ultimo + 1) % N; ultimo = indice2; silueta = buffer[indice2]; cvAbsDiff( buffer[indice1], buffer[indice2], silueta ); cvThreshold( silueta, silueta, umbral, 1, CV_THRESH_BINARY ); cvUpdateMotionHistory( silueta, mhi, timestamp, MHI_DURACION );

// Libera los

//crea imgenes aux //borra MHI en el

cvCalcMotionGradient( mhi, mascara, orientacin, MAX_TIEMPO_DELTA, MIN_TIEMPO_DELTA, 3 ); comp_rect = cvRect( 0, 0, Size.width, Size.height ); color = CV_RGB(255,255,255); magnitud = 100; Angulo = cvCalcGlobalOrientation( orientacin, mascara, mhi, timestamp, MHI_DURACION); Angulo = 360.0 - Angulo; //Chequea para el caso de un pequeo movimiento cuenta = cvNorm( silueta, 0, CV_L1, 0 ); if( cuenta < comp_rect.width*comp_rect.height * 0.15) return; if (inicio==1) return; // Dibuja flecha indicando la direccin centro = cvPoint( (comp_rect.x + comp_rect.width/2), (comp_rect.y + comp_rect.height/2) ); cvLine( entrada, centro, cvPoint( cvRound( centro.x + magnitud*cos(Angulo*CV_PI/180)), cvRound( centro.y )), color, 3, CV_AA, 0 ); ///////////movimiento del motor/////////// y = (inp32)(ii); lado=cos(angulo*CV_PI/180); if((a^y)==0x20)

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 48 -

Proyecto Integrador TD III


{

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

while (PasoAct!=Posicionamiento) { x=0x00; (oup32)(io,x); for (t=1;t<1000000;t++); x=0x02; (oup32)(io,x); for (t=1;t<1000000;t++); PasoAct--; } Posiciono=1; return; } if((a^y)==0x80) { while (PasoAct!=Posicionamiento) { x=0x01; (oup32)(io,x); for (t=1;t<1000000;t++); x=0x03; (oup32)(io,x); for (t=1;t<1000000;t++); PasoAct++; } Posiciono=1; return; } if (lado>0) { x=0x00; (oup32)(io,x); //derecha for (t=1;t<500000;t++); x=0x02; (oup32)(io,x); for (t=1;t<500000;t++); PasoAct--; } if (lado<0) { x=0x01; (oup32)(io,x); //izquierda for (t=1;t<500000;t++); x=0x03; (oup32)(io,x); for (t=1;t<500000;t++); PasoAct++; } }

//derecha

//izquierda

main() { //////////Definiciones para el uso del puerto/////////////////////////// HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; //cargamos la libreria para poder usar los puertos// hLib = LoadLibrary("inpout32.dll"); inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32"); ///////////////////////////////////////////////////////////////////// /////////////////////////Posicionamiento inicial////////////////////////// a = (inp32)(ii); y = (inp32)(ii); IplImage* fot= cvLoadImage ("Dibujo.jpg"); cvNamedWindow("Error",0);

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 49 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

for(;;) {cvShowImage("Error",fot); cvWaitKey(10); } getch(); if ((y&0x80)==0x80) { for(j=0;j<4;j++) { x=0x01; (oup32)(io,x); for (t=1;t<1000000;t++); x=0x03; (oup32)(io,x); for (t=1;t<1000000;t++); } getch(); y = (inp32)(ii); if ((y&0x80)==0x80) { IplImage* fot= cvLoadImage ("Dibujo.jpg"); cvNamedWindow("Error",0); for(;;) {cvShowImage("Error",fot); cvWaitKey(10); } } a = (inp32)(ii); } y=~y; if ((y&0x20)==0x20) { for(j=0;j<4;j++) { x=0x00; (oup32)(io,x); //derecha for (t=1;t<1000000;t++); x=0x02; (oup32)(io,x); for (t=1;t<1000000;t++); } y = (inp32)(ii); y=~y; getch(); if ((y&0x20)==0x20) { IplImage* fot= cvLoadImage ("Dibujo.jpg"); cvNamedWindow("Error",0); for(;;) {cvShowImage("Error",fot); cvWaitKey(10); } getch(); } a = (inp32)(ii); } while ((a^y)!=0x80) { x=0x00; (oup32)(io,x); for (t=1;t<1000000;t++); x=0x02; (oup32)(io,x); for (t=1;t<1000000;t++); y = (inp32)(ii); } while ((a^y)!=0x20) { x=0x01;

//izquierda

//derecha

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 50 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV


//izquierda

(oup32)(io,x); for (t=1;t<1000000;t++); x=0x03; (oup32)(io,x); for (t=1;t<1000000;t++); pasos++; y = (inp32)(ii); } Posicionamiento= pasos/2; PasoAct= pasos;

while (PasoAct!=Posicionamiento) { x=0x00; (oup32)(io,x); //izquierda for (t=1;t<1000000;t++); x=0x02; (oup32)(io,x); for (t=1;t<1000000;t++); PasoAct--; } ///////////////////////////////////////////////////////////////////////////////////////////// /////// CvCapture* captura = cvCaptureFromCAM(-1); IplImage* imagen = cvQueryFrame( captura ); CvSize Size = cvSize(imagen->width,imagen->height); estructura

//tomar actual tamao de la

cvNamedWindow( "SIGUIENDO OBJETO", 0 ); for(;;) { IplImage* imagen = cvQueryFrame( captura ); actualizar_mhi( imagen ); cvShowImage( "SIGUIENDO OBJETO", imagen ); cvWaitKey(10); } cvReleaseCapture( &captura ); cvDestroyWindow( "SIGUIENDO OBJETO" ); }

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 51 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

FUNCIONES UTILIZADAS

cvNamedWindow
Crea ventana

int cvNamedWindow( const char* name, int flags );


name

Nombre de la ventana la cual es usada como identificador y aparece en el encabezado de la ventana


flags

Bandera de Windows. Actualmente la nica bandera soportada es CV_WINDOW_AUTOSIZE. Si esto es puesto, el tamao de la ventana es automticamente ajustado a la imagen (ver cvShowImage), el usuario no puede cambiar el tamao de la ventana manualmente. La funcin cvNamedWindow crea una ventana la cual puede ser usada como lugar para imgenes y barras.

cvDestroyWindow
Destruye una ventana

void cvDestroyWindow( const char* name );


name

Nombre de la ventana a ser destruida.

cvShowImage
Muestra la imagen en una ventana especfica

void cvShowImage( const char* name, const CvArr* image );


name

Nombre de la ventana.
image

Imagen a ser mostrada. Si la ventana fue creada con la bandera CV_WINDOW_AUTOSIZE entonces la imagen es mostrada con su tamao original, de otra manera la imagen es escalada para ajustarse a la ventana.

cvWaitKey
Espera a que se presione una tecla

int cvWaitKey( int delay=0 ); delay

Delay in milliseconds. La funcin cvWaitKey espera por un evento de tecla indefinidamente (delay<=0) o por "delay" milisegundos. Devuelve el cdigo de la tecla presionada o -1 si no se presiona antes del tiempo especificado

CvCapture
Estructura de captura de Video

typedef struct CvCapture CvCapture;

La estructura CvCapture no tiene una interfaz pblica y es solamente usada como parmetro para funciones de video captura.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 52 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

cvCaptureFromCAM
Inicializa captura de video desde Camara

CvCapture* cvCaptureFromCAM( int index );

ndice de la cmara a ser usada. Si hay solo una cmara o si no es asunto que cmara usar -1 debe ser pasado. La funcin cvCaptureFromCAM coloca e inicializa la estructura CvCapture para leer el flujo de video desde la cmara. Actualmente dos interfaz de cmara son usada en Windows: Video for Windows (VFW) and Matrox Imaging Library (MIL); y 2 sobre Li ux: V4L and FireWire n (IEEE1394).
index

cvQueryFrame
Graba y retorna un frame desde camera o archivo

IplImage* cvQueryFrame( CvCapture* capture ); capture

Estructura de video captura. La funcin cvQueryFrame graba un frame desde camera o archivo de video, descomprimido y retorna esto.

cvReleaseCapture
Libera la estructura CvCapture

void cvReleaseCapture( CvCapture** capture ); capture

Puntero a la estructura de video captura. La funcin cvReleaseCapture libera la estructura CvCapture inicializada por cvCaptureFromFile o cvCaptureFromCAM.

SetZero
Borra el array

void cvSetZero( CvArr* arr ); #define cvZero cvSetZero

arr array a ser borrado. En caso de arrays densos (CvMa CvMatND or IplImage) cvZero(array) es equivalente a t, cvSet(array,cvScalarAll(0),0), en caso de arrays poco denso todos los elementos son borrados.

CvRect
offset y tamao de un rectngulo

typedef struct CvRect { int x; /* x-coordinate of the left-most rectangle corner[s] */ int y; /* y-coordinate of the top-most or bottom-most rectangle corner[s] */ int width; /* width of the rectangle */ int height; /* height of the rectangle */ } CvRect; /* the constructor function */ inline CvRect cvRect( int x, int y, int width, int height );

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 53 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

CvSize
Tamao de un rectngulo en pixel

typedef struct CvSize { int width; /* width of the rectangle */ int height; /* height of the rectangle */ } CvSize; /* the constructor function */ inline CvSize cvSize( int width, int height );

CreateImage
Crea la cabeza y coloca datos

IplImage* cvCreateImage( CvSize size, int depth, int channels );


size depth

Ancho y alto de la imagen. Bit depth de los elementos de la imagen. Puede ser uno de: IPL_DEPTH_8U - unsigned 8-bit integers IPL_DEPTH_8S - signed 8-bit integers IPL_DEPTH_16U - unsigned 16-bit integers IPL_DEPTH_16S - signed 16-bit integers IPL_DEPTH_32S - signed 32-bit integers IPL_DEPTH_32F - single precision floating-point numbers IPL_DEPTH_64F - double precision floating-point numbers

channels

Numero de canales por elemento(pixel). Puede ser 1, 2, 3 or 4. Los canales son intercalados, por ejemplo la usual capa de datos de una imagen de color es: b0 g0 r0 b1 g1 r1 ... Si bien en general el formato IPL image puede almacenar imagen no intercaladas y OpenCV puede procesar esto, esta funcin puede crear imagen intercaladas solamente.

ReleaseImage
Libera direccin y datos de la imagen

void cvReleaseImage( IplImage** image ); image

doble puntero a la cabeza de la imagen.

AbsDiff
Calcula la diferencia absoluta entre dos arrays

void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst ); src1

Primer array fuente.


src2

Segundo array fuente.


dst

Array de destino.
dst(I)c = abs(src1(I)c - src2(I)c).

Todos los array deben tener el mismo tamao y tipo de datos.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 54 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Norm
Calcula norma absoluta del array, norma absoluta de diferencia o norma relativa de diferencia.

double cvNorm( const CvArr* arr1, const CvArr* arr2=NULL, int norm_type=CV_L2, const CvArr* mask=NULL ); arr1

Primer imagen fuente.


arr2

Segunda imagen fuente. Si es NULL, la norma absoluta del arr1 es calculada, de otra manera la norma absoluta o relativa de arr1-arr2 es calculada.
normType

Tipo de norma, ver la discusin.


mask

Mascara opcional de operacin. La funcin cvNorm calcula la norma absoluta de arr1 si arr2 es NULL:
norm = ||arr1||C = maxI abs(arr1(I)), si normType = CV_C norm = ||arr1||L1 = sumI abs(arr1(I)), si normType = CV_L1 norm = ||arr1||L2 = sqrt( sumI arr1(I)2), si normType = CV_L2

Y la funcin calcula norma absoluta o relativa diferencia si arr2 es no NULL:


norm norm norm o norm norm norm = ||arr1-arr2||C = maxI abs(arr1(I)-arr2(I)), if normType = CV_C = ||arr1-arr2||L1 = sumI abs(arr1(I)-arr2(I)), if normType = CV_L1 = ||arr1-arr2||L2 = sqrt( sumI (arr1(I)-arr2(I))2 ), if normType = CV_L2 = ||arr1-arr2||C/||arr2||C, if normType = CV_RELATIVE_C = ||arr1-arr2||L1/||arr2||L1, if normType = CV_RELATIVE_L1 = ||arr1-arr2||L2/||arr2||L2, if normType = CV_RELATIVE_L2

La funcin Norm devuelve la norma calculada.

CvtColor
Convierte la imagen de un espacio de color a otro

void cvCvtColor( const CvArr* src, CvArr* dst, int code ); src

Fuente de 8-bit (8u), 16-bit (16u) o imagen de punto flotante de simple precisin (32f).
dst

La imagen de destino del mismo tipo de datos. El nmero de canales debe ser diferente.
code

operacin de conversin de color que puede ser especificada como: CV_<src_color_space>2<dst_color_space> constants (see below). La funcin ignora colorModel y channelSeq fields of IplImage header, el espacio de color de la imagen fuente debe ser especificado correctamente (incluyendo orden de canales en caso del espacio RGB, ejemplo BGR toma formato 24-bit con capas B0 G0 R0 B1 G1 R1 ..., mientras RGB toma formato 24-bit con capas R0 G0 B0 R1 G1 B1 ...). El rango convencional de los valores de canales R,G,B es: 0..255 para 8-bit imgenes 0..65535 para 16-bit imgenes 0..1 para imgenes de punto flotante. Por supuesto, en caso de transformaciones lineales el rango puede ser arbitrario, pero con el fin de tomar correctos resultados en caso de transformaciones no lineales, la imagen de entrada debe ser escalada si es necesario. La funcin puede hacer las siguientes transformaciones:

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 55 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Transformations within RGB space like adding/removing alpha channel, reversing the channel order, conversion to/from 16-bit RGB color (R5:G6:B5 or R5:G5:B5) color, as well as conversion to/from grayscale using:
RGB[A]->Gray: Y<-0.299*R + 0.587*G + 0.114*B Gray->RGB[A]: R<-Y G<-Y B<-Y A<-0 RGB<=>CIE XYZ.Rec 709 with D65 white point (CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB): |X| |0.412453 0.357580 0.180423| |R| |Y| <- |0.212671 0.715160 0.072169|*|G| |Z| |0.019334 0.119193 0.950227| |B| |R| | 3.240479 |G| <- |-0.969256 |B| | 0.055648 -1.53715 -0.498535| |X| 1.875991 0.041556|*|Y| -0.204043 1.057311| |Z|

X, Y and Z cover the whole value range (in case of floating-point images Z may exceed 1). RGB<=>YCrCb JPEG (a.k.a. YCC) (CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB) Y <- 0.299*R + 0.587*G + 0.114*B Cr <- (R-Y)*0.713 + delta Cb <- (B-Y)*0.564 + delta R <- Y + 1.403*(Cr - delta) G <- Y - 0.344*(Cr - delta) - 0.714*(Cb - delta) B <- Y + 1.773*(Cb - delta), { 128 for 8-bit images, where delta = { 32768 for 16-bit images { 0.5 for floating-point images Y, Cr and Cb cover the whole value range.

RGB<=>HSV (CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB)


// In case of 8-bit and 16-bit images // R, G and B are converted to floating-point format and scaled to fit 0..1 range V <- max(R,G,B) S <- (V-min(R,G,B))/V (G - B)*60/S, H <- 180+(B - R)*60/S, 240+(R - G)*60/S, if H<0 then H<-H+360 On output 0V1, 0S1, 0H360. The values are then converted to the destination data type: 8-bit images: V <- V*255, S <- S*255, H <- H/2 (to fit to 0..255) 16-bit images (currently not supported): V <- V*65535, S <- S*65535, H <- H 32-bit images: H, S, V are left as is RGB<=>HLS (CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB)

if V0, 0 otherwise if V=R if V=G if V=B

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 56 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

// In case of 8-bit and 16-bit images // R, G and B are converted to floating-point format and scaled to fit 0..1 range Vmax <- max(R,G,B) Vmin <- min(R,G,B) L <- (Vmax + Vmin)/2 S <- (Vmax - Vmin)/(Vmax + V min) if L < 0.5 (Vmax - Vmin)/(2 - (Vmax + Vmin)) if L 0.5 (G - B)*60/S, H <- 180+(B - R)*60/S, 240+(R - G)*60/S, if H<0 then H<-H+360 On output 0L1, 0S1, 0H360. The values are then converted to the destination data type: 8-bit images: L <- L*255, S <- S*255, H <- H/2 16-bit images (currently not supported): L <- L*65535, S <- S*65535, H <- H 32-bit images: H, L, S are left as is RGB<=>CIE L*a*b* (CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB) // In case of 8-bit and 16-bit images // R, G and B are converted to floating-point format and scaled to fit 0..1 range // convert R,G,B to CIE XYZ |X| |0.412453 0.357580 0.180423| |R| |Y| <- |0.212671 0.715160 0.072169|*|G| |Z| |0.019334 0.119193 0.950227| |B| X <- X/Xn, where Xn = 0.950456 Z <- Z/Zn, where Zn = 1.088754 L <- 116*Y1/3 L <- 903.3*Y for Y>0.008856 for Y<=0.008856 if Vmax=R if Vmax=G if Vmax=B

a <- 500*(f(X)-f(Y)) + delta b <- 200*(f(Y)-f(Z)) + delta where f(t)=t1/3 for t>0.008856 f(t)=7.787*t+16/116 for t<=0.008856 where delta = 128 for 8-bit images, 0 for floating-point images On output 0L100, -127a127, -127b127 The values are then converted to the destination data type: 8-bit images: L <- L*255/100, a <- a + 128, b <- b + 128 16-bit images are currently not supported 32-bit images: L, a, b are left as is

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 57 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

RGB<=>CIE L*u*v* (CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB)


// In case of 8-bit and 16-bit images // R, G and B are converted to floating-point format and scaled to fit 0..1 range // convert R,G,B to CIE XYZ |X| |0.412453 0.357580 0.180423| |R| |Y| <- |0.212671 0.715160 0.072169|*|G| |Z| |0.019334 0.119193 0.950227| |B| L <- 116*Y1/3 L <- 903.3*Y for Y>0.008856 for Y<=0.008856

u' <- 4*X/(X + 15*Y + 3*Z) v' <- 9*Y/(X + 15*Y + 3*Z) u <- 13*L*(u' - un), where un=0.19793943 v <- 13*L*(v' - vn), where vn=0.46831096 On output 0L100, -134u220, -140v122 The values are then converted to the destination data type: 8-bit images: L <- L*255/100, u <- (u + 134)*255/354, v <- (v + 140)*255/256 16-bit images are currently not supported 32-bit images: L, u, v are left as is

The above formulae for converting RGB to/from various color spaces have been taken from multiple sources on Web, primarily from Color Space Conversions ([Ford98]) document at Charles Poynton site. Bayer=>RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR,
CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB)

Bayer pattern is widely used in CCD and CMOS cameras. It allows to get color picture out of a single plane where R,G and B pixels (sensors of a particular component) are interleaved like this:

R G R G R G

G B G B G B

R G R G R G

G B G B G B

R G R G R G

The output RGB components of a pixel are interpolated from 1, 2 or 4 neighbors of the pixel having the same color. There are several modifications of the above pattern that can be achieved by shifting the pattern one pixel left and/or one pixel up. The two letters C1 and C2 in the conversion constants CV_BayerC1C22{BGR|RGB} indicate the particular pattern type - these are components from the second row, second and third columns, respectively. For example, the above pattern has very popular "BG" type.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 58 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

ANALISIS DEL FUNCIONAMIENTO DEL PROGRAMA Timestamp: Es una variable tipo float que contiene el tiempo en segundos desde que se inicio la aplicacion. Indice1 e Indice 2 : Variable del tipo entero para el correcto uso de las imagenes almacenadas en buffers. Cont : Variable del tipo entero agregada para tomar las primeras 15 imagenes desde que se inicia la aplicacion Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : Timestamp : 1.011000 1.201000 1.321000 1.452000 1.612000 1.772000 1.932000 2.093000 2.253000 2.413000 2.573000 2.733000 2.894000 2.994000 3.084000 Cont: 0 Cont: 1 Cont: 2 Cont: 3 Cont: 4 Cont: 5 Cont: 6 Cont: 7 Cont: 8 Cont: 9 Cont: 10 Cont: 11 Cont: 12 Cont: 13 Cont: 14 Indice1: 0 Indice1: 1 Indice1: 2 Indice1: 0 Indice1: 1 Indice1: 2 Indice1: 0 Indice1: 1 Indice1: 2 Indice1: 0 Indice1: 1 Indice1: 2 Indice1: 0 Indice1: 1 Indice1: 2 Indice2: 1 Indice2: 2 Indice2: 0 Indice2: 1 Indice2: 2 Indice2: 0 Indice2: 1 Indice2: 2 Indice2: 0 Indice2: 1 Indice2: 2 Indice2: 0 Indice2: 1 Indice2: 2 Indice2: 0

En esta tabla se muestra como se van almacenando en buffer(el cual nos permite almacenar las ultimas 3 imagenes capturadas para el analisis ) las diferentes imagenes y como se genera la silueta valida en cada instante.Referirse al codigo fuente para el uso de estas variables las cuales son de tipo IPLIMAGE Cont 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Buffer [0] IMAGEN 0 IMAGEN 0 IMAGEN 0 IMAGEN 3 IMAGEN 3 IMAGEN 3 IMAGEN 6 IMAGEN 6 IMAGEN 6 IMAGEN 9 IMAGEN 9 IMAGEN 9 IMAGEN 12 IMAGEN 12 IMAGEN 12 Buffer [1] IMAGEN 1 IMAGEN 1 IMAGEN 1 IMAGEN 4 IMAGEN 4 IMAGEN 4 IMAGEN 7 IMAGEN 7 IMAGEN 7 IMAGEN 10 IMAGEN 10 IMAGEN 10 IMAGEN 13 IMAGEN 13 Buffer [2] Silueta IMAGEN 0 - NADA IMAGEN 1 - NADA IMAGEN 2 - IMAGEN 0 IMAGEN 3 - IMAGEN 1 IMAGEN 4 - IMAGEN 2 IMAGEN 5 - IMAGEN 3 IMAGEN 6 - IMAGEN 4 IMAGEN 7 - IMAGEN 5 IMAGEN 8 - IMAGEN 6 IMAGEN 9 - IMAGEN 7 IMAGEN 10 - IMAGEN 8 IMAGEN 11 - IMAGEN 9 IMAGEN 12 - IMAGEN 10 IMAGEN 13 - IMAGEN 11 IMAGEN 14 - IMAGEN 12

IMAGEN 2 IMAGEN 2 IMAGEN 2 IMAGEN 5 IMAGEN 5 IMAGEN 5 IMAGEN 8 IMAGEN 8 IMAGEN 8 IMAGEN 11 IMAGEN 11 IMAGEN 11 IMAGEN 14

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

59

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Aqu se muestra una secuencia de 14 fotos

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

60

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Aqu se muestra las siluetas obtenidas las cuales son el parmetro para el anlisis del movimiento

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

61

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

REFERENCIAS [1] Matrox Electronic Systems Ltd. Matrox Imaging Library (MIL). www.matrox.com/imaging/products/mil/home.cfm, 2003. [2] Open Source Initiative. The BSD License. www.opensource.org/licenses/bsd-license.php, 2003. [3] Open Source Initiative. The MIT License. www.opensource.org/licenses/mit-license.php, 2003. [4] Open Source Initiative. The Open Source Definition. www.opensource.org/docs/definition.php, 2003. [5] The Open Computer Vision Library. www.intel.com/software/products/opensource/libraries/cvfl.htm, 2003.

VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B.

19/11/2007

- 62 -

You might also like