Deteccion y Seguimiento de Objetos

63
UNIVERSIDAD TECNOLÓGICA NACIONAL FACULTAD REGIONAL SAN NICOLÁS INGENIERIA EN ELECTRÓNICA TÉCNICAS DIGITALES III PROYECTO INTEGRADOR DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Integrantes: Profesores: Calla, Bernardo Poblete, Felipe F. Malespina, Gabriel González, Mariano Varela, Enzo Palomeque, Cristian AÑO 2007

Transcript of Deteccion y Seguimiento de Objetos

  • UNIVERSIDAD TECNOLGICA NACIONAL FACULTAD REGIONAL SAN NICOLS

    INGENIERIA EN ELECTRNICA

    TCNICAS DIGITALES III

    PROYECTO INTEGRADOR

    DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    Integrantes: Profesores: Calla, Bernardo Poblete, Felipe F. Malespina, Gabriel Gonzlez, Mariano Varela, Enzo Palomeque, Cristian

    AO 2007

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 1 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 2 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 3 -

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 4 -

    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 precio y su ciclo de actualizacin, 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 computador 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).

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 5 -

    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 (escritos 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 destacaran: interaccin hombre-mquina (HCI4); 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 Matrox y cmaras/capturadoras con drivers VFW/WDM (la mayora del mercado); la creacin de ventanas para visualizar imgenes en ellas.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 6 -

    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 fue sustituida por IPP (Intel 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 procesamiento 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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 7 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 8 -

    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:

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 9 -

    En la solapa Directorios y dentro de ella Includes C:

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

    En la solapa Programas:

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 10 -

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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 11 -

    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:

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 12 -

    (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:

    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).

    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.

    2 bits por pxel 3 bits por pxel 4 bits por pxel

    Canal R Canal G Canal B

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 13 -

    CAPTURA Y DIGITALIZACION

    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.

    Escena Cmara

    Seal analgica

    Digitalizador Ordenador

    Seal digital

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 14 -

    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.

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

    iluminacin.

    SONY DFW500

    QUICKCAM PRO

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 15 -

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 16 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 17 -

    La siguiente rutina es la utilizada para mostrar la imagen que captura la cmara:

    #include "cv.h" #include "highgui.h" #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"); }

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 18 -

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 19 -

    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 - top-left 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, .

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 20 -

    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)

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 21 -

    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.

    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.

    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)

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 22 -

    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 del flujo de 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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 23 -

    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 que los pxeles de brillo del fondo vara 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)

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 24 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 25 -

    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, 32-bit 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 if silhouette(x,y)!=0 0 if silhouette(x,y)=0 and mhi(x,y)

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 26 -

    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 X and Syxy to the operator Y, then the orientation of the gradient iscalculated as:Axy= arctanSyxySxxyand 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 2-2 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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 27 -

    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)

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 28 -

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 29 -

    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:

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 30 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 31 -

    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 cualquiera y puede estar centrada en cualquier pxel. En las siguientes figuras se muestra el mecanismo de convolucin de una imagen con una mscara de 3x3 centrada en el pxel de posicin central.

    OPERADOR DE SOBEL.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 32 -

    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)

  • 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

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 34 -

    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 imn permanente, en forma de disco, y en cuya

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 35 -

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 36 -

    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 acero 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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 37 -

    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 ambas bobinas, obtendremos el giro completo del motor, como se muestra en la siguiente figura:

    A B

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 38 -

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

    Paso A B C D 1 +V -V +V -V 2 -V +V +V -V 3 -V +V -V +V 4 +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 intermedia 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:

    D

  • 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

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 40 -

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

    Paso A B C D 1 +V -V +V -V 0 0 +V -V

    2 -V +V +V -V -V +V 0 0

    3 -V +V -V +V 0 0 -V +V

    4 +V -V -V +V +V -V 0 0

    MOTORES UNIPOLARES

    Al igual que en los motores bipolares, encontramos dos modos de funcionamiento, en paso 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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 41 -

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

    Paso Comn A B C D 1 Masa +V 0 +V 0 2 Masa 0 +V +V 0 3 Masa 0 +V 0 +V 4 Masa +V 0 0 +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 Comn A B C D 1 Masa +V 0 +V 0 Masa 0 0 +V 0 2 Masa 0 +V +V 0 Masa 0 +V 0 0 3 Masa 0 +V 0 +V Masa 0 0 0 +V 4 Masa +V 0 0 +V Masa +V 0 0 0 5 Masa +V 0 +V 0

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 42 -

    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 #include #include // 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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 43 -

    } 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:

    24v

    Puerto paralelo

    bit1GND

    bit2

    SAA1027

    24315

    512

    1314

    11

    689

    PNP

    12v

    bobina N

    U1

    4N25

    1 6

    2

    5

    4

    U2

    4N25

    1 6

    2

    5

    4

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 44 -

    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

    Controlador del motor

    Paso a Paso

    Motor

    Finales de

    Carrera

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 45 -

    PROGRAMA PRINCIPAL

    Visualizacion en pantalla

    Definiciones Globales deVariables y Estructuras

    Inicializacion Para el usodel puerto Paralelo

    Reposicionamiento de lacamara

    Mensaje de Chequeo de laintegridad de los sensores

    INICIO

    Verificacionde sensores

    Verificacionde sensores

    Posicionamiento Inicial dela Camara

    Inicializacion de Captura deimagenes y ventana de

    visualizacion

    Funcion Actualiza MHI

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 46 -

    Inicializacion de varibles

    Funcion Actualiza MHI

    Inicio o nuevoposicionamiento

    Actulizar tamaos y/oestructuras de datos

    Conversion de nuevo framea escala de grises y

    almacenamiento en Buffer

    Obtener diferencia deimagenes

    Umbralizacion paraobtencion de silueta valida

    Actualizacion MHI

    Calculo gradientes demovimiento

    Calculo Orienteacion Global

    Verificacion Sensores

    Movimiento de la Camara

    Fin

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 47 -

    #include "cv.h" #include "highgui.h" #include #include #include #include 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; // tomar tiempo actual en seg. CvPoint centro; CvScalar color; CvRect comp_rect; CvSize Size = cvSize(entrada->width,entrada->height); //tomar actual tamao //////////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 || Posiciono==1 ) { if( buffer == 0 ) { buffer = (IplImage**)malloc(N*sizeof(buffer[0])); // malloc reserva memoria memset( buffer, 0, N*sizeof(buffer[0])); // en tiempo de ejecucin devuelve } // puntero a la primer posicin // La inicializa con cero for( i = 0; i < N; i++ ) // N numero de imagenes en buffer {

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 48 -

    cvReleaseImage( &buffer[i] ); // Libera contenido de buffer buffer[i] = cvCreateImage( Size, IPL_DEPTH_8U, 1 ); // crea imagen del tamao cvZero( buffer[i] ); } cvReleaseImage( &mhi ); // Libera los contenidos de: cvReleaseImage( &orientacin ); cvReleaseImage( &mascara ); mhi = cvCreateImage( Size, IPL_DEPTH_32F, 1 ); //crea imgenes aux del tamao actual cvZero( mhi ); //borra MHI en el 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 ); 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)

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 49 -

    { while (PasoAct!=Posicionamiento) { x=0x00; (oup32)(io,x); //derecha for (t=1;t

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 50 -

    for(;;) {cvShowImage("Error",fot); cvWaitKey(10); } getch(); if ((y&0x80)==0x80) { for(j=0;j

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 51 -

    (oup32)(io,x); //izquierda for (t=1;t

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 52 -

    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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 53 -

    cvCaptureFromCAM Inicializa captura de video desde Camara CvCapture* cvCaptureFromCAM( int index ); 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 Linux: V4L and FireWire (IEEE1394).

    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 (CvMat, CvMatND or IplImage) cvZero(array) es equivalente a 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 );

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 54 -

    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 Ancho y alto de la imagen. depth

    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.

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 55 -

    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 = ||arr1-arr2||C = maxI abs(arr1(I)-arr2(I)), if normType = CV_C norm = ||arr1-arr2||L1 = sumI abs(arr1(I)-arr2(I)), if normType = CV_L1 norm = ||arr1-arr2||L2 = sqrt( sumI (arr1(I)-arr2(I))2 ), if normType = CV_L2 o norm = ||arr1-arr2||C/||arr2||C, if normType = CV_RELATIVE_C norm = ||arr1-arr2||L1/||arr2||L1, if normType = CV_RELATIVE_L1 norm = ||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_2 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:

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 56 -

    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: YRGB[A]: R

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 57 -

    // 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

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 - 58 -

    RGBCIE 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|

  • Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

    VARELA, E. PALOMEQUE, C. MALESPINA, G CALLA, B. 19/11/2007 59

    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 : 1.011000 Cont: 0 Indice1: 0 Indice2: 1 Timestamp : 1.201000 Cont: 1 Indice1: 1 Indice2: 2 Timestamp : 1.321000 Cont: 2 Indice1: 2 Indice2: 0 Timestamp : 1.452000 Cont: 3 Indice1: 0 Indice2: 1 Timestamp : 1.612000 Cont: 4 Indice1: 1 Indice2: 2 Timestamp : 1.772000 Cont: 5 Indice1: 2 Indice2: 0 Timestamp : 1.932000 Cont: 6 Indice1: 0 Indice2: 1 Timestamp : 2.093000 Cont: 7 Indice1: 1 Indice2: 2 Timestamp : 2.253000 Cont: 8 Indice1: 2 Indice2: 0 Timestamp : 2