You are on page 1of 63
UNIVERSIDAD TECNOLÓGICA NACIONAL FACULTAD REGIONAL SAN NICOLÁS INGENIERIA EN ELECTRÓNICA TÉCNICAS DIGITALES III PROYECTO INTEGRADOR DETECCION

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:

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

Profesores:

Poblete, Felipe F. González, Mariano

AÑO 2007

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

INDICE DE SECCIONES:

SECCION 0:

INTRODUCCION, OBJETIVO Y DESARROLLO

 

SECCION 1:

LA LIBRERÍA DE VISIÓN ARTIFICIAL OPENCV

Esta sección describe las características fundamentales de las librerías así como una breve referencia de su origen y comparativas con otros paquetes comerciales similares.

SECCION 2:

INSTALACION Y CONFIGURACION DE LIBRERIAS

Esta sección describe la adecuada instalación de IPL 2.5, OpenCV beta 5 y highgui, descripción y uso de los diferentes tipos de archivos generados en dicha instalación y como efectuar la inclusión de las librerías en dev cpp 4.0.

SECCION 3:

IMAGEN DIGITAL

Esta sección describe los principales parámetros de una imagen digital y como es representada cada tipo de imagen digital en memoria

SECCION 4:

CAPTURA Y DIGITALIZACION

Esta sección describe como es la interfase entre la imagen real y la PC, principales características del digitalizador, ventajas y desventajas de dos de las actuales tecnologías de fotodetectores usadas en dispositivos de captura. Se incluye información de la cámara web utilizada en el proyecto.

SECCION 5:

TIPOS DE DATOS EN IPL Y OPENCV

Esta sección se muestra los tipos de datos de IPL y OPENCV utilizados en el lenguaje c.

SECCION 6:

REPRESENTACION DEL MOVIMIENTO

Esta sección es un fragmento traducido del manual proporcionado por OPENCV en el cual se detalla el grupo de funciones que permiten encontrar la orientación de movimiento de algún objeto en una secuencia de capturas.

SECCION 7:

OPERACIONES LOCALES

Esta sección trata sobre como se realizan los diferentes análisis a una imagen digital, se muestra en detalle la detección de bordes mediante el operador sobel el cual es usado por una de las funciones descriptas en la sección anterior.

SECCION 8:

MOTORES PASO A PASO

Esta sección informa sobre los diferentes tipos de motores paso a paso, el funcionamiento y las diferentes de secuencia de excitación que permiten distintos ángulos de giro.

SECCION 9:

MOTOR Y PUERTO PARALELO

Esta sección informa sobre la configuración de puerto en Windows XP para el uso de los mismos en C, y se detalla la interconexión de nuestro proyecto a través 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 sección describe el diagrama de flujo del programa principal, el código fuente en desarrollado en DEVCPP.

SECCION 11:

FUNCIONES UTILIZADAS

Esta sección incluye las funciones utilizadas en el código 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 más complejos para tener una visión detallada del mismo. Hoy en día una de las armas para combatir este problema es la visión artificial, la cual a la vez de ayudar a resolverlos optimiza en gran medida el control. Además de la rama industrial es posible realizar numerosas aplicaciones en diferentes áreas como por ejemplo la vigilancia hogareña, etc.

OBJETIVO:

Mediante el uso de una cámara 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 moviéndose unidimensionalmente en un determinado rango.

DESARROLLO:

Como dijimos mediante una cámara web conectada a través del puerto USB, son adquiridas las imágenes. Estas imágenes son interpretadas por un software desarrollado bajo el lenguaje de programación dev C++ y las librerías OpenCV, IPL y Highgui, a través del mismo programa, y dependiendo del movimiento y las condiciones de finales de carrera se generan señales que son tomadas y decodificadas por el driver controlador del motor paso a paso, que es el encargado de realizar los movimientos de la cámara web. Por lo tanto podemos desglosar el funcionamiento del sistema en distintas secciones, las cuales serán desarrolladas en detalle a continuación.

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 3 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

LA LIBRERÍA DE VISIÓN ARTIFICIAL OPENCV

Características fundamentales de la librería de visión artificial y código abierto The Open Computer Vision Library (OpenCV a partir de ahora). La librería OpenCV proporciona un marco de trabajo de alto nivel para el desarrollo de aplicaciones de visión por computador en tiempo real: estructuras de datos, procesamiento y análisis de imágenes, análisis estructural, etc. Este marco de trabajo facilita en gran manera el aprendizaje e implementación de distintas técnicas de visión por computador, tanto a nivel docente como investigador, aislando al desarrollador de las peculiaridades de los distintos sistemas de visión.

  • 1. INTRODUCCION

Son muchos los paquetes de procesamiento de imágenes 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 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 están 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 análisis de imágenes, reconocimiento de patrones, estadísticas, calibración de la cámara, etc. a través del propio entorno o a través de librerías de funciones, desarrollados en la mayoría de las ocasiones en C/C++. Sin embargo, tan sólo HIPS pone a disposición del cliente su código fuente, y en la mayoría de los casos hablamos de librerías monolíticas, muy pesadas y no demasiado rápidas. 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 imágenes, pero a excepción de OpenCV y Gandalf ninguno proporciona un marco de trabajo completo para el desarrollo de aplicaciones relacionadas con la visión por computador. Esta capacidad de desarrollo contempla, no sólo el procesamiento de imágenes, sino tareas mucho más complejas como el reconocimiento de gestos, estimación del movimiento y la posición de un objeto, morphing, estimadores (filtros de Kalman, etc.), etc. Sin embargo, sólo OpenCV proporciona bibliotecas de tipos de datos estáticos y dinámicos (matrices, grafos, árboles, etc.), herramientas con la posibilidad de trabajar con la mayoría de las capturadoras/cámaras del mercado, entornos de desarrollo fáciles e intuitivos y todo ello, corriendo en dos de los sistemas operativos más 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 visión por computador para realizar una nueva librería de estructuras/funciones en lenguaje C. Esta librería proporcionaría un marco de trabajo de nivel medio-alto que ayudaría 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). Había nacido The Open Computer Vision Library [5] y lo hacía 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 librería 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 más información). • No utiliza librerías numéricas externas, aunque puede hacer uso de alguna de ellas, si están disponibles, en tiempo de ejecución. • Es compatible con The Intel® Processing Library (IPL) y utiliza The Intel® Integrated Performance Primitives (IPP) para mejorar su rendimiento, si están disponibles en el sistema. • Dispone de interfaces para algunos otros lenguajes y entornos: EiC - intérprete ANSI C escrito por Ed Breen. Hawk y CvEnv son entornos interactivos (escritos en MFC y TCL, respectivamente) que utilizan el intérprete EiC; Ch - intérprete ANSI C/C++ creado y soportado por la compañía SoftIntegration; Matlab® - gran entorno para el cálculo numérico y simbólico creado por Mathworks; y muchos más.

La librería OpenCV esta dirigida fundamentalmente a la visión por computador en tiempo real. Entre sus muchas áreas de aplicación destacarían: interacción hombre-máquina (HCI4); segmentación y reconocimiento de objetos; reconocimiento de gestos; seguimiento del movimiento; estructura del movimiento (SFM5); y robots móviles.

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 librería OpenCV se agrupan en los siguientes bloques:

• Estructuras6 y operaciones básicas: matrices, grafos, árboles, etc. • Procesamiento y análisis de imágenes: filtros, momentos, histogramas, etc. • Análisis estructural: geometría, procesamiento del contorno, etc. • Análisis 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. • Calibración de la cámara: morphing, geometría epipolar, estimación de la pose (i.e. POSIT), etc. • Reconstrucción tridimensional (funcionalidad experimental): detección de objetos, seguimiento de objetos tridimensionales, etc. • Interfaces gráficos de usuarios y adquisición de video.

2.2 INTERFACES GRAFICOS Y HERRAMIENTAS DE OpenCV La librería OpenCV proporciona varios paquetes de alto nivel para el desarrollo de aplicaciones de visión. Todos ellos se pueden agrupar en librerías 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 técnicas de procesamiento de imágenes y visión). Al primer grupo pertenecen HighGUI y CvCam, mientras que al segundo pertenecen Hawk y OpenCV Toolbox para Matlab®. HighGUI permite la escritura/lectura de imágenes en numerosos formatos (BMP, JPEG, TIFF, PxM, Sun Raster, etc.) y la captura de stream de video de capturadoras Matrox® y cámaras/capturadoras con drivers VFW/WDM (la mayoría del mercado); la creación de ventanas para visualizar imágenes 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 librerías de procesamiento de imagen, desarrolladas por Intel® (o bajo el patrocinio de Intel®). Están optimizadas para sus procesadores, aunque también son muy rápidas en otros procesadores. • IPL (Intel® Image Processing Library) está orientada al procesamiento de imágenes a bajo nivel. Su desarrollo fue abandonado en el 2000, año en que fue sustituida por IPP (Intel® Performance Primitives), algo más eficientes y que incluyen otras aplicaciones (como, por ejemplo, sonido, criptografía y vídeo), pero son más difíciles de manejar y no gratuitas (a diferencia de IPL). Por esta razón usaremos IPL. Página web de IPP:

OpenCV (Intel® Open Source Computer Vision Library) es una librería que contiene un conjunto de utilidades de procesamiento de imágenes, visión artificial, captura de vídeo y visualización de imágenes. Es de código abierto, gratuita (tanto para uso comercial como no comercial), multiplataforma, rápida, de fácil uso y en continuo desarrollo. Página web de OpenCV:

• Usaremos IPL 2.5 y OpenCV beta 5.

INSTALACIÓN 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), librerías enlazadas en tiempo de ejecución, necesarias para ejecutar funciones de IPL. doc → Documentación, manual y guía de referencia. examples → ipledit (aplicación sencilla de procesamiento de imágenes), tutorial.ipl (tutorial de uso la librería), video (algunos ejemplos de efectos de transición). include → Ficheros de cabecera de librería, para incluir en los programas C. lib → Ficheros de descripción de las librerías. Existe uno por cada archivo DLL. Los necesita el compilador para conocer las funciones disponibles en la DLL.

INSTALACIÓN DE OpenCV beta 5

  • 1. Descargar OpenCV b5:

  • 2. Normalmente usaremos OpenCV, que ofrece un acceso transparente a muchas operaciones de

IPL. Sólo para las no incluidas en OpenCV usaremos IPL.

  • 3. Ejecutar el instalador (OpenCV5.exe). Instalar las librerías 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 información de las librerías. cxcore → Código de fuente del núcleo de la librería, operaciones de bajo nivel sobre arrays,

matrices e imágenes. include → Ficheros de cabecera, para incluir en los programas C. El principal es: cxcore.h src → Código fuente de la librería, 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 → Código de fuente de la librería, operaciones de procesamiento de imágenes y visión artificial. También tiene un directorio include (para los ficheros de cabecera, siendo el principal cv.h) y src (para el código fuente). cvaux → Librería de funcionalidades avanzadas, en algunos casos en estado experimental, más relacionadas con visión artificial que con procesamiento de imagen. También tiene un directorio include (para los ficheros de cabecera, como cvaux.h) y src (para el código fuente). otherlibs → Otras librerías relacionadas con la entrada salida. highgui → Librerías para crear ventanas, leer y escribir imágenes (formatos BMP, JPEG, PNG y TIF), archivos de vídeo (formato AVI) y captura de cámara (usando el interface Video for Windows). Usaremos la modificación highgui2. docs → Documentación de las librerías. La mayor parte de la documentación está en formato HTML (fichero index.html). lib → Ficheros de descripción de las librerías. Cuidado, sólo están para Visual C++.

  • 5. Instalar HighGUI2. y descomprimir (marcando la opción “Use folder names”) en:

C:\Archivos de Programa\OpenCV5

Ver las novedades de HighGUI2 (respecto de HighGUI): otherlibs/HIGHGUI2.txt

CXCORE Reference Manual → operaciones básicas, aritméticas y de dibujo CV Reference Manual → filtros, geométricas y análisis de imágenes Procesamiento Audiovisual • HighGUI Reference Manual → entrada/salida de imágenes y vídeo • CVCAM Reference Manual (RTF) → irrelevante

USO DE LAS LIBRERÍAS CON DEVCPP 4.0

  • 1. La utilización de las librerías IPL® y OpenCV® permite aprovechar la potencia de las primeras

para el procesamiento eficiente de imágenes y vídeo, y la facilidad de la segunda para el desarrollo rápido de aplicaciones interactivas en entornos Windows®.

  • 2. El código de las librerías se encuentra en ficheros DLL (Dynamic Link Library), como “ipl.dll”,

cxcore097.dll”, “cv097.dll” y “highgui0972.dll”. Los ficheros DLL contienen código objeto (código ejecutable) que se enlaza de forma dinámica con la aplicación. Por lo tanto, nuestros programas usan estas librerías, pero no las incluyen en su código. 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 cv → Código de fuente

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 añadir a la línea de comandos del Linker como se muestra:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV En la solapa Compilador añadir

En la solapa Directorios y dentro de ella Binario:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV En la solapa Compilador añadir

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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV En la solapa Directorios y

En la solapa Directorios y dentro de ella Includes C:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV En la solapa Directorios y

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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV En la solapa Directorios y

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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Verificar además que la carpeta

Verificar además que la carpeta Bin este añadida al Path del sistema:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Verificar además que la carpeta
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Verificar además que la carpeta

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 números. Cada celda de la matriz es un píxel.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV IMAGEN DIGITAL Es una matriz,

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 tamaño de la imagen se expresa como: ancho x alto Supondremos un acceso indexado a los píxeles si i es una imagen, i(x, y) será el valor del píxel en la columna x, fila y.

Ejemplo. Tamaños típicos:

320x240, 640x480, 800x600, 1024x768, ...

VALOR DE UN PIXEL • Cada píxel representa el valor de una magnitud física. – Cantidad de luz en un punto de una escena. Valor de color (cantidad de radiación en la frecuencia del rojo, verde y azul). Nivel de radiación infrarroja, rayos X, etc. En general, cualquier radiación electromagnética. Profundidad (distancia) de una escena en una dirección. Cantidad de presión ejercida en un punto. Nivel de absorción de determinada radiación. Etcétera, etcétera.

TIPOS DE DATOS DE CADA MATRIZ

Imagen binaria:

  • 1 píxel =

1 bit

0 = negro; 1= blanco

Imagen en escala de grises:

  • 1 píxel = 1 byte Permite 256 niveles de gris

0 = negro; 255 = blanco

Imagen en color:

  • 1 píxel = 3 bytes Cada píxel consta de 3 valores:

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV IMAGEN DIGITAL Es una matriz,
19/11/2007 - 11 -
19/11/2007
- 11 -

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 más o

menos bits:

(Rojo, Verde, Azul) – • Un byte por color 16,7 millones de colores posible. – Profundidad
(Rojo, Verde, Azul) – • Un byte por color 16,7 millones de colores posible. – Profundidad
(Rojo, Verde, Azul) – • Un byte por color 16,7 millones de colores posible. – Profundidad

2 bits por píxel

3 bits por píxel

4 bits por píxel

Hi-color: método reducido para representar colores 1 píxel = 2 bytes 5 bits por cada color (Rojo, Verde, Azul)

Imágenes multicanal:

Cuando los píxeles representan magnitudes en distintos dominios físicos, decimos que

la

imagen es multicanal. Ejemplo. Imagen en color Imagen con 3 canales: canal R (rojo),

canal G (verde), canal B (azul).

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV (Rojo, Verde, Azul) – •

Canal R

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV (Rojo, Verde, Azul) – •

Canal G

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV (Rojo, Verde, Azul) – •

Canal B

Ejemplo. RGBA Imagen RGB más canal Alfa. El canal Alfa representa el nivel de transparencia del píxel.

RESUMEN

 

Parámetros de una imagen digital:

Ancho y alto.

Número de canales y significado de cada uno.

 

Número de bits por píxel y canal (depth).

– – Origen de coordenadas y modo de almacenamiento multicanal.

Resolución espacial: tamaño de la imagen.

Resolución fotométrica: profundidad de color.

Resolución temporal: aplicable en vídeos.

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

Escena

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV CAPTURA Y DIGITALIZACION Escena Señal
Señal digital
Señal
digital
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV CAPTURA Y DIGITALIZACION Escena Señal
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV CAPTURA Y DIGITALIZACION Escena Señal

Señal

analógica

Cámara

Digitalizador

Ordenador

Señal analógica: señal de vídeo, foto impresa, diapositiva, etc. Digitalizadores: digitalizador de vídeo, escáner, etc. Actualmente, la distinción es cada vez más difusa. Captura y digitalización van incorporadas en los mismos dispositivos (cámaras y escáneres).

CARACTERISTICAS DE UN DIGITALIZADOR:

Tamaño de imagen. Ancho y alto de las imágenes tomadas. Depende del número de píxeles de fotodetector. En cámaras fotográficas se mide en megapíxeles. Por ejemplo, resolución máxima:

2048x1536 3,34 megapíxeles. En cámaras de vídeo es mucho menor. No suele pasar de 800x600 0,48 megapíxeles. • Tamaño del píxel. Determina la densidad de píxeles. Es más relevante, por ejemplo, en escáneres. Propiedad física medida. Luz, infrarrojo, ultravioleta, etc. Linealidad. El nivel de gris debería ser proporcional al brillo de la imagen. Tb. es importante el número de niveles de gris. Nivel de ruido. Ante una escena de color uniforme todos los píxeles deberían ser iguales. Pero nunca lo son. El ruido se mide en relación al nivel de contraste en la imagen.

TIPOS DE CAPTURA DE DIGITALIZADOR

Existen muchos tipos, según el tipo de iluminación, sensores y mecanismo de escaneado de la

imagen. Entre ellos:

CCD: Charge-Coupled Devices. – Se han impuesto en muchos ámbitos: fotografía digital, vídeo digital, cámaras de TV, astronomía, microscopía, escáneres, etc. Utilizan sensores de silicio. El CCD es un chip que integra una matriz de fotodetectores.

Esquema de una celda del CCD (o píxel).

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV CAPTURA Y DIGITALIZACION Escena Señal

El CCD está construido en un semiconductor de silicio.

Cuando llega un fotón, 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.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV CAPTURA Y DIGITALIZACION Escena Señal

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

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

DFW500 SONY

PRO QUICKCAM

El detector es independiente del color Se usa un filtro de color (microfiltro).

Distribución típica de los filtros de color en el CCD (patrón de Bayer).

• El detector es independiente del color  Se usa un filtro de color (microfiltro). •

Existen el doble de detectores de verde que de rojo y de azul. Razón: el ojo humano es

mucho más sensible al verde que a los otros colores. Cada fotodetector es un píxel. Los colores no presentes se interpolan usando los 2 ó 4 píxeles vecinos de ese color.

LECTURA DEL VALOR DE LOS PIXELES Hay un desplazamiento de la carga de los pozos, hasta salir por un extremo.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV DFW500 SONY PRO QUICKCAM •

Esto es el llamado “full frame CCD”.

Por sus buenas características, los CCD son muy usados en muchos ámbitos.

Pero también tienen sus limitaciones:

Corriente oscura (dark current): los electrones saltan al llegar un fotón, pero también pueden hacerlo por el calor. Campo de estrellas: las imperfecciones provocan algunos píxeles con alta corriente oscura. Aunque no llegue luz, aparecen iluminados. Mayor cuanto peor es la cámara.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV DFW500 SONY PRO QUICKCAM •
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV DFW500 SONY PRO QUICKCAM •

Ruido fotónico: debido a la naturaleza cuántica de la luz. Es mayor con escasa iluminación.

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 14 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV – Rebosamiento ( blooming ):

Rebosamiento (blooming): cuando un pozo se llena de electrones, se desparrama su

contenido a los

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV – Rebosamiento ( blooming ):

píxeles cercanos.

CMOS: Complementary Metal-Oxide-Semiconductor. – También basados en semiconductores de silicio. – Diferencia con CCD: cada píxel incorpora su propia circuitería, se pueden leer y seleccionar independientemente (sin necesidad de desplazamientos).

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV – Rebosamiento ( blooming ):

Ventajas: suelen ser más rápidos, tienen mejor integración (necesitan menos circuitería) y disminuyen el blooming. Inconvenientes: hay menos espacio de captura en el chip (menos luz), son menos uniformes (hay más ruido) y necesitan búfferes. Las cámaras fotográficas digitales suelen usar CCD. Las cámaras de videoconferencia suelen usar CMOS, aunque las de más 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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV EUCC-961 300K INFRARED CMOS sensor

CMOS sensor 300K píxeles Resolución:640x480 píxeles Infrared Lente de vidrio USB Plug and Play Micrófono (opcional) Alta-precisión en lente de vidrio: f=4.4 / 4.4 / 6.0mm Ángulo de visión: 61º / 88º / 50º Formato de video: RGB, AVI. Balance automático de blancos Windows 98/98SE/XP/ME/2000

COMPROBACION DE LAS CARACTERISTICAS DE LA CAMARA WEB

Se realizo la comprobación mediante el software NERO

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV EUCC-961 300K INFRARED CMOS sensor

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 cámara:

#include "cv.h" #include "highgui.h" #include <stdio.h> #include <ctype.h>

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 píxel) en una imagen. La numeración de filas y

columnas empieza en 0. typedef struct CvPoint { int x; int y; } CvPoint;

CvSize: tamaño de una región rectangular, en píxeles. typedef struct CvSize {

int width;

// Anchura

 

int height; // Altura

 

} CvSize;

CvRect: rectángulo en la imagen, dado por el píxel 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 píxel, que puede contener 1, 2, 3 ó 4 números (según el número de canales). typedef struct CvScalar { double val[4]; } CvScalar;

En las funciones para dibujar (puntos, líneas, círculos, elipses, etc.) el color se representa mediante un CvScalar, que almacena los canales RGB.

EL TIPO IPLIMAGE:

• El tipo de datos para representar imágenes es el tipo IplImage, tanto en IPL como en OpenCV. Las imágenes se guardan descomprimidas, como una matriz de píxeles Principales propiedades de una imagen:

Tamaño (size): anchura (width) y altura (height). Profundidad de píxeles (depth): enteros de 8, 16 y 32 bits, reales de 32 y 64 bits. Número de canales (nChannels): 1, 2, 3 ó 4. Origen de coordenadas (origin): top-left, bottom-left; y orden de los canales (dataOrder): entrelazado de píxeles (0) o por canales (1). Las variables manejadas serán 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 (sólo 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 */ left origin, 1 - bottom-left origin (Windows bitmaps style) */

int origin; /* 0 - top-

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: tamaño de la imagen depth: profundidad
IplImage* cvCreateImage(CvSize size, int depth, int channels)
size: tamaño de la imagen
depth: profundidad de píxel:
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: número de canales: 1, 2, 3 ó 4
Implícitamente, el origen es top-left y el orden es entrelazado. Con imágenes 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 técnica de substracción de fondo descritas en la sección sustracción 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 píxel o el tiempo delta del threshold, como sea más apropiado, es seteado a “0”cuando un píxel en la MHI cambia y crece siguiendo el movimiento.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV REPRESENTACION DEL MOVIMIENTO La primer

El movimiento más reciente tiene el valor más alto y los movimientos más cercanos van decreciendo a medida que nos acercamos al último valor que es 0.

A continuación se describen los procedimientos:

  • ACTUIALIZANDO LAS IMÁGENES DE MHI:

Generalmente estas imágenes se utilizan porque tienen diferencias de tiempo, como puede ser el tiempo transcurrido desde que la aplicación se ejecutó que es leída en mseg. para ser convertida luego en un valor numérico float que es el valor de la silueta más reciente. Luego sigue escribiendo esta silueta sobre las pasadas siluetas con una umbralización subsecuente con los píxeles 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 función (single-channel, 32-bit floating-point)

timestamp

Tiempo actual en milisegundos u otra unidad.

duration

Máxima duración de la secuencia de movimiento en la misma unidad que timestamp.

La función 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-duración de otra forma

mhi(x,y)

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 atrás 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 operándoos X, Y.

  • 3. Si el resultado responde a la localización del píxel x, y es Sx (x,y) para el operando Sobel x y Sy (x,y) para el y, después la orientación 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 dándole una dirección o un ángulo sobre una imagen superpuesta a la MHI como se muestra en la figura 2.2.

Figura 2.2
Figura 2.2
  • 5. La frontera de la región MH puede contener movimientos incorrectos como muestra la figura 2.2, umbral izando fuera las magnitudes que son muy largas o muy pequeñas se puede corregir esto; Fig. 2.3.

CalcMotionGradient

Figura 2.3
Figura 2.3
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Esto es, los pixel de

Calcula la orientación 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 píxeles donde los datos del gradiente del movimiento son correctos. Parámetro de salida.

orientation

imagen orientación del gradiente de movimiento; contiene ángulos desde 0 a

~360°.

delta1, delta2

la función busca mínimo (m(x,y)) y máximo (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 función: CV_SCHARR, 1, 3, 5 or 7 (ver cvSobel).

La función cvCalcMotionGradient calcula la derivada Dx y Dy de mhi y luego calcula el gradiente de orientación 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 función gradiente

del

movimiento,

descripta

anteriormente,

con

la

dirección

del

flujo

de

movimiento.

 

La silueta actual está en azul brillante mientras que en los otros movimientos se muestra más tenue, las líneas rojas muestran donde fueron encontrados los gradientes válidos del movimiento, y la línea blanca muestra la dirección global del movimiento.

Para determinar el movimiento más reciente se realiza lo sig:

  • 1. Se calcula el histograma de los movimientos resultantes del proceso; fig.
    2.3.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV where both Dx(x,y)' and Dy(x,y)'
  • 2. Encontrar la dirección de una función circular ; ángulo en grados:

    • a) Se encuentra el máximo pico de orientación del histograma.

    • b) Se encuentran las mínimas diferencias con respecto a este ángulo base. Los movimientos más recientes son tomados con mayores tamaños.

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 región, en la cual la dirección 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

Máxima duración de la secuencia de movimiento en milisegundos, el mismo como en cvUpdateMotionHistory.

La función cvCalcGlobalOrientation calcula la dirección general del movimiento en la región 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 sección describe las funciones básicas para hacer un modelo de substracción de fondo (Background) para un modelo estático. En este capitulo el término Background está dado por el seteo de los píxeles de imágenes que casi no tienen movimiento que son píxeles que no pertenecen a ningún objeto moviéndose frente a la cámara. Esta definición puede variar si se consideran otras

técnicas para extracciones de objetos. Por ejemplo: si el fondo de la escena puede ser determinado por partes de la escena que están bastante lejos de la cámara. El modelo más simple de Background supone que los píxeles de brillo del fondo varía independientemente de acuerdo a una distribución normal. Las características del fondo pueden ser calculadas almacenando algunas docenas de cuadros así como ellos tengan. Que significa encontrar una suma de valores de los píxeles en el lugar S(x,y) de los distintos cuadros (frames) y una suma de los valores Sq(x, y) para la ubicación de cada píxel.

El resultado calculado es: m(x, y)=S(x, y) / n La desviación estándar se calcula como:

n es el número de cuadros (frames). r(x, y) = sqrt(sq(x, y)/n)-(S(x, y)/n)^2)

Luego que el píxel en una cierta ubicación de píxel en un cierto cuadro (frame) es apreciado como condición del movimiento del objeto si la condición 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 cámara por unos cuantos segundos para que la cámara tome la imagen del fondo. La técnica de abajo puede ser aprovechada, pero es razonable proponer una adaptación a un fondo para cambiar las condiciones de luz y las escenas del fondo como por ej. Cuando la cámara se mueve o algún objeto pasa delante del objeto que está enfrente de la cámara. La simple acumulación 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 sección describe la umbralización por funciones de grupo, las funciones de umbralización se

usan para 2 propósitos:

  • 1. Sacar algunos píxeles 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 máscara o una fuente para extraer los

mayores niveles de información de una imagen como por ejemplo contorno(Active contours), esqueleto (Distance transform), líneas (Hough Transforms), etc.

Generalmente la umbralización es una función de determinante en imágenes:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV SUBTRACCION DE FONDO: Esta sección

T(x, y)

A(P(x, y), F(x, y),P(x, y))= true

B(P(x, y), F(x, y),P(x, y))= false La función nombrada F(x, y),P(x, y) es representada como g(x, y) < P(x, y) < h(x, y) donde g y h son función de los valores de los píxeles y generalmente son valores constantes. Hay 2 tipos básicos de operaciones de umbralizamiento. El primero es una función predeterminada independiente de la localización que es g(x, y) y h(x, y) que son constantes de la imagen. Sin embargo para una imagen más concreta el valor de la constante puede calcularse con un histograma de imágenes (histograms) o criterio estático (image statics)

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 función elige g(x) y h(x) dependiendo del píxel de al lado para extraer regiones variando el contraste y el brillo las funciones descriptas en este capítulo 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 tamaño 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 -
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.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV src(x,y), otherwise Motion Representation Figure

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)<timestamp-duration

mhi(x,y)

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 Sxxyto the Sobeloperator X and Syxyto the

operator Y, then the orientation of the gradient iscalculated as:

Axy= arctanSyxySxxy

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.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV That is, MHI pixels where
  • 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.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV That is, MHI pixels where

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.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Mask image; marks pixels where

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.

CalcGlobalOrientation

Calculates global motion orientation of some selected region

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

orientation

double timestamp, double duration );

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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV orientation double timestamp, double duration

, where N is the number of the frames collected, and standard deviation as .

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV orientation double timestamp, double duration

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:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV The functions from the section

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:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV threshold_type=CV_THRESH_BINARY: dst(x,y) = max_value, if

Umbralización/binarización de una imagen:

void cvThreshold (const CvArr* src, CvArr* dst, double threshold,

double maxValue, int thresholdType) Umbraliza la imagen según el método 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 umbralización 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 función de los niveles de gris de cada píxel considerado y de los de su entorno. A estas operaciones se las conoce comúnmente como filtros. Se clasifican, a su vez, según la función de transformación, en:

Lineales.

La imagen resultante es la convolución de una imagen inicial con una función local denominada máscara. Esta máscara puede ser de dimensión cualquiera y puede estar centrada en cualquier píxel. En las siguientes figuras se muestra el mecanismo de convolución de una imagen con una máscara de 3x3 centrada en el píxel de posición central.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV La imagen se transforma en
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV La imagen se transforma en
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV La imagen se transforma en
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV La imagen se transforma en
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV La imagen se transforma en
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV La imagen se transforma en

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

Acción conjunta de las máscaras:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:

El filtro de Sobel permite calcular derivadas conjuntas en X e Y, derivadas segundas, terceras, etc. Realmente, en dos o más dimensiones, en lugar de la derivada tiene más sentido el concepto de

gradiente.

El gradiente indica la dirección de máxima variación de una función (en 2D, la máxima pendiente).

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:

VECTOR GRADIENTE.

Se define el vector gradiente de una función f(x,y) como:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:

Magnitud

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:

Ángulo o argumento.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:

El gradiente en un punto es un vector (u, v):

Ángulo: dirección de máxima variación.

Magnitud: intensidad de la variación.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Acción conjunta de las máscaras:

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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,

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

Introducción:

Se define un motor como aquella máquina eléctrica rotativa que es capaz de transformar energía eléctrica en energía mecánica. Los denominados motores paso a paso, son un caso bastante particular dentro de los motores en general. La señal eléctrica de alimentación 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 posición. Dependiendo de las características constructivas del motor este paso puede ser desde 90º hasta incluso 0,9º. Por lo tanto, si somos capaces de mover el motor en pequeños pasos, esto nos va a permitir controlar su posición, con mayor o menor precisión dependiendo del avance de cada paso. Además, variando la frecuencia con la que se aplican los pulsos, también 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 alimentación aplicados a las bobinas, estaremos realizando una inversión 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 posición.

  • Controlar velocidad.

  • Controlar sentido de giro.

Debido a las características anteriores se pueden encontrar motores paso a paso en robótica, control de discos duros, flexibles, unidades de CDROM o de DVD e impresoras, en sistemas informáticos, manipulación y posicionamiento de herramientas y piezas en general. Algún inconveniente de los motores PaP es que presentan una velocidad angular limitada. Dicha limitación surge ya que para realizar un paso, el motor requiere un tiempo para alcanzar la posición de equilibrio. Si dicho tiempo no se respeta (si la frecuencia de los pulsos es demasiado elevada) perderíamos el control sobre él, es decir, se movería en forma de vaivén, no se movería, o incluso podría moverse en sentido contrario al deseado.

TIPOS DE MOTORES PaP Desde el punto de vista constructivo existen tres tipos de motores PaP:

  • 1. De imán permanente: es el tipo de motores PaP más utilizado, sus características constructivas son las siguientes:

    • El rotor está formado por un imán permanente, en forma de disco, y en cuya superficie se encuentran mecanizados un determinado número de dientes.

    • El estator tienen forma cilíndrica, y en su interior se encuentran diversos bobinados, que al ser alimentados secuencialmente generan un campo magnético giratorio.

    • Como resultado de las fuerzas de atracción-repulsión, el rotor se orientará dentro de este campo magnético giratorio, lo que provocará su movimiento.

    • La conmutación en la alimentación 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

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV 2. De reluctancia variable: 
  • 2. De reluctancia variable:

    • El estator es similar al caso anterior.

    • El rotor no es un imán permanente, sino que está formado por un núcleo 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 magnético. En estas condiciones, el rotor se orienta hacia aquella posición en la que la reluctancia que presenta el circuito es mínima. Esta posición será aquella en la que el entrehierro sea el más pequeño posible. Al cambiar la alimentación a otra de las bobinas, el punto de mínima reluctancia también cambia, con lo cual el rotor gira de nuevo.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV 2. De reluctancia variable: 
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV 2. De reluctancia variable: 

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 35 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Funcionamiento de un motor paso

Funcionamiento de un motor paso a paso de reluctancia variable

  • 3. Híbridos: 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 están montados sobre un eje que es un imán permanente.

MOTORES PaP DE IMÁN PERMANENTE Nos centramos en este tipo de motores, ya que como se ha citado anteriormente son los más utilizados. Los motores de imán permanente pueden ser clasificados en función del sentido de la intensidad que recorre los bobinados en dos grupos:

  • 1. MOTORES PAP BIPOLARES: están 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 Funcionamiento de un motor paso

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 apreciarán 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 según 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.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV 2. MOTORES PAP UNIPOLARES: en

PRINCIPIO FUNCIONAMIENTO El principio de funcionamiento de los motores PaP de imán permanente, como ya se ha citado anteriormente, está basado en las fuerzas de atracción-repulsión que experimentan los cuerpos sometidos a un campo magnético.

  • MOTOR BIPOLAR

Si aplicamos intensidad a ambas bobinas, de la manera que indica en la figura A, el rotor girará

hasta la posición indicada en dicha figura. Si se invierte el sentido de la intensidad aplicada a la bobina de terminales AB, el campo magnético variará, y el rotor girará de nuevo orientándose 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
A
B
B

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 37 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV D A continuación se detalla

D

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV D A continuación se detalla

A continuación se detalla la secuencia de excitación 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 ningún tipo de control. Para aumentar la resolución, se tienen varias opciones. La más sencilla de todas y que no necesita un cambio constructivo del motor, consiste en cambiar la secuencia de alimentación. En modo de funcionamiento de paso completo, las bobinas nunca quedan sin alimentación. Pues bien, si entre cada cambio en la tensión de alimentación de una bobina, esta se deja sin alimentar, podemos conseguir una posición 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:

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 38 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV VARELA, E. PALOMEQUE, C. MALESPINA,

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 39 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

A continuación se detalla la secuencia de excitación 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 simultáneamente 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 A continuación se detalla la
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV A continuación se detalla la
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV A continuación se detalla la

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B. 19/11/2007
CALLA, B.
19/11/2007

- 40 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

A continuación se muestra la secuencia de excitación de bobinas para el funcionamiento de un motor unipolar en modo paso completo.

Paso

Común

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 resolución mayor si entre paso y paso

dejamos una bobina sin alimentar. A continuación se muestra la secuencia de excitación de bobinas para el funcionamiento de un motor unipolar en modo medio paso.

 

Paso

Común

A

B

C

D

 
  • 1 Masa

 

+V

0

+V

0

 

Masa

0

0

+V

0

 
  • 2 +V

Masa

0

 

+V

0

 

Masa

0

+V

0

0

 
  • 3 +V

Masa

0

 

0

+V

 

Masa

0

0

0

+V

  • 4 Masa

 

+V

0

0

+V

 

Masa

+V

0

0

0

  • 5 Masa

 

+V

0

+V

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

Configuración del puerto para Dev-C++

El problema de la configuración 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 continuación 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 librería 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 diseño un Driver, el cual posee 2 entradas de control para comandar el motor. Una de ellas comanda la dirección o sentido de movimiento y la otra se encarga de variar la velocidad mediante un tren de pulsos de frecuencia variable. Además estas entradas se encuentran opto-aisladas con el fin de brindar protección al puerto paralelo del ordenador, que es el encargado de brindar dichas señales. Es decir separar el circuito de potencia del circuito de control. Esta opto-aislamiento se logra mediante el circuito integrado 4N25. Luego estas señales son tomadas por el controlador SAA1027 el cual genera una secuencia de salida dada por la tabla siguiente:

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV } Driver Motor paso a

La secuencia de salida es usada para producir el disparo de Transistores PNP encargados de excitar las bobinas del motor. El esquemático es el siguiente:

12v U1 24v 1 6 bit2 GND 13 5 bit1 2 14 4 4 PNP 3
12v
U1
24v
1
6
bit2
GND
13
5
bit1
2
14
4
4
PNP
3
6
Puerto paralelo
2
15
8
4N25
9
5
11
U2
12
1
6
bobina N
SAA1027
5
4
2
4N25
VARELA, E. PALOMEQUE, C. MALESPINA, G
CALLA, B.
19/11/2007

- 43 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

Interconexión 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 continuación puede observarse gráficamente la configuración de un puerto paralelo.

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Interconexión de los dispositivos: El

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

Puerto Paralelo

Bit0 bit1

Bit10 Bit11

Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Interconexión de los dispositivos: El
Controlador del motor Paso a Paso
Controlador
del motor
Paso a Paso
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Interconexión de los dispositivos: El
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Interconexión de los dispositivos: El

VARELA, E. PALOMEQUE, C. MALESPINA, G

Finales de

 

Carrera

 

Motor

 

CALLA, B.

19/11/2007

- 44 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

PROGRAMA PRINCIPAL

INICIO
INICIO
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV PROGRAMA PRINCIPAL INICIO Definiciones Globales

Definiciones Globales de Variables y Estructuras

Definiciones Globales de Variables y Estructuras Inicializacion Para el uso del puerto Paralelo Verificacion de sensores

Inicializacion Para el uso del puerto Paralelo

Verificacion de sensores
Verificacion
de sensores
Verificacion de sensores

Posicionamiento Inicial de la Camara

Definiciones Globales de Variables y Estructuras Inicializacion Para el uso del puerto Paralelo Verificacion de sensores

Inicializacion de Captura de imagenes y ventana de visualizacion

Definiciones Globales de Variables y Estructuras Inicializacion Para el uso del puerto Paralelo Verificacion de sensores
Definiciones Globales de Variables y Estructuras Inicializacion Para el uso del puerto Paralelo Verificacion de sensores
Definiciones Globales de Variables y Estructuras Inicializacion Para el uso del puerto Paralelo Verificacion de sensores

Funcion Actualiza MHI

Definiciones Globales de Variables y Estructuras Inicializacion Para el uso del puerto Paralelo Verificacion de sensores
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV PROGRAMA PRINCIPAL INICIO Definiciones Globales
Reposicionamiento de la camara
Reposicionamiento de la
camara
Verificacion de sensores
Verificacion
de sensores
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV PROGRAMA PRINCIPAL INICIO Definiciones Globales
Mensaje de Chequeo de la integridad de los sensores
Mensaje de Chequeo de la
integridad de los sensores
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV PROGRAMA PRINCIPAL INICIO Definiciones Globales
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV PROGRAMA PRINCIPAL INICIO Definiciones Globales
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV PROGRAMA PRINCIPAL INICIO Definiciones Globales

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
Funcion Actualiza MHI
Inicializacion de varibles
Inicializacion de varibles
Inicio o nuevo posicionamiento
Inicio o nuevo
posicionamiento
Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

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

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Obtener diferencia de imagenes

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Umbralizacion para obtencion de silueta valida

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Actualizacion MHI

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Calculo gradientes de movimiento

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Calculo Orienteacion Global

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Verificacion Sensores

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes

Movimiento de la Camara

Conversion de nuevo frame a escala de grises y almacenamiento en Buffer Obtener diferencia de imagenes
Fin
Fin
Proyecto Integrador TD III DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV Funcion Actualiza MHI Inicializacion de
Actulizar tamaños y/o estructuras de datos
Actulizar tamaños y/o
estructuras de datos

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 46 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

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

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;

// parámetros 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;

// Imágenes temporarias

IplImage*mhi=0,*orientación=0,*mascara=0,*silueta=0;

// definición del prototipo de la función Inp32 (tipo de definición):

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

// tomar tiempo actual en seg.

//tomar actual tamaño

//////////Definiciones para el uso del puerto////////// HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32;

//cargamos la librería para poder usar los puertos// hLib = LoadLibrary("inpout32.dll"); inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");

// Coloca imágenes en el comienzo o recambia si el tamaño 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]));

memoria

// malloc reserva

memset( buffer, 0, N*sizeof(buffer[0]));

 

// en tiempo de

ejecución devuelve }

// puntero a la primer

posición

 

// La inicializa con

cero

for( i = 0; i < N; i++ ) imagenes en buffer {

// N numero de

VARELA, E. PALOMEQUE, C.

MALESPINA, G

CALLA, B.

19/11/2007

- 47 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

 

cvReleaseImage( &buffer[i] );

// Libera contenido de

buffer

 

buffer[i] = cvCreateImage( Size, IPL_DEPTH_8U, 1 );

// crea imagen del

tamaño

cvZero( buffer[i] );

} cvReleaseImage( &mhi ); contenidos de:

cvReleaseImage( &orientación ); cvReleaseImage( &mascara );

mhi = cvCreateImage( Size, IPL_DEPTH_32F, 1 ); del tamaño actual cvZero( mhi );

comienzo

// Libera los

//crea imágenes aux

//borra MHI en el

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, orientación, 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( orientación, mascara, mhi, timestamp, MHI_DURACION); Angulo = 360.0 - Angulo;

//Chequea para el caso de un pequeño 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 dirección 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); //derecha 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
(oup32)(io,x);
//derecha
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);
//izquierda
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++;
}
}
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);

//izquierda

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

//derecha

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;

VARELA, E. PALOMEQUE, C. MALESPINA, G

CALLA, B.

19/11/2007

- 50 -

Proyecto Integrador TD III

DETECCION Y SEGUIMIENTO DE OBJETOS CON OPENCV

(oup32)(io,x);

//izquierda

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

cvNamedWindow( "SIGUIENDO OBJETO", 0 );

for(;;) { IplImage* imagen = cvQueryFrame( captura ); actualizar_mhi( imagen ); cvShowImage( "SIGUIENDO OBJETO", imagen );

cvWaitKey(10);

} cvReleaseCapture( &captura ); cvDestroyWindow( "SIGUIENDO OBJETO" );

}

//tomar actual tamaño de la

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 tamaño de la ventana es automáticamente ajustado a la imagen (ver cvShowImage), el usuario no puede cambiar el tamaño de la ventana manualmente.

La función cvNamedWindow crea una ventana la cual puede ser usada como lugar para imágenes 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 específica

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 tamaño 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 función cvWaitKey espera por un evento de tecla indefinidamente (delay<=0) o por "delay" milisegundos. Devuelve el código 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 pública y es solamente usada como parámetro 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 );

index

Índice de la cámara a ser usada. Si hay solo una cámara o si no es asunto que cámara usar

-1 debe ser pasado. La función cvCaptureFromCAM coloca e inicializa la estructura CvCapture para leer el flujo de video desde la cámara. Actualmente dos interfaz de cámara 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 función 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 función 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 tamaño de un rectángulo

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

Tamaño de un rectángulo 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 función puede crear imagen intercaladas solamente.

ReleaseImage

Libera dirección 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 tamaño 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 discusión.

mask

Mascara opcional de operación.

La función cvNorm calcula la norma absoluta de arr1 si arr2 es NULL:

norm = ||arr1|| C = max I abs(arr1(I)), norm = ||arr1|| L1 = sum I abs(arr1(I)),

si normType = CV_C si normType = CV_L1 si normType = CV_L2

norm = ||arr1|| L2 = sqrt( sum I arr1(I) 2 ),

Y la función calcula norma absoluta o relativa diferencia si arr2 es no NULL:

norm = ||arr1-arr2|| C = max I abs(arr1(I)-arr2(I)), if normType = CV_C

norm = ||arr1-arr2|| L1 = sum I abs(arr1(I)-arr2(I)), if normType = CV_L1

norm = ||arr1-arr2|| L2 = sqrt( sum I (arr1(I)-arr2(I)) 2 ), o

if normType = CV_L2

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 función 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 precisión (32f).

dst

 

La imagen de destino del mismo tipo de datos. El número de canales debe ser diferente.

code

operación de conversión de color que puede ser especificada como:

CV_<src_color_space>2<dst_color_space> constants (see below).

La función 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 B 0 G 0 R 0 B 1 G 1 R 1

toma formato 24-bit con capas R 0 G 0 B 0 R 1 G 1 B 1 El rango convencional de los valores de canales R,G,B es:

...

).

0

255

para 8-bit imágenes

0

65535

para 16-bit imágenes

0

1

para imágenes de punto flotante.

...

, mientras RGB

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 función 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

-1.53715 -0.498535| |X|

 

|G| <- |-0.969256

1.875991

0.041556|*|Y|

|B|

| 0.055648

-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

 

0

1

range

 

V <- max(R,G,B) S <- (V-min(R,G,B))/V

if V≠0, 0 otherwise

 

(G - B)*60/S,

if V=R

if V=G

if V=B

 

H <- 180+(B - R)*60/S,

240+(R - G)*60/S,

if H<0 then H<-H+360

 

On output 0≤V≤1, 0≤S≤1, 0≤H≤360.

 

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)

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

1

range

.. 0

V max <- max(R,G,B) V min <- min(R,G,B)

L <- (V max + V min )/2

S <- (V max - V min )/(V max + V min )

if L < 0.5

(V max - V min )/(2 - (V max + V min ))

if L ≥ 0.5

(G - B)*60/S,

if V max =R

H <- 180+(B - R)*60/S,

if V max =G

240+(R - G)*60/S,

if V max =B

if H<0 then H<-H+360

On output 0≤L≤1, 0≤S≤1, 0≤H≤360.

 

The values are then converted to the destination data type:

8-bit images:

L <- L*255, S <- S*255, H <- H/2

L <- L*65535, S <- S*65535, H <- H

16-bit images (currently not supported):

 

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*Y 1/3

for Y>0.008856

L <- 903.3*Y

for Y<=0.008856

a <- 500*(f(X)-f(Y)) + delta

f(t)=7.787*t+16/116

for t>0.008856

b <- 200*(f(Y)-f(Z)) + delta

where f(t)=t 1/3

for t<=0.008856

where delta = 128 for 8-bit images,

0 for floating-point images

On output 0≤L≤100, -127≤a≤127, -127≤b≤127

 

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*Y 1/3

for Y>0.008856

L <- 903.3*Y

for Y<=0.008856

u' <- 4*X/(X + 15*Y + 3*Z)

 

v' <- 9*Y/(X + 15*Y + 3*Z)

u <- 13*L*(u' - u n ), where u n =0.19793943

v <- 13*L*(v' - v n ), where v n =0.46831096

On output 0≤L≤100, -134≤u≤220, -140≤v≤122

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

B

G

B

G

R

G

R

G

R

G

B

G

B

G

R

G