Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cruz
Cruz
26 de septiembre de 2006
II
Bases Teóricas introduce los conceptos de visión y percepción realizando una re-
visión histórica de la atención visual, explica los componentes y funciones
del ojo humano, y hace un repaso de las técnicas de seguimiento de mirada
actuales.
Desarrollo del Sistema explica el proceso de creación del sistema, desde las fa-
ses preliminares hasta la especificación completa, pasando por los procesos
experimentales que han llevado ha implementarlo de manera eficiente, así
como una descripción de todas las herramientas utilizadas.
Manuales explica al usuario con detalle la instalación y uso del sistema, y describe
la estructura interna de la aplicación.
Anexos da una muestra de las aplicaciones con las que se puede utilizar el sistema
así como posibles ampliaciones y mejoras para futuras versiones.
0.2. Agradecimientos
Al personal del Área de Robótica y Visión Artificial por su apoyo durante todo este
tiempo, en especial a José Moreno, Pablo Bustos y Pilar Bachiller.
A Agustín, Álvaro y José por ayudarme con el “maravilloso” mundo del hardware.
A Gonzalo y a Pablo por su ayuda durante la realización de este proyecto.
A mis padres por su apoyo durante estos 5 años (...y decíais que no iba a ser capaz
:) ).
Introducción III
0.2. Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . IV
Lista de Figuras 1
I Bases Teóricas 5
1.4.6. Vestibulares . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.7. Nistagmos . . . . . . . . . . . . . . . . . . . . . . . . . 23
II Desarrollo 29
4. Desarrollo Experimental 45
4.1. Desarrollo Experimental del Hardware . . . . . . . . . . . . . . . 45
4.1.1. Cambio de Filtros . . . . . . . . . . . . . . . . . . . . . . 45
4.1.2. Sustitución de Baterías por Transformador . . . . . . . . 47
5. Herramientas Utilizadas 71
5.1. Sistema Operativo . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.1.1. Debian GNU/Linux . . . . . . . . . . . . . . . . . . . . . 71
5.2. Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.2.1. KDevelop . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.2.2. GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.2.3. GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.2.4. Doxygen . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.2.5. Gimp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.2.6. Kimage . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.2.7. Kile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.2.8. Microsoft Visio . . . . . . . . . . . . . . . . . . . . . . . 75
5.3. Librerías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.3.1. Qt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.3.2. IPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.3.3. STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.3.4. OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.3.5. OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.3.6. FFmpeg . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
III Manuales 79
6. Manual de Usuario 81
6.1. Instalación y Puesta a Punto del Hardware . . . . . . . . . . . . . 81
6.2. Instalación de las Librerías Necesarias . . . . . . . . . . . . . . . 83
6.3. Compilación e Instalación del Programa . . . . . . . . . . . . . . 84
6.4. Configuración del Sistema con Eyeboardconfig . . . . . . . . . . 84
6.4.1. Fichero de Configuración del Sistema . . . . . . . . . . . 86
6.5. Calibración y Uso de itune . . . . . . . . . . . . . . . . . . . . . 86
6.6. Escritura con la Mirada con EyeBoard . . . . . . . . . . . . . . . 89
6.7. Realización de Pruebas con infrared . . . . . . . . . . . . . . . . 89
7. Manual de Programador 93
7.1. Diseño Global . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.2. Documentación de clases . . . . . . . . . . . . . . . . . . . . . . 95
7.2.1. Referencia de la Clase pt::readers::AviReader . . . . . . . 95
7.2.2. Referencia de la Clase AviReader . . . . . . . . . . . . . 101
7.2.3. Referencia de la Estructura pt::readers::AviReader::Avi-
StreamHeader . . . . . . . . . . . . . . . . . . . . . . . . 102
7.2.4. Referencia de la Estructura pt::readers::AviReader::SAvi-
MainHeader . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.2.5. Referencia de la Estructura pt::readers::AviReader::SAvi-
OldIndex . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.2.6. Referencia de la Estructura pt::readers::AviReader::SAvi-
OldIndexEntry . . . . . . . . . . . . . . . . . . . . . . . 107
7.2.7. Referencia de la Estructura pt::readers::AviReader::STag-
BITMAPINFO . . . . . . . . . . . . . . . . . . . . . . . 107
7.2.8. Referencia de la Estructura pt::readers::AviReader::STag-
BITMAPINFOHEADER . . . . . . . . . . . . . . . . . . 108
7.2.9. Referencia de la Estructura pt::readers::AviReader::STag-
RGBQUAD . . . . . . . . . . . . . . . . . . . . . . . . . 110
7.2.10. Referencia de la Estructura pt::readers::Avi-
Reader::SWaveFormatEx . . . . . . . . . . . . . . . . . . 110
7.2.11. Referencia de la Clase pt::processing::BaseProcessing . . 111
IV Anexos 229
Bibliografía 239
Índice 240
2.1. EOG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2. Reflexiones Purkinje . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3. VisionTrak© de Polhemus . . . . . . . . . . . . . . . . . . . . . 28
Bases Teóricas
Capítulo 1
Hace más de un siglo que se empezó a estudiar la atención visual. Los primeros
estudios se limitaban a simples observaciones oculares. Desde entonces, este cam-
po ha crecido mucho, implicando a varias ramas de la ciencia. En esta sección se
muestra una revisión de las ideas principales a lo largo de la historia.
En la segunda mitad del siglo 19, Von Helmholtz (1925) pensaba que la atención
visual era un mecanismo esencial en la percepción visual. En su Tratado sobre óp-
tica fisiológica dijo: “Dejamos que nuestros ojos vaguen continuamente sobre el
campo visual, porque es la única forma que tenemos de ver todos los objetos de
nuestro campo tan distintamente como se pueda”. También observó que la tenden-
cia natural de la atención se centra en los objetos nuevos. También señaló que la
atención puede ser controlada voluntariamente moviendo los ojos.
Las primeras grabaciones de los movimientos de los ojos sirvieron para poner en
duda la hipótesis de Gestalt, que afirmaba que el reconocimiento es un proceso de
un solo paso en paralelo. Las primeras grabaciones sirvieron para mostrar que el
reconocimiento visual es en serie.
Yarbus en 1967 midió los movimientos de los ojos de ciertos sujetos sobre una ima-
gen después de proponerle a los mismos ciertas cuestiones sobre la imagen. Yarbus
demostró patrones de visión secuenciales sobre ciertas regiones de la imagen.
Noton y Stark realizaron sus propios experimentos y extendieron los resultados
de Yarbus, concluyendo que a pesar de proponer determinadas cuestiones a los
sujetos, éstos tienden a fijarse en determinadas zonas de interés. El recorrido ocular
sobre estas regiones era diferente entre los sujetos. Por ejemplo, dado un cuadrado,
éstos tienden a fijarse en las esquinas, pero cada uno en un orden diferente.
Posner sugirió que el centro de atención es capaz de moverse por la escena. Posner
et al. diferenciaron el centro de atención del punto de mira, y dijeron que el meca-
nismo de atención era diferente de los movimientos de los ojos. Según ellos, por
un lado se encontraba la atención y por otro la orientación.
da, dado que hay mucha más información en el campo visual de la que puede ser
procesada. La novedad de la ventana de atención es que puede ser reescalada.
Los movimientos de los ojos pueden apoyar la teoría del “qué” y del “dónde”. La
visión se comporta muy probablemente como un proceso cíclico compuesto por
los siguientes pasos:
3. Una vez que los ojos han realizado su movimiento, la fóvea se dirige a la
región de interés, y la atención se centra en la percepción del rasgo en alta
resolución.
Este modelo es correcto pero incompleto, dado que existen varios asuntos no ex-
plicados:
Figura 1.2: Vista simplificada de los caminos visuales. Duchowski (2003) Eye Tra-
cking Methodology: Theory and Practice
permitiendo una alta resolución de una pequeña pate del total, esto supone un 3 %
del tamaño de un monitor a una distancia normal. Aproximadamente el 90 % del
tiempo de la visión se gasta en fijaciones. Cuando la visión se dirige a una nueva
área, los sacádicos reposicionan la fóvea frente a la imagen.
El cerebro está compuesto por un gran número de regiones clasificadas según la
función que realizan. Una representación simplificada del cerebro se muestra en la
figura 1.2 y el nombre de los lóbulos en la figura 1.3 El Sistema Humano Visual se
encuentra descrito en función de las conexiones entre la retina y las regiones cere-
brales, conocidas como caminos visuales. Las siguientes regiones neuronales son
particularmente importantes en la percepción visual y en los movimientos oculares:
Áreas V2, V3, V3A, V4, MT: procesamiento de la forma, el color, y el mo-
vimiento.
Área LIP (Lateral Intra-Parietal): contiene campos receptores que son corre-
gidos antes de cada sacádico.
1.2.1. El Ojo
Sin embargo, el ojo está dotado con varios mecanismos que reducen las imperfec-
ciones:
Como se puede apreciar en la vista lateral (Figura 1.5), y en la vista superior (Figura
1.6), el ojo se encuentra compuesto por varias partes:
1.2.1.1. La Córnea
Epitelio
Membrana de Bownman
Estroma
Figura 1.6: Vista superior del ojo humano. Duchowski (2003) Eye Tracking Met-
hodology: Theory and Practice
Membrana de Descemet
Endotelio
1.2.1.2. El Cristalino
1.2.1.3. La Esclerótica
1.2.1.4. La Pupila
La pupila es el parte central del iris. Se trata de una abertura dilatable y contráctil
de color negro con la función de regular la iluminación que le llega a la retina, en
la parte posterior del ojo. Mide entre 2 y 8 mm.
1.2.1.5. El Limbo
1.2.1.6. El Iris
El iris es una membrana coloreada y circular que separa las cámara anterior y
posterior del ojo. Posee una apertura central de tamaño variables, la pupila que
comunica la cámara anterior del ojo con la cámara posterior.
Está constantemente activa permitiendo a la pupila dilatarse (midriasis) o contraer-
se (miosis).Está función tiene su objetivo en la regulación de la cantidad de luz que
llega a la retina.
Es un líquido claro y aguado que fluye por los espacios difíciles en la parte frontal
del ojo, limitado por la córnea delante y por el humor vítreo detrás. El humor
acuoso permite que los nutrientes circulen por el endotelio corneal y que la presión
mantenga a la córnea convexa.
1.2.1.9. La Retina
1.2.1.10. La Fóvea
Figura 1.9: Ángulo Visual. Duchowski (2003) Eye Tracking Methodology: Theory
and Practice
Figura 1.12: Músculos oculares: 1 recto superior, 2 elevador del párpado superior,
3 recto lateral, 4 recto medio, 5 oblícuo superior, 6 tendón reflejado del oblícuo
superior, 7 anillo de Zinn, 8 recto inferior, 9 oblícuo inferior. Duchowski (2003)
Eye Tracking Methodology: Theory and Practice
las zonas alejadas, disminuyendo esta sensibilidad cuanto más nos alejemos de la
fóvea.
Todos los movimientos oculares utilizados por los primates son combinaciones
de 5 tipos básicos: sacádicos, persecuciones lentas, vergencias, vestibulares y nis-
tagmos. Existen otros movimientos asociados, pero que no son utilizados para el
reposicionamiento de la fóvea, como la dilatación de la pupila, o el ajuste de las
lentes.
Los ojos se mueven con seis grados de libertad, tres traslaciones, y tres rotacio-
nes. Existen seis músculos responsables del movimiento ocular: el recto medio
y lateral (movimientos hacia los lados), el recto superior e inferior (movimientos
hacia arriba y hacia abajo), y los oblícuos superior e inferior (rotaciones). Se en-
cuentran descritos en la figura 1.12. El sistema encargado del movimiento ocular
forma un circuito realimentado y las señales que controlan el movimiento de los
ojos provienen de regiones del córtex que proporcionan movimientos voluntarios
(córtex occipital), involuntarios (colículo superior) y reflejos (canales semicircula-
res). Este circuito de realimentación es utilizado principalmente para estabilizar el
movimiento ocular.
1.4.2. Sacádicos
Son los movimientos más conocidos de los ojos. Son voluntarios (exceptuando la
fase REM del sueño) y sirven para poder visualizar distintas partes de una escena.
Sirven para que la imagen de la escena sea proyectada en la fóvea, que posee una
mayor agudeza visual. Durante la duración del sacádico, mientras el ojo se mue-
ve, se produce un fenómeno llamado supresión sacádica, llamado así porque la
recogida de información queda prácticamente interrumpida.
Existe una relación entre la cantidad de movimiento que se realiza y la velocidad
adquirida por el ojo, cuanto mayor es el ángulo a desplazar, mayor es la velocidad
alcanzada. Un sacádico que se mueva 80◦ alcanzará una velocidad de 700 grados
por segundo. Por otro lado, la duración de un sacádico depende de su magnitud,
y en general se encuentra entre 30 y 120 milisegundos. Por término medio, un
humano pasa 90 minutos al día realizando movimientos sacádicos. Si el sacádico
tiene que cubrir más de 30◦ , la cabeza interviene en el movimiento también. Se ha
comprobado que entre la aparición de un estímulo, y el comienzo del movimiento
transcurren entre 180 y 300 milisegundos, además entre dos sacádicos consecutivos
existe un periodo refractario de unos 150 milisegundos.
1.4.3. Fijaciones
A cada sacádico le sigue una fijación, y entre ellos se producen interesantes in-
teracciones psicológicas. Durante una fijación no sólo se procesa la información
recogida por la fóvea, sino también la información periférica, en busca de estímu-
los.
Son movimientos producidos de forma simultánea por ambos ojos, y cuya finalidad
es la de situar sobre la fóvea ciertos estímulos que se están desplazando lentamente.
El ojo se mueve a 1-30◦ por segundo cuando realiza estos movimientos. En princi-
pio no son voluntarios, dado que su única funcionalidad es la de centrar la imagen
sobre la fóvea, aunque se pueden llegar a controlar.
1.4.5. Vergencias
Son movimientos que realizan ambos ojos aunque en direcciones opuestas, su ob-
jetivo pues, es conseguir que aparezca la misma imagen en la retina de ambos ojos,
variando la distancia de enfoque. Existen dos tipos: convergencia y divergencia. La
convergencia se produce cuando los ojos giran en dirección a la nariz, para enfo-
car un objeto que se acerca al sujeto. La divergencia es el movimiento contrario,
provocado cuando el objeto se aleja del sujeto. El ojo puede llegar a moverse a
10◦ /seg, alcanzando una amplitud de 15◦ .
1.4.6. Vestibulares
1.4.7. Nistagmos
El dispositivo utilizado para medir los movimientos de los ojos es llamado eye
tracker (Seguidor de ojos). Se pueden distinguir dos tipos de técnicas para moni-
torizar el movimiento: aquellas que miden la posición del ojo respecto a la cabeza
y aquellas que miden la orientación del ojo en el espacio, también conocido como
point of regard o punto de mirada.
Existen cuatro técnicas básicas de medición de movimiento ocular: electroocu-
lografía (EOG), lentes de contacto, foto o video oculografía y detección por video
basada en la pupila y la reflexión córnea.
2.1.1. Electro-oculografía
Una de las formas más exactas de medir el movimiento del ojo consiste en una
lente de contacto con un pequeño hilo de metal en ella, que se apoya directamente
26 Estado del Arte de los Eye Trackers
sobre el ojo. Las lentes de contactos son grandes, extendiéndose sobre la córnea
y la esclerótica. El hilo está arrollado en una vuelta y se encarga de medir las
variaciones de campo magnético. A pesar de ser el método mas preciso (es capaz
de medir variaciones de 5-10 arcosegundos) es también el método más intrusivo.
La inserción de las lentes requiere práctica y mucho cuidado, y el hecho de llevar
las lentes implica una incomodidad en los ojos. Este método mide la posición de
los ojos respecto a la cabeza, y tampoco es muy útil para medir el punto de interés
del ojo.
Existe una gran variedad de técnicas bajo esta denominación que se encargan de
extraer características de los ojos bajo la rotación y traslación, como la forma de
la pupila, la posición del limbo (la unión entre el iris y la esclerótica), las refle-
xiones córneas, etc. Aunque diferentes, ninguna de estas técnicas proporciona una
medición del punto de interés.
Las técnicas anteriores son válidas para medir el movimiento de los ojos, pero no
valen para medir el punto de interés, es decir el lugar exacto a donde el ojo está
mirando. Para poder medir esto, se necesita que la cabeza se encuentre quieta, para
que la posición del ojo coincida con el punto de interés. Este tipo de trackers ba-
sados en video pueden ser de dos tipos, aquellos en los que la cabeza se apoya y
se mantiene fija, o aquellos que se llevan integrados en la propia cabeza. Las refle-
xiones córneas son capturadas a la vez que el centro de la pupila, estas reflexiones
son conocidas con el nombre de reflexiones de Purkinje o imágenes de Purkinje.
Estos trackers capturan la primera imagen de Purkinje (el mayor de estos brillos)
y utilizan el vector formado por los puntos centro de la pupila y centro del brillo
como valor de posición de la pupila para el tracker. Se utiliza ese vector y no la
posición absoluta de la pupila como valor porque es más invariante a movimientos
accidentales del dispositivo y a movimientos de cabeza, que la posición absoluta
de la pupila. Con un proceso de calibración previo, estos trackers son capaces de
medir el punto de interés.
Existen dos tipos de trackers basados en luz infrarroja: los de pupila oscura y los
de pupila brillante. Cuando el haz de luz que ilumina el ojo es coaxial al camino
de visión, el ojo actúa como retroreflector, la luz se refleja en la retina y se produce
un efecto similar al de los ojos rojos en las fotografías, produciendo una pupila
brillante en la captura de la misma. Si existe un desplazamiento entre la luz y el
camino de visión, la pupila será capturada con un color muy oscuro: pupila oscura.
Los sistemas de seguimiento de mirada han alcanzado una popularidad muy gran-
de en los últimos años dado que tienen aplicación en diversos campos: psicología,
psicolinguística, interacción hombre máquina, márketing. . . Debido a ello han sur-
gido aplicaciones comerciales que tratan de proporcionar productos de alto nivel
para satisfacer la demanda actual. Existen principalmente dos sistemas de segui-
miento de mirada que han de ser tomados como referentes en el estado actual de
los mismos:
Desarrollo
Capítulo 3
Una sola persona debe poder hacer un uso completo del sistema. De esta
forma se proporciona una mayor independencia al usuario.
El sistema debe ser extensible, esto es, debe permitir futuras incorporaciones
de nuevos subsistemas para convertirlo en un sistema multimodal.
El sistema ha de poder ser utilizado por el mayor número de personas posi-
bles.
cen símbolos, mientras que la otra mitad genera órdenes. Para utilizarlo con
comodidad es imprescindible no tener discapacidades físicas en las extremi-
dades superiores.
Ratón Es un dispositivo apuntador diseñado para ser utilizado con una mano (ima-
gen 3.2). Se mueve en una superficie bidimensional detectando el movimien-
to, contiene botones e incluso una rueda que permiten realizar acciones al
usuario. Existen varios tipos de ratones en función del mecanismo interno:
mecánicos, ópticos e inerciales pero todos están diseñados para humanos sin
discapacidad en al menos una mano.
Joystick Consiste en un stick o “palo” situado sobre una base con botones, que
tiene botones y se mueve en dos o tres dimensiones. Son utilizados sobre
todo en juegos, e ideales para simuladores de vuelo y control de máquinas.
Para su uso se necesitan un par de manos humanas funcionales.
Existen muchos más dispositivos de entrada que utilizen cámaras y visión artificial,
pero muchos siguen requiriendo que el usuario realice grandes movimientos para
poder controlar el ordenador. El uso de movimientos limita su utilización por lo
tanto la técnica que permite el uso del ordenador a mayor número de usuarios debe
ser una basada en un eyetracker. La técnica oculográfica y la basada en lentes de
contacto son demasiado intrusivas, lo cual no encaja con los objetivos del proyecto.
Los periféricos tradicionales solo pueden ser utilizados por personas sin discapa-
cidad en las extremidades superiores. Los dispositivos visuales pueden permitir
el uso de los ordenadores por discapacitados, pero siempre y cuando no necesi-
ten grandes movimientos por parte del usuario (ej. EyeToy). El movimiento más
sencillo es el movimiento del ojo, por lo tantoy según todo lo visto anteriormente
(capítulo 2), la técnica que mejor encaja es un eye tracker basado en vídeo:
Puede ser utilizado con los ojos e incluso con un solo ojo.
Según la bibliografía consultada ([23] [22] [20] [19] [31]) el mejor sistema eyetra-
cker visual es aquel formado por dos cámaras, una que apunta al ojo del usuario y
otra que apunta hacia lo que está situado enfrente del usuario.
Por lo tanto se van a utilizar dos minicámaras (cámaras espía) montadas sobre un
dispositivo preparado para llevar puesto en la cabeza. Una cámara captará longi-
tudes de onda infrarrojas y estará apuntando a la cabeza del usuario, dispuesta a
capturar las posiciones en las que se encuentra su pupila, mientras que otra cámara
centrará su atención en lo que el usuario tiene frente a sí. Se prefiere utilizar el
espectro infrarrojo para capturar posiciones de pupila por los siguientes motivos:
El software será desarrollado acorde con los requisitos del hardware. Se realizará
un proceso continuo de captura de cada una de las cámaras. Por un lado se realizará
la detección de la pupila y el cálculo de su centro, y por otro se detectarán aspectos
del mundo. La solución para encontrar una correspondencia entre posiciones de
pupila y lugares del mundo (visibles mediante la cámara que apunta hacia delante)
es realizar una calibración. En la bibliografía consultada la calibración es realizada
por dos usuarios, uno se lleva el sistema en su cabeza y mira a un lugar donde
haya una serie de puntos y otro se encargará de utilizar el ordenador que realiza las
capturas.
Se desarrollarán dos aplicaciones, una encargada de realizar la calibración, que
pueda ser utilizada por un solo usuario, y otra que se encargue de utilizar la infor-
mación de calibración para hacer algo utilizable por el usuario. Esta última estará
formada por un teclado virtual mostrado en el monitor que permita al usuario escri-
bir con el ojo y unos puntos de detección, para que el sistema sepa el lugar exacto
al que está mirando.
El uso del sistema propuesto no supone ningun tipo de problema dado que lo único
que hay que hacer es mirar a un lugar. El único punto donde puede encontrarse algo
En esta sección se muestran los Diagramas de Flujo de Datos del Sistema. Cada
uno de los tres diagramas se corresponde con cada una de las tres aplicaciones del
sistema.
Diagrama de Flujo de Datos de itune, aplicación utilizada para calibrar el sistema:
Usuario Representa al usuario que interactúa con el sistema indicando las opera-
ciones que desea realizar.
3.3.3.2. Almacenes
3.3.3.3. Procesos
Flujos de salida:
Flujos de salida:
Flujos de salida:
Desarrollo Experimental
El modelo de hardware final, “el casco”, no ha sido el mismo durante todo el desa-
rrollo. En una primera fase sólo se utilizaba el soporte de color verde (Ver 4.1) con
una sola cámara apuntando al ojo. Más tarde se añadió un filtro de infrarrojos para
esa cámara y se incorporó la segunda cámara. Después se sustituyeron las baterías
por un transformador y por último se realizó un pequeño ajuste en la posición de
la cámara del mundo.
Figura 4.4: Diferencia de calidad en los filtros: a) Filtros Lee. b) Filtro de carrete
El LED que ilumina con longitudes de onda infrarrojas recibe una corriente de
9V, para alimentarlo al principio se utilizaban baterías de 9V. Debido que el peso
Debido a que el ojo y la cámara del mundo se encuentra situadas en puntos distintos
del espacio, se producen desviaciones angulares en las posiciones aparentes de
los objetos. Este efecto se conoce como paralaje, y produce una variación en la
posición de los objetos distinta en función de la distancia al mismo.
4.2.1.1. Introducción
Figura 4.8: Diferencia entre una imagen con el ojo abierto y otra con el ojo cerrado
Teniendo en cuenta que una pupila iluminada con infrarrojos, posee un nivel de
gris mucho menor (más oscuro) que el resto del ojo (Ver figura 4.7), el método se
basa en recorrer la imagen y elegir aquél con menor nivel de gris, que se supone
que pertenece al interior de la pupila. Una vez detectado el punto interior, se realiza
un algoritmo de crecimiento y se elige aquel punto que corresponde con el centro
de gravedad de la masa de puntos formada por los puntos recorridos por el algo-
ritmo de crecimiento. Para encontrar el punto más oscuro se han realizado varias
aproximaciones:
Primera aproximación: Búsqueda del punto más oscuro. Como primera apro-
ximación, realizamos un recorrido de toda la imagen, para buscar el punto
más oscuro. Éste método tiene varios problemas: en primer lugar el número
de puntos recorridos en el algoritmo es width ∗ height lo cual implica una
gran carga computacional, en segundo lugar y más importante que el anterior
es que el punto más oscuro de la imagen puede estar situado en los bordes
de la imagen, debido a los factores de iluminación. Por lo tanto este método
queda descartado.
para extraer rectas de una imagen. Está basada en el hecho de que por un determi-
nado punto, pueden pasar infinitas rectas con distinta pendiente. El objetivo de la
transformada es determinar qué lineas pasan por más puntos. Para ello se realiza
un cambio de coordenadas, entre las coordenadas de los puntos candidatos (x, y)
y un espacio bidimensional llamado acumulador (r, θ). Para cada punto candidato
se realiza la transformada, se “dibuja” una linea senoidal en el acumulador y por
último se extraen aquellos puntos del acumulador que cumplen las características
deseadas (orientacion y posicion).
Esta transformada se puede generalizar para extraer otro tipo de formas, como por
ejemplo un círculo, aunque en este caso la matriz de acumulación sería tridimensio-
nal, para poder representar los tres parámetros que definen un círculo: coordenadas
x e y del centro y el radio.
La librería OpenCV [9] posee una implementación de la transformada llamada
cvHoughCircles, que permite realizar extracciones de círculos (circunferencias) de
forma cómoda y rápida, ya que OpenCV está basada en la librería IPP [6].
image almacena la imagen que contiene los puntos a los que se tiene que
ajustar el círculo.
u s i n g namespace s t d ;
I p l I m a g e * img = 0 ;
i n t main ( i n t a r g c , char ** a r g v )
{
f o r ( d o u b l e dp = 1 ; dp < 1 5 ; dp + = 1 . 0 )
f o r ( i n t min = 1 0 ; min < 1 5 0 ; min +=4)
{
char * f i l e n a m e = a r g c ==2?
a r g v [ 1 ] : ( char * ) " t e s t . png " ;
/ / Se c a r g a l a imagen d e l p a r a m e t r o
i f ( ( img = cvLoadImage ( f i l e n a m e , 1 ) ) == 0 )
r e t u r n −1;
/ / Se p r e p a r a n l a s v a r i a b l e s
I p l I m a g e * g r a y = c v C r e a t e I m a g e ( c v G e t S i z e ( img ) , 8 , 1 ) ;
CvMemStorage * s t o r a g e = c v C r e a t e M e m S t o r a g e ( 0 ) ;
c v C v t C o l o r ( img , g r a y , CV_BGR2GRAY ) ;
/ / Se m u e s t r a e l v a l o r de l a s v a r i a b l e s
c o u t << " dp : " <<dp << " , min : " <<min << " \ n " ;
/ / Se r e a l i z a l a t r a n s f o r m a d a
CvSeq * c i r c l e s = c v H o u g h C i r c l e s ( g r a y ,
storage ,
CV_HOUGH_GRADIENT,
dp ,
g r a y −> h e i g h t / 8 ,
300 ,
min ) ;
/ / Se m u e s t r a cada c i r c u l o e n c o n t r a d o
f o r ( i n t i = 0 ; i < c i r c l e s −> t o t a l ;++ i )
{
f l o a t * p = ( f l o a t * ) cvGetSeqElem ( c i r c l e s , i ) ;
c v C i r c l e ( img ,
c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) ,
cvRound ( p [ 2 ] ) ,
CV_RGB( 2 5 5 , 0 , 0 ) ,
2,
8,
0);
}
/ / Se m u e s t r a e l r e s u l t a d o
cvNamedWindow ( " Win " , 1 ) ;
cvShowImage ( " Win " , img ) ;
cvWaitKey ( 0 ) ;
/ / Se l i b e r a e l e s p a c i o r e s e r v a d o
c v R e l e a s e I m a g e (&img ) ;
c v R e l e a s e I m a g e (& g r a y ) ;
cvDestroyWindow ( " Win " ) ;
}
return 0;
}
Para cada una de las imagenes de prueba y para cada uno de los valores del paráme-
tro dp, se anotaron los valores de param2 (umbral mínimo) en los que se empieza
a detectar el círculo de la pupila (valor mínimo) y el valor a partir del cual ya no se
Cuando la pupila no está ocluida, se obtienen valores más altos en los puntos
candidatos del acumulador.
Realizar una erosión de la nueva imagen de forma que se eliminen los huecos
del brillo.
Tras realizar estos pasos se obtiene una figura como la 4.10 en la que se observa la
captura de la pupila y el centro geométrico sin realizar operaciones morfológicas,
en las dos siguiente imágenes se puede apreciar el proceso morfológico seguido y
por último el centro calculado.
Parejas de bordes Existe otro método para averiguar el centro de una circunfe-
rencia (o círculo), consiste en detectar el contorno de la pupila por parejas, es decir,
un algoritmo recorre una imagen en la que se encuentra una circunferencia desde
arriba hasta abajo, línea a línea (líneas horizontales), detectando el límite izquierdo
y el derecho del círculo en cada línea. Para cada línea recorrida averigua el punto
medio entre los dos bordes obteniendo así una especie de línea vertical. Después
realiza este mismo proceso de derecha a izquierda, obteniendo otra línea que corte
a la primera (imagen 4.11), consiguiendo averiguar el centro de la circunferencia,
que corresponde al centro de la pupila. En condiciones ideales este algoritmo fun-
ciona bien, pero fracasaría en el momento en el que alguno de los bordes de la
pupila esté ocluido y/o deformado. Esta inperfección el borde se transforma en un
desvío de la línea media y el consecuente desvío del centro de la circunferencia.
Debido a este fallo, no se ha considerado su utilización.
tal forma que cada pareja establece un voto en la zona central del círculo. Más tar-
de se calcula el centro en función de los votos de las celdas. Este algoritmo es útil
también para detectar elipses, dado que las elipses también son simétricas respecto
a un punto central.
Al igual que las manos de los humanos no son del mismo tamaño y propor-
ciones, el ojo tampoco. Cualquier asunción en los tamaños de las variables
del modelo lleva implícito un error de base.
El ojo no es una esfera perfecta, y la zona del iris y la pupila presentan una
elevación significativa respecto a la superficie de la esclerótica (superficie de
la esfera).
El modelo puede ser complicado para ajustarse más a la realidad, por ejemplo
asumiendo que el ojo en realidad es la unión de dos esferas, la primera estaría for-
mada por la superficie de la córnea y la segunda por la superficie de la esclerótica.
Sin embargo el aumento de la complejidad de la aproximación matemática hace
aumentar el número de cálculos del proceso disminuyendo así la eficiencia de la
aproximación.
Existe otra alternativa, mucho más simple que la anterior, consiste en olvidarse por
completo de la forma esférica del ojo, y centrarse en la pupila, reconociendo su
posición. Esta aproximación proporciona unos resultados realmente buenos según
Babcock en [10] y [19].
Debido a su simplicidad y eficiencia demostrada, éste será el modelo elegido para
el sistema a desarrollar.
Por ello se ha pensado en presentar frente al usuario una serie de puntos a los que
tendrá que ir mirando sucesivamente, mientras el programa calcula la posición de
esos puntos (gracias a la camara del mundo) y la posición de la pupila (con la
cámara del ojo) capturada cada vez que el usuario mira a un punto.
Dichos puntos formarán una matriz de 3x3, nueve en total, y están situados en un
plano visible por el usuario, perpendicular a su eje de visión. Un “punto” es un
círculo (o cuadrado) negro de entre 1 y 2 cm de diámetro sobre un plano de color
blanco aunque también puede estar dibujado sobre un monitor, siendo de entre 40
y 80 pixeles su diámetro.
El resultado de este proceso son dos arrays de coordenadas bidimensionales reales.
Una vez hecho esto, tenemos nueve posiciones de pupila y sus nueve corresponden-
cias pero ¿qué ocurre con los puntos intermedios? de todos las posibles posiciones
en las que puede estar la pupila, sólo 9 tienen una solución. Hay que encontrar una
forma de averiguar las correspondencias en todos los puntos intermedios.
De esta forma surge la necesidad de una interpolación, que permitirá encontrar una
posición del mundo para cada posición de la pupila.
Los dos primeros métodos tienen un claro inconveniente: las muestras de datos a
partir de las cuales se construyen sus polinomios han de ser equidistantes. Hay que
tener en cuenta que nuestras muestras de datos provienen de la proyección de un
plano sobre una cámara, están en perspectiva, y por lo tanto las coordenadas de
cada punto no van a ser equidistantes.
El método kriging averigua los valores de los puntos intermedios en función de los
valores de sus vecinos más cercanos, utilizando como distancia la distancia euclí-
dea. Kriging obtiene una media ponderada de los valores de los vecinos, realizando
la ponderación en función de la distancia al punto del que se quiere obtener el nue-
vo valor y según una función que determina el tipo de kriging a realizar. Existen
principalmente cuatro tipos de kriging: lineal, esférico, gaussiano y exponencial.
Cada uno de ellos determina la variación de influencia de los vecinos. Existe otro
parámetro llamado h que puede ser entendido como “umbral de influencia” y que
determina el valor a partir del cual un vecino se considera demasiado lejano, y no
se tiene en cuenta al ponderar los pesos.
Veámoslo en detalle:
La estimación de un valor desconocido en el punto P , YE,P ha de ser calculada
usando una media ponderada de los valores conocidos:
X
YE,P = Wi Yi
El error de estimación será la diferencia entre el valor estimado y el valor real YA,P :
εP = (YE,P − YA,P )
Si los pesos utilizados en la estimación suman uno, el valor estimado se dice que
es insesgado y la varianza de estimación es:
Pn
2 i=1 (YE,P − YA,P )2i
s =
n
W1 + W2 + W3 = 1
También se añade una cuarta variable para asegurar que se obtiene el error de
estimación. Esta variable se llama multiplicador de lagrange λ. Por lo tanto, el
conjunto de ecuaciones es:
W1γ (h11 ) W2γ (h12 ) W3γ (h13 ) 1 W1 γ(h1p )
W1γ (h21 ) W2γ (h22 ) W3γ (h23 ) 1 W2 γ(h2p )
∗ =
W1γ (h31 ) W2γ (h32 ) W3γ (h33 ) 1 W3 γ(h3p )
1 1 1 0 λ 1
1 2 3 P
1 0 3.16 5.39 2
2 – 0 3.61 1.41
3 – – 0 3.61
1 2 3 P
1 0 12.65 21.54 8
2 – 0 14.42 5.66
3 – – 0 14.42
En términos generales:
(A) ∗ (W ) = (B)
Una vez resulta la ecuación anterior, y obtenidos los pesos, se obtiene la estimación
requerida mediante:
YE,P = W1 ∗ Y1 + W2 ∗ Y2 + W3 ∗ Y3
El algoritmo de detección de los puntos de calibración ha sido uno de los más mo-
dificados en el desarrollo del proyecto. Según lo visto en la sección del calibrado,
un “punto” es un círculo (o cuadrado) negro de entre 1 y 2 cm de diámetro sobre
un plano de color blanco aunque también puede estar dibujado sobre un monitor,
siendo de entre 40 y 80 pixeles su diámetro.
El primer algoritmo implementado sólo buscaba zonas negras sobre fondo blanco
y fallaba cuando las condiciones de luz no eran óptimas. Luego se mejoró, con-
siguiendo que los colores fueran relativos, es decir, no buscaba un “negro sobre
blanco” sino más bien un “gris oscuro sobre gris claro”. La segunda implemen-
tación era dependiente del tamaño del punto de calibración, dado que buscaba un
tamaño determinado. Siguientes modificaciones del algoritmo fueron eliminando
paulatinamente la detección de puntos falsos, es decir, puntos que “se parecían” a
los de calibración pero que no lo eran.
El algoritmo actual realiza dos tipos de análisis para detectar los puntos, un pri-
mer análisis comprueba que realmente se trate de un punto y un segundo análisis
selecciona 9 puntos de entre todos los posibles encontrados, descartando los que
En segundo lugar se recorre la imagen creada con todos los puntos candidatos.
Dado que cada centro tendrá varios puntos candidatos situados en el centro (y
adyacentes), se calcula el centro de gravedad de cada uno de esos grupos de puntos,
almacenando el resultado en un vector.
Una vez creado el framework que permite detectar la pupila, detectar los puntos de
calibración, calibrar el sistema y predecir el punto al que el ojo mira, se necesita
construir una aplicación que utilice todas estas características para construir algo
útil de cara al usuario. La aplicación propuesta permite que el usuario pueda escri-
bir en el ordenador con sólo mirarlo. La primera parte de la aplicación consiste en
averiguar a qué parte del mundo se está mirando, para ello se calibra el sistema, se
obtiene la posición de la pupila y se predice el punto de interés, el resultado no es
más que una coordenada real en un espacio bidimensional. La coordenada corres-
ponde a la imagen del mundo que el usuario tiene frente a sus ojos (ver imagen
4.19).
En segundo lugar, el programa ha de mostrar un teclado en pantalla que sea reco-
nocido por el propio programa a través de la cámara del mundo, y que calcule la
posición exacta del teclado a la que el usuario está mirando. Para ello hay varias
opciones, pero la más cómoda sin duda, es que el programa dibuje varios puntos
en posiciones predeterminadas de la pantalla, de forma que a partir de esos puntos
reconozca la posición del teclado y lo relacione con la posición a la que se mira.
Para ello en primer lugar realiza una interpolación para detectar el punto de interés
dentro de la pantalla y luego busca cuál es la tecla que está en esa posición, si es
que la hay, y pinta la letra que corresponde a la tecla cuando pasan 0.5 segundos.
Herramientas Utilizadas
Debian ha sido el sistema elegido para el desarrollo por los siguientes motivos:
5.2. Programas
5.2.1. KDevelop
5.2.2. GCC
5.2.3. GDB
5.2.4. Doxygen
5.2.5. Gimp
5.2.6. Kimage
Kimage es una aplicación GPL de tratamiento de imágenes creada por Enrique Tu-
régano. Originalmente fue diseñada para la asignatura “Tratamiento de Imágenes”
de la Universidad de Extremadura. Ha sido utilizada en el proyecto para realizar
transformaciones en las imágenes obtenidas de las cámaras como aplicación de
filtros y eliminación de ruido. El paquete se puede obtener a través de su autor:
[email protected] y su instalación se hace descomprimiendo el paquete y eje-
cutando ./configure y make como usuario, y make install como root.
5.2.7. Kile
Kile es una herramienta GPL que permite editar documentos en TEXy LATEX. Puede
ser compilada en sistemas basados en UNIX incluído Mac OS X. Funciona bajo
KDE y permite compilar los documentos con un solo click, tiene autocompletado,
resaltado de sintaxis, permite la creación de proyectos, permite ver la estructura del
documento en un árbol, crea esqueletos rápidamente y permite acceso a comandos
y órdenes de LATEX. Kile ha sido utilizado para realizar la documentación del pro-
yecto. La instalación se realizó automáticamente con apt-get seleccionando el
paquete kile para el entorno y los paquetes tetex-bin tetex-extra para
LATEX.
5.3. Librerías
5.3.1. Qt
5.3.2. IPP
Visión artificial.
Compresión de datos.
Procesamiento de cadenas.
Procesamiento de señales.
Procesamiento de imágenes.
Reconocimiento de voz.
Criptografía.
5.3.3. STL
Standard Template Library (STL) es una librería que proporciona una serie de cla-
ses preparadas para ser usadas, como contenedores, iteradores y algoritmos. Utili-
za templates, proporcionando polimorfismo en tiempo de compilación. Fue creada
originalmente por Alexander Stepanov. Es una librería genérica con componentes
altamente parametrizados. STL es utilizada en el proyecto a todos los niveles prin-
cipalmente para gestionar las cadenas de caracteres y los vectores de elementos.
La instalación de STL es automática en GNU/Linux al instalar glibc y gcc.
5.3.4. OpenCV
5.3.5. OpenGL
Open Graphics Library (OpenGL) es una librería multiplataforma que permite de-
sarrollar aplicaciones que utilizan gráficos en 2D y 3D. Posee una serie de ex-
tensiones que permiten aprovechar las constantes evoluciones tecnológicas. A ni-
vel básico, OpenGL es una especificación, es decir, un documento que describe
una serie de funciones. A partir de esta especificación, los fabricantes de hardwa-
re crean implementaciones, de esta forma se aprovecha la aceleración hardware
cuando sea posible. La especificación de OpenGL está revisada por el OpenGL
Architecture Review Board (ARB). El ARB consiste en una serie de compañias
interesadas en construir una API consistente y popular. Fue desarrollada inicial-
mente por SGI y está presente en la mayoría de sistemas operativos. La implemen-
tación utilizada es Mesa que es compatible en código con OpenGL y licenciada
con licencia MIT. Los paquetes a instalar son xlibmesa-dri, xlibmesa-gl
y xlibmesa-gl-dev.
5.3.6. FFmpeg
FFmpeg es una librería GPL que permite realizar conversiones de audio y vi-
deo. Incluye libavcodec, una librería de codecs de audio y video. FFmpeg está
desarrollada en GNU/Linux pero puede ser compilada para la mayoría de siste-
mas operativos. Se ha utilizado FFmpeg para guardar a disco las secuencias de
video obtenidas de las cámaras. Los paquetes necesarios para su utilización son
libavcodec-dev, libavcodec0d y libavcodeccvs.
Manuales
Capítulo 6
Manual de Usuario
En este capítulo se explicarán los pasos necesarios para conseguir hacer funcionar
el sistema, y se realizará una descripción de cada uno de los programas que lo
componen, explicando paso a paso los pasos necesarios para poder escribir con los
ojos. La aplicación permite que la calibración y puesta a punto del sistema se pueda
hacer con una sola persona.
Existen cuatro programas distintos dentro del sistema implementado, cada uno para
una necesidad:
itune sirve para realizar la calibración del sistema y comprobar que las cá-
maras estén bien colocadas y funcionando correctamente.
eyeboard sirve para introducir texto en el ordenador con sólo mirar un tecla-
do virtual mostrado en el monitor.
infrared sirve para predecir el lugar de interes, es decir, el lugar hacia donde
nuestros ojos están mirando.
Por último, para comprobar el correcto funcionamiento del sistema, debemos en-
cender la máquina y arrancar nuestro sistema GNU/Linux. Lo primero es indicarle
al sistema que debe cargar un módulo que reconozca las tarjetas capturadoras. Es-
te módulo se llama bttv y se carga con el comando [root@ricercar: ]#
modprobe bttv. Para evitar tener que ejecutar este comando en cada arran-
que del sistema, se puede añadir al fichero /etc/modules una línea que
contenga el nombre del módulo (bttv). Esto se puede hacer con el comando
[root@ricercar: ]# echo bttv ››/etc/modules. Una vec cargado
el módulo, y para comprobar que la instalación de las tarjetas, los cables y los ali-
mentadores ha sido correcta es necesario ejecutar algún programa que realice una
captura de video y la muestre por pantalla. Existen varias opciones:
Tras comprobar que las cámaras, los cables y los alimentadores funcionan correc-
tamente, podemos pasar a instalar las librerías y el programa.
Para compilar los programas es necesario disponer del compilador GCC, que nor-
malmente se encuentra instalado. Los cuatro programas se distribuyen en tarball’s
por lo que pueden ser compilados e instalados en cualquier distribución GNU/Li-
nux. Para poder utilizar cualquiera de los cuatro paquetes es necesario realizar una
serie de pasos:
La calibración es el proceso a través del cual el sistema reconoce posiciones del ojo
y sus posiciones asociadas del mundo exterior. Es necesaria para poder ejecutar el
programa de escritura. itune es el programa utilizado para calibrar el sistema. Para
ejecutar itune es necesario [enrique@ricercar: ]$ /usr/bin/itune.
El usuario ha de llevar puesto “el casco” para utilizar itune. Una vez en ejecución,
el programa itune tiene el aspecto de la figura 6.4.
Una vez calibrados los puntos aparecerá un mensaje en una ventana indicando que
la calibración ha sido realizada con éxito. Tras esto se puede pasar a utilizar el
programa eyeboard.
La interfaz es muy sencilla, el botón “run” sirve para que la aplicación comience
a capturar, procesar y mostrar las imágenes de las cámaras. El botón “exit” es
utilizado para terminar la aplicación. “start record” y “stop record” sirven para
empezar a registrar las secuencias de video en ficheros y para terminar de hacerlo,
respectivamente.
Infrared registra las secuencias de video de las cámaras y las graba en un fichero de
video. Con este programa se puede observar el comportamiento de nuestros ojos
frente a estímulos provenientes de películas, libros, páginas web que aparecen en
el monitor. Este programa es especialmente útila para el estudio de la cognición, la
percepción y algunos aspectos de la psicología humana. La imagen 6.9 muestra un
ejemplo en el que el usuario se encuentra viendo un concierto musical.
Manual de Programador
Se intentarán dar unas nociones globales sobre el diseño del sistema implementado
en este capítulo. Para implementar el sistema se ha elegido el lenguaje C++ debido
a su eficiencia, velocidad y potencia, y se ha utilizado su capacidad de orientación
a objetos para estructurar el código. Se ha hecho uso de la programación genérica
gracias a STL.
Capturar imagen.
Procesar imagen.
Mostrar imagen.
En las primeras fases del proyecto, la captura se hacia de ficheros de video sin
comprimir, por lo que se implementó un módulo para leer de videos en formato
AVI sin comprimir: AviReader. En las siguientes fases del proyecto, la captura
se hacía directamente del dispositivo, por lo que se implementó una clase llamada
94 Manual de Programador
#include <avireader.h>
Diagrama de herencias de pt::readers::AviReader
pt::readers::BaseReader
+ BaseReader()
+ BaseReader()
+ ~BaseReader()
+ setPreferredSize()
+ getHeight()
+ getWidth()
+ getPicture()
+ getBuffer()
+ getBufferPtr()
pt::readers::AviReader
- avi_main_header
- avi_stream_header
- bit_map_info
- avi_old_index
- riff_name
- riff_file
- movi_offset
- playing
- next_frame
- next_index_entry
- buffer
- buffer_rgb24
+ AviReader()
+ AviReader()
+ ~AviReader()
+ openFile()
+ getPicture()
+ getBuffer()
+ getBufferPtr()
+ getHeight()
+ getWidth()
+ setPreferredSize()
+ isPlaying()
- readHeader()
pt::readers::AviReader::AviStreamHeader
+ fcc
+ cb
pt::readers::AviReader::SAviMainHeader + fccType
+ fccHandler
pt::readers::BaseReader + fcc + dwFlags
+ cb + wPriority
+ dwMicroSecPerFrame + wLanguage
+ dwMaxBytesPerSec pt::readers::AviReader::SAviOldIndex + dwInitialFrames
+ BaseReader() + dwPaddingGranularity
+ BaseReader() pt::readers::AviReader::STagBITMAPINFO + dwScale
+ dwFlags + fcc
+ ~BaseReader() + dwRate
+ bmiHeader + dwTotalFrames + cb + dwStart
+ setPreferredSize() + dwInitialFrames + entries
+ getHeight() + dwLength
+ dwStreams
+ getWidth() + dwSuggestedBufferSize
+ dwSuggestedBufferSize + dwQuality
+ getPicture() + dwWidth
+ getBuffer() + dwSampleSize
+ dwHeight + left
+ getBufferPtr() + dwReserved + top
+ right
+ bottom
+ rcFrame
pt::readers::AviReader
- avi_main_header
- avi_stream_header
- bit_map_info
- avi_old_index
- riff_name
- riff_file
- movi_offset
- playing
- next_frame
- next_index_entry
- buffer
- buffer_rgb24
+ AviReader()
+ AviReader()
+ ~AviReader()
+ openFile()
+ getPicture()
+ getBuffer()
+ getBufferPtr()
+ getHeight()
+ getWidth()
+ setPreferredSize()
+ isPlaying()
- readHeader()
Métodos públicos
AviReader ()
AviReader (const char ∗file)
∼AviReader ()
int openFile (const char ∗file)
int getPicture ()
char ∗ getBuffer () const
const void ∗ getBufferPtr () const
int getHeight () const
int getWidth () const
int setPreferredSize (int w, int h)
bool isPlaying () const
Métodos privados
int readHeader ()
Atributos privados
pt::readers::AviReader::SAviMainHeader avi_main_header
pt::readers::AviReader::AviStreamHeader avi_stream_header
pt::readers::AviReader::STagBITMAPINFO bit_map_info
pt::readers::AviReader::SAviOldIndex avi_old_index
std::string riff_name
FILE ∗ riff_file
int movi_offset
bool playing
int next_frame
int next_index_entry
char ∗ buffer
char ∗ buffer_rgb24
Clases
struct AviStreamHeader
struct SAviMainHeader
struct SAviOldIndex
struct SAviOldIndexEntry
struct STagBITMAPINFO
struct STagBITMAPINFOHEADER
struct STagRGBQUAD
struct SWaveFormatEx
Versión:
0.1
Fecha:
2006
El formato avi divide las secuencias de video en "chunks". Un chunk puede ser
audio o video y se encuentran intercalados en la zona de datos del fichero para
que pueda ser leido de forma secuencial, sin necesidad de saltos. Al final del fi-
chero AVI existe un indice que contiene apuntadores a las zonas de datos donde se
encuentran los chunks.
Tareas Pendientes
soportar codecs y distintos tipos de ficheros de video.
AviReader::AviReader ()
Constructor
AviReader::∼AviReader ()
Destructor
Nota:
inexplicablemente los ficheros de xawtv no tienen el campo "STagRGBQUAD
bmiColors[ ]"
eyeboard/src/avireader.h
eyeboard/src/avireader.cpp
#include <singleton.h>
Versión:
0.9
Fecha:
2006
La clase Singleton implementa una estructura singleton, la cual permite que las
clases que hereden de ella solo puedan ser instanciadas una vez, y a la vez accedidas
desde cualquier otra clase que no sea la instanciadora
La documentación para esta clase fué generada a partir del siguiente archivo:
eyeboard/src/singleton.h
Atributos públicos
struct {
short int left
short int top
short int right
short int bottom
} rcFrame
DWORD pt::readers::AviReader::AviStreamHeader::cb
DWORD pt::readers::AviReader::AviStreamHeader::dwFlags
DWORD pt::readers::AviReader::AviStreamHeader::dwInitialFrames
DWORD pt::readers::AviReader::AviStreamHeader::dwLength
DWORD pt::readers::AviReader::AviStreamHeader::dwQuality
DWORD pt::readers::AviReader::AviStreamHeader::dwRate
DWORD pt::readers::AviReader::AviStreamHeader::dwSampleSize
DWORD pt::readers::AviReader::AviStreamHeader::dwScale
DWORD pt::readers::AviReader::AviStreamHeader::dwStart
DWORD pt::readers::AviReader::AviStreamHeader::dwSuggestedBuffer-
Size
char pt::readers::AviReader::AviStreamHeader::fcc[4]
char pt::readers::AviReader::AviStreamHeader::fccHandler[4]
char pt::readers::AviReader::AviStreamHeader::fccType[4]
WORD pt::readers::AviReader::AviStreamHeader::wLanguage
WORD pt::readers::AviReader::AviStreamHeader::wPriority
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
Atributos públicos
DWORD pt::readers::AviReader::SAviMainHeader::cb
DWORD pt::readers::AviReader::SAviMainHeader::dwFlags
DWORD pt::readers::AviReader::SAviMainHeader::dwHeight
DWORD pt::readers::AviReader::SAviMainHeader::dwInitialFrames
DWORD pt::readers::AviReader::SAviMainHeader::dwMaxBytesPerSec
DWORD pt::readers::AviReader::SAviMainHeader::dwMicroSecPerFrame
DWORD pt::readers::AviReader::SAviMainHeader::dwPaddingGranularity
DWORD pt::readers::AviReader::SAviMainHeader::dwReserved[4]
DWORD pt::readers::AviReader::SAviMainHeader::dwStreams
DWORD pt::readers::AviReader::SAviMainHeader::dwSuggestedBufferSize
DWORD pt::readers::AviReader::SAviMainHeader::dwTotalFrames
DWORD pt::readers::AviReader::SAviMainHeader::dwWidth
char pt::readers::AviReader::SAviMainHeader::fcc[4]
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
pt::readers::AviReader::SAviOldIndexEntry
+ dwChunkId
+ dwFlags
+ dwOffset
+ dwSize
entries
pt::readers::AviReader::SAviOldIndex
+ fcc
+ cb
+ entries
Atributos públicos
DWORD cb
Specifies the size of the structure, not including the initial 8 bytes.
SAviOldIndexEntry ∗ entries
DWORD pt::readers::AviReader::SAviOldIndex::cb
Specifies the size of the structure, not including the initial 8 bytes.
SAviOldIndexEntry∗ pt::readers::AviReader::SAviOldIndex::entries
char pt::readers::AviReader::SAviOldIndex::fcc[4]
Specifies a FOURCC code. The value must be ’idx1’.
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
Atributos públicos
DWORD dwChunkId
DWORD dwFlags
DWORD dwOffset
DWORD dwSize
DWORD pt::readers::AviReader::SAviOldIndexEntry::dwChunkId
DWORD pt::readers::AviReader::SAviOldIndexEntry::dwFlags
DWORD pt::readers::AviReader::SAviOldIndexEntry::dwOffset
DWORD pt::readers::AviReader::SAviOldIndexEntry::dwSize
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
pt::readers::AviReader::STagBITMAPINFOHEADER
+ biSize
+ biWidth
+ biHeight
+ biPlanes
+ biBitCount
+ biCompression
+ biSizeImage
+ biXPelsPerMeter
+ biYPelsPerMeter
+ biClrUsed
+ biClrImportant
bmiHeader
pt::readers::AviReader::STagBITMAPINFO
+ bmiHeader
Atributos públicos
STagBITMAPINFOHEADER bmiHeader
STagBITMAPINFOHEADER pt::readers::AviReader::STag-
BITMAPINFO::bmiHeader
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
Atributos públicos
DWORD biSize
LONG biWidth
LONG biHeight
WORD biPlanes
WORD biBitCount
DWORD biCompression
DWORD biSizeImage
LONG biXPelsPerMeter
LONG biYPelsPerMeter
DWORD biClrUsed
DWORD biClrImportant
WORD pt::readers::AviReader::STagBITMAPINFOHEADER::biBitCount
DWORD pt::readers::AviReader::STagBITMAPINFOHEADER::biClr-
Important
DWORD pt::readers::AviReader::STagBITMAPINFOHEADER::biClrUsed
DWORD pt::readers::AviReader::STagBITMAPINFOHEADER::bi-
Compression
LONG pt::readers::AviReader::STagBITMAPINFOHEADER::biHeight
WORD pt::readers::AviReader::STagBITMAPINFOHEADER::biPlanes
DWORD pt::readers::AviReader::STagBITMAPINFOHEADER::biSize
DWORD pt::readers::AviReader::STagBITMAPINFOHEADER::biSize-
Image
LONG pt::readers::AviReader::STagBITMAPINFOHEADER::biWidth
LONG pt::readers::AviReader::STagBITMAPINFOHEADER::biXPelsPer-
Meter
LONG pt::readers::AviReader::STagBITMAPINFOHEADER::biYPelsPer-
Meter
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
Atributos públicos
BYTE rgbBlue
BYTE rgbGreen
BYTE rgbRed
BYTE rgbReserved
RGBQUAD
BYTE pt::readers::AviReader::STagRGBQUAD::rgbBlue
BYTE pt::readers::AviReader::STagRGBQUAD::rgbGreen
BYTE pt::readers::AviReader::STagRGBQUAD::rgbRed
BYTE pt::readers::AviReader::STagRGBQUAD::rgbReserved
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
Atributos públicos
WORD wFormatTag
WORD nChannels
WORD nSamplesPerSec
DWORD nAvgBytesPerSec
WORD nBlockAlign
WORD wBitsPerSample
WORD cbSize
WORD pt::readers::AviReader::SWaveFormatEx::cbSize
DWORD pt::readers::AviReader::SWaveFormatEx::nAvgBytesPerSec
WORD pt::readers::AviReader::SWaveFormatEx::nBlockAlign
WORD pt::readers::AviReader::SWaveFormatEx::nChannels
WORD pt::readers::AviReader::SWaveFormatEx::nSamplesPerSec
WORD pt::readers::AviReader::SWaveFormatEx::wBitsPerSample
WORD pt::readers::AviReader::SWaveFormatEx::wFormatTag
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/avireader.h
#include <baseprocessing.h>
Diagrama de herencias de pt::processing::BaseProcessing
pt::processing::BaseProcessing
# WIDTH
# HEIGHT
# m_capture
+ BaseProcessing()
+ ~BaseProcessing()
+ destroy()
+ processFrame()
+ getBufferPtr()
pt::processing::EyeProcessing
- nebula
- all_image
- bright_pupil
- dark_pupil
- histogram
- histogram_copia pt::processing::WorldProcessing
- hist_closed_eye
- hist_open_eye - NUMPOINTS
- status - roi
- roi_size - gauss
- roi_point - point_array
- eye_position - temp_array
- m_gray - points
- m_gauss - status
- m_mask - initted
- m_temp_open_eye
- m_temp_closed_eye + WorldProcessing()
+ ~WorldProcessing()
+ EyeProcessing() + init()
+ ~EyeProcessing() + destroy()
+ init() + processFrame()
+ destroy() + getImage24()
+ processFrame() + getImage()
+ saveOpenEye() + getBufferPtr()
+ saveClosedEye() + getPoint()
+ loadOpenEye() + setPlayingOnly()
+ loadClosedEye() + isFound()
+ isOpen() - detection()
+ getImage() - isPoint()
+ getHistogram() - compX()
+ getPupilPosition() - compY()
+ getBufferPtr()
- crecimientoRelleno()
- crecimientoMedia()
- detection()
- updateHistogram()
- calcROI()
- calcOpen()
pt::Image
- mp_pixels
- m_width
- m_height
- m_bpp
- m_step_bytes
- m_initialized
+ Image()
+ Image()
+ ~Image()
+ freeImage()
+ init()
+ getPixels()
+ getWidth()
+ getHeight()
+ getBpp()
+ isInitialized()
+ drawCross()
+ drawCross()
+ drawCross()
+ drawRect()
+ drawRect()
+ drawCross()
+ drawCross()
m_capture
pt::processing::BaseProcessing
# WIDTH
# HEIGHT
# m_capture
+ BaseProcessing()
+ ~BaseProcessing()
+ destroy()
+ processFrame()
+ getBufferPtr()
Métodos públicos
BaseProcessing ()
virtual ∼BaseProcessing ()
virtual void destroy ()=0
virtual void processFrame (Ipp8u ∗img)=0
virtual const void ∗ getBufferPtr () const =0
Atributos protegidos
int WIDTH
int HEIGHT
Image m_capture
Versión:
0.1
Fecha:
2006
Filtrados
Búsqueda de formas
Obtención de características
Detección de objetos
pt::processing::BaseProcessing::BaseProcessing ()
Constructor.
pt::processing::BaseProcessing::∼BaseProcessing () [virtual]
Destructor
eyeboard/src/baseprocessing.h
eyeboard/src/baseprocessing.cpp
#include <basereader.h>
Diagrama de herencias de pt::readers::BaseReader
pt::readers::BaseReader
+ BaseReader()
+ BaseReader()
+ ~BaseReader()
+ setPreferredSize()
+ getHeight()
+ getWidth()
+ getPicture()
+ getBuffer()
+ getBufferPtr()
pt::readers::AviReader
- avi_main_header
- avi_stream_header
- bit_map_info
- avi_old_index
- riff_name
- riff_file
- movi_offset
- playing
- next_frame
- next_index_entry
- buffer
- buffer_rgb24
+ AviReader()
+ AviReader()
+ ~AviReader()
+ openFile()
+ getPicture()
+ getBuffer()
+ getBufferPtr()
+ getHeight()
+ getWidth()
+ setPreferredSize()
+ isPlaying()
- readHeader()
Métodos públicos
BaseReader ()
BaseReader (char ∗file)
virtual ∼BaseReader ()
virtual int setPreferredSize (int w, int h)=0
virtual int getHeight () const =0
virtual int getWidth () const =0
virtual int getPicture ()=0
virtual char ∗ getBuffer () const =0
virtual const void ∗ getBufferPtr ()=0
Versión:
0.1
Fecha:
2006
Está pensada para ser el padre de la jerarquía de readers, de forma que el usuario
que quiera realizar una lectura de un dispositivo o de un fichero solo tenga que
instanciarla y ella sola se encargue de todo.
Debería existir una jerarquía de clases y una ReaderFactory que se encargue de
crear las instancias para cada reader.
pt::readers::BaseReader::BaseReader ()
Constructor
pt::readers::BaseReader::∼BaseReader () [virtual]
Destructor
eyeboard/src/basereader.h
eyeboard/src/basereader.cpp
#include <camreader.h>
Métodos públicos
CamReader ()
∼CamReader ()
int init (const char ∗dev, int w, int h, int bpp)
void destroy ()
const void ∗ getBufferPtr () const
void getBuffer (char ∗buffer)
const bool isRunning () const
Métodos privados
Atributos privados
int desc
int curChannel
video_capability vcaps
video_channel vchannel
video_window vwin
video_picture vpic
char ∗ buffer
int bufferSize
pthread_t thread
pthread_attr_t thread_attr
volatile bool running
int reading_frame_n
const int numBuffers
Versión:
0.8
Fecha:
2006
pt::readers::CamReader::CamReader ()
Constructor
pt::readers::CamReader::∼CamReader ()
Destructor
void pt::readers::CamReader::destroy ()
Libera memoria y recursos
Parámetros:
buffer puntero a la zona de memoria donde se quiere copiar FIXME: deberia
ser reading_frame_n -1 pero con +7 funciona mejor. (WTF!?)
eyeboard/src/camreader.h
eyeboard/src/camreader.cpp
#include <capture.h>
Diagrama de colaboración para pt::readers::Capture:
pt::readers::Capture::buffer
+ start
+ length
buffers
pt::readers::Capture
- dev_name
- fd
- buffers
- n_buffers
- buff_ptr
- WIDTH
- HEIGHT
- BPP
+ Capture()
+ ~Capture()
+ init()
+ destroy()
+ getBufferPtr()
- open_device()
- close_device()
- init_device()
- init_mmap()
- uninit_device()
- start_capturing()
- stop_capturing()
- read_frame()
- xioctl()
Métodos públicos
Capture ()
∼Capture ()
int init (std::string dev, int w, int h, int bpp)
void destroy ()
void ∗ getBufferPtr ()
Métodos privados
int open_device ()
void close_device ()
int init_device ()
int init_mmap ()
int uninit_device ()
int start_capturing ()
int stop_capturing ()
int read_frame ()
int xioctl (int fd, int request, void ∗arg)
Atributos privados
std::string dev_name
int fd
buffer ∗ buffers
unsigned int n_buffers
char ∗ buff_ptr
int WIDTH
int HEIGHT
int BPP
Clases
struct buffer
Versión:
0.1
Fecha:
2006
pt::readers::Capture::Capture ()
Constructor
pt::readers::Capture::∼Capture ()
Destructor
void pt::readers::Capture::destroy ()
Destruye la clase
void ∗ pt::readers::Capture::getBufferPtr ()
Devuelve un puntero al buffer leido
eyeboard/src/capture.h
eyeboard/src/capture.cpp
Atributos públicos
void ∗ start
size_t length
size_t pt::readers::Capture::buffer::length
void∗ pt::readers::Capture::buffer::start
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/capture.h
#include <maths.h>
Versión:
0.1
Fecha:
2006
eyeboard/src/maths.h
#include <distribution.h>
Métodos públicos
Atributos privados
Ipp32f ∗ x_array
Ipp32f ∗ y_array
Ipp32u count
Ipp32u cur_limit
Parámetros:
n tamaño inicial del array que contiene los puntos.
pt::math::Distribution::∼Distribution ()
Destructor
Real2dPoint pt::math::Distribution::getCenter ()
Devuelve el centro de la distribución de los puntos
void pt::math::Distribution::reset ()
Vacia los arrays y establece el límite al valor por defecto
eyeboard/src/distribution.h
eyeboard/src/distribution.cpp
pt::processing::EyeProcessing
- nebula
- all_image
- bright_pupil
- dark_pupil
- histogram
pt::math::Kriging - histogram_copia
pt::processing::WorldProcessing pt::renderers::VideoWriter
- hist_closed_eye pt::readers::Capture
- numSamples
- NUMPOINTS - file_name - hist_open_eye
- widthheight - dev_name
- roi - width - status
- variogram - fd
- gauss - height - roi_size
- kriging_model - buffers
- point_array - bpp - roi_point pt::Logger
- distance - n_buffers
- temp_array - pixel_format - eye_position
- dist_xx - buff_ptr
- points - fps - m_gray # my_log
- weights - WIDTH
- status - fmt pt::eyeboard::SKey - m_gauss # file_name
- dist_xp - HEIGHT
- initted - oc - m_mask # app_name
pt::math::Int2dPoint - aux_xx - BPP
- video_st + name - m_temp_open_eye # log_level
+ WorldProcessing() - buffer
- picture +x - m_temp_closed_eye # log_type + Capture()
+ ~WorldProcessing() +x - dist_xx_calculated
- tmp_picture +y + ~Capture()
+ init() +y + EyeProcessing() + Logger()
- video_outbuf + width + Kriging() + init()
+ destroy() - frame_count + height + ~EyeProcessing() + ~Logger()
+ Int2dPoint() + ~Kriging() + destroy()
+ processFrame() - video_outbuf_size + pulsaciones + init() + logMessage()
+ Int2dPoint() + setKrigingModel() + getBufferPtr()
+ getImage24() - initted + destroy() + syslogMessage()
+ setDistance() - open_device()
+ getImage() + processFrame() + setLogLevel()
+ addPoint() - close_device()
+ getBufferPtr() + VideoWriter() + saveOpenEye() + setLogFile()
+ addPoint() - init_device()
+ getPoint() + ~VideoWriter() + saveClosedEye() + setAppName()
+ getInterpolatedValue() - init_mmap()
+ setPlayingOnly() + init() + loadOpenEye() + getSingleton()
+ reset() - uninit_device()
+ isFound() + saveFrame() + loadClosedEye()
+ getNumPoints() - start_capturing()
- detection() + close() + isOpen()
- calculateGamma() - stop_capturing()
- isPoint() - open_video() + getImage()
- calculateDist() - read_frame()
- compX() - alloc_picture() + getHistogram()
- printMatrices() - xioctl()
- compY() - add_video_stream() + getPupilPosition()
- printError()
+ getBufferPtr()
- crecimientoRelleno()
- crecimientoMedia()
- detection()
- updateHistogram()
- calcROI()
- calcOpen()
eye_reader
world_processing avi_writer estela keys kriger eye_processing logger
world_reader
pt::eyeboard
- logger
- kriger
- k_mod
- eye_processing
- world_processing
- eye_reader
- world_reader
- eye_w
- eye_h
- world_w
- world_h
- fps
- int_world_dist
- int_world_type
- int_eye_dist
- int_eye_type
- guardar_video
- ms
- gravedad
- canvas
- canvas_view
- run_timer
- HEIGHT
- WIDTH
- keys
- KEYSIZE
- SEP
- estela
- estela_pos
- NUMESTELAPOINTS
- NUMTECLAS
- subpulsaciones
- last_tecla
- canvas_text
- escrito
- canvas_kriging
- kriging_name
- kriging_distance
- world_image
- world_canvas_pixmap
- world_pixmap_array
- world_sprite
- avi_writer
- video
+ eyeboard()
+ ~eyeboard()
# slotRun
# keyPressEvent
- init()
- readConfig()
- drawKey()
- initKey()
- drawPoint()
- drawCross()
- processCursor()
- slotStartRecord()
- slotStopRecord()
Métodos públicos
eyeboard ()
virtual ∼eyeboard ()
Slots protegidos
void slotRun ()
Métodos privados
void init ()
void readConfig ()
void drawKey (int k)
void initKey (int id, int x, int y, int width, int height)
void drawPoint (int x, int y)
void drawCross (int x, int y)
void processCursor (int x, int y)
void slotStartRecord ()
void slotStopRecord ()
Atributos privados
Logger logger
math::Kriging ∗ kriger
math::Kriging::EKrigingModel k_mod
processing::EyeProcessing ∗ eye_processing
processing::WorldProcessing ∗ world_processing
readers::Capture ∗ eye_reader
readers::Capture ∗ world_reader
int eye_w
int eye_h
int world_w
int world_h
int fps
int int_world_dist
std::string int_world_type
int int_eye_dist
std::string int_eye_type
bool guardar_video
int ms
bool gravedad
QCanvas ∗ canvas
QCanvasView ∗ canvas_view
QTimer ∗ run_timer
int HEIGHT
int WIDTH
SKey ∗ keys
int KEYSIZE
int SEP
math::Int2dPoint ∗ estela
int estela_pos
int NUMESTELAPOINTS
int NUMTECLAS
int subpulsaciones
char last_tecla
QCanvasText ∗ canvas_text
QString escrito
QCanvasText ∗ canvas_kriging
QString kriging_name
float kriging_distance
QImage ∗ world_image
QCanvasPixmap ∗ world_canvas_pixmap
QCanvasPixmapArray ∗ world_pixmap_array
QCanvasSprite ∗ world_sprite
renderers::VideoWriter ∗ avi_writer
Ipp8u ∗ video
Clases
struct SKey
Autor:
enrique <enrique>
Versión:
0.1
pt::eyeboard::eyeboard ()
Constructor
pt::eyeboard::∼eyeboard () [virtual]
Destructor
void pt::eyeboard::initKey (int id, int x, int y, int width, int height)
[private]
Inicia la tecla con esos valores
processing::WorldProcessing∗ pt::eyeboard::world_processing
[private]
Instancia que se encarga de procesar la imagen de la cámara del mundo
eyeboard/src/eyeboard.h
eyeboard/src/eyeboard.cpp
Atributos públicos
char name
Nombre de la tecla.
int x
coordenada x
int y
coordenada y
int width
ancho
int height
alto
int pulsaciones
pulsaciones
int pt::eyeboard::SKey::height
alto
char pt::eyeboard::SKey::name
Nombre de la tecla.
int pt::eyeboard::SKey::pulsaciones
pulsaciones
int pt::eyeboard::SKey::width
ancho
int pt::eyeboard::SKey::x
coordenada x
int pt::eyeboard::SKey::y
coordenada y
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/eyeboard.h
#include <eyeprocessing.h>
Diagrama de herencias de pt::processing::EyeProcessing
pt::processing::BaseProcessing
# WIDTH
# HEIGHT
# m_capture
+ BaseProcessing()
+ ~BaseProcessing()
+ destroy()
+ processFrame()
+ getBufferPtr()
pt::processing::EyeProcessing
- nebula
- all_image
- bright_pupil
- dark_pupil
- histogram
- histogram_copia
- hist_closed_eye
- hist_open_eye
- status
- roi_size
- roi_point
- eye_position
- m_gray
- m_gauss
- m_mask
- m_temp_open_eye
- m_temp_closed_eye
+ EyeProcessing()
+ ~EyeProcessing()
+ init()
+ destroy()
+ processFrame()
+ saveOpenEye()
+ saveClosedEye()
+ loadOpenEye()
+ loadClosedEye()
+ isOpen()
+ getImage()
+ getHistogram()
+ getPupilPosition()
+ getBufferPtr()
- crecimientoRelleno()
- crecimientoMedia()
- detection()
- updateHistogram()
- calcROI()
- calcOpen()
pt::Image
- mp_pixels
- m_width
- m_height
- m_bpp
- m_step_bytes
- m_initialized
+ Image()
+ Image()
+ ~Image()
+ freeImage()
+ init()
+ getPixels()
+ getWidth()
+ getHeight()
+ getBpp()
+ isInitialized()
+ drawCross()
+ drawCross()
+ drawCross()
+ drawRect()
+ drawRect()
+ drawCross()
+ drawCross()
m_capture
pt::math::Distribution
eye_position nebula
pt::processing::EyeProcessing
- nebula
- all_image
- bright_pupil
- dark_pupil
- histogram
- histogram_copia
- hist_closed_eye
- hist_open_eye
- status
- roi_size
- roi_point
- eye_position
- m_gray
- m_gauss
- m_mask
- m_temp_open_eye
- m_temp_closed_eye
+ EyeProcessing()
+ ~EyeProcessing()
+ init()
+ destroy()
+ processFrame()
+ saveOpenEye()
+ saveClosedEye()
+ loadOpenEye()
+ loadClosedEye()
+ isOpen()
+ getImage()
+ getHistogram()
+ getPupilPosition()
+ getBufferPtr()
- crecimientoRelleno()
- crecimientoMedia()
- detection()
- updateHistogram()
- calcROI()
- calcOpen()
Métodos públicos
EyeProcessing ()
Constructor.
∼EyeProcessing ()
Destructor.
void destroy ()
Libera memoria.
void saveOpenEye ()
Almacena el histograma y la imagen del ojo abierto.
void saveClosedEye ()
Almacena el histograma y la imagen del ojo abierto.
bool isOpen ()
Devuelve la variable que indica si el ojo está abierto.
Tipos privados
enum EMachineStatus {
start, playing, open_eye_saved, closed_eye_saved,
open_eye, closed_eye, stopped }
Métodos privados
void crecimientoRelleno (Image &img, int x, int y, Ipp8u color, int step)
void crecimientoMedia (Image &img, int x, int y, int step)
void detection ()
Realiza la deteccion de la pupila.
void updateHistogram ()
Actualiza el histograma.
void calcROI ()
calcula el area de interes: el area en la que se mueve la pupila
void calcOpen ()
Realiza la operacion que comprueba si el ojo está abierto y establece la varia-
ble.
Atributos privados
math::Distribution nebula
IppiSize all_image
IppiPoint bright_pupil
IppiPoint dark_pupil
Ipp32s histogram [256]
Histograma de la imagen.
EMachineStatus status
Estado de la máquina.
IppiSize roi_size
tamaño del área de interés (sólo del ojo)
IppiPoint roi_point
origen del área de interés (sólo del ojo)
math::Real2dPoint eye_position
Image m_gray
imagen transformada en gris
Image m_gauss
imagen sin ruido, en la que se realizan varios procesos
Image m_mask
Imagen en la que se realiza el crecimiento.
Image m_temp_open_eye
imagen temporal que almacena el ojo abierto
Image m_temp_closed_eye
imagen temporal que almacena el ojo cerrado
Versión:
0.1
Fecha:
2006
necesita IPP
Valores de la enumeración:
start La clase ha sido creada.
playing Se esta reproduciendo la secuencia capturada.
open_eye_saved Se ha guardado el ojo abierto, no el cerrado.
closed_eye_saved Se ha guardado el ojo cerrado, no el abierto.
open_eye El ojo esta abierto.
closed_eye El ojo esta cerrado.
stopped Se ha parado el proceso.
pt::processing::EyeProcessing::EyeProcessing ()
Constructor.
Constructor
pt::processing::EyeProcessing::∼EyeProcessing ()
Destructor.
Destructor
En primer lugar se calcula si está el ojo abierto. Para ello llama a calc-
Open()(p. 147) que realiza los cálculos en función del histograma.
Luego se calcula el valor máximo: el primer brillo purkinje. Para que el ojo
se considere abierto tiene que ser detectado como abierto y que ademas el
punto más brillante sea mayor a 128, de modo contrario no se busca el centro
de la pupila.
Si el ojo está abierto se busca el punto más oscuro dentro del área de interés,
que será considerado interior a la pupila.
Después se eliminan los brillos, que son zonas demasiado claras como para
ser consideradas pupilas.
Parámetros:
w el ancho de la imagen que se le pasará a la clase.
h el alto de la imagen que se le pasará a la clase.
Parámetros:
img la imagen que se ha de procesar
void pt::processing::EyeProcessing::saveClosedEye ()
Almacena el histograma y la imagen del ojo abierto.
Almacena en variables de la clase el ojo cerrado, tanto la imagen como el histogra-
ma. De esta forma podremos calcular si el ojo está abierto o cerrado.
void pt::processing::EyeProcessing::saveOpenEye ()
Almacena el histograma y la imagen del ojo abierto.
Almacena en variables de la clase el ojo abierto, tanto la imagen como el histogra-
ma. De esta forma podremos calcular si el ojo está abierto o cerrado.
math::Real2dPoint pt::processing::EyeProcessing::eye_position
[private]
Posición del ojo
Copia del histograma de la imagen: es más eficiente tener una copia que andar con
varios mutexes...
eyeboard/src/eyeprocessing.h
eyeboard/src/eyeprocessing.cpp
#include <glwindow.h>
Métodos públicos
Métodos privados
void createGLWindow ()
bool initGLScene ()
void resizeGLScene ()
void swapBuffers ()
void initKeys ()
void drawGLScene ()
void killGLWindow ()
int minPotSup2 (int)
Atributos privados
Display ∗ dpy
int screen
Window win
GLXContext ctx
XSetWindowAttributes attr
bool fs
XF86VidModeModeInfo deskMode
int x
int y
int width
int height
unsigned int bpp
std::string window_name
char ∗ image
GLuint texid
double scale_width
double scale_height
bool running
Versión:
0.1
Fecha:
2006
Es una clase que sirve para mostrar una imagen (o una secuencia de video) en una
ventana del X. En su implementación se ha buscado la sencillez de cara al usuario
de la clase, de forma que solo existan dos métodos: uno para establecer la imagen
a mostrar (setImage) y otro para actualizar la ventana (update).
Utiliza OpenGL para mostrar la imagen, y acepta imagenes de profundidad 8 (en
gris) y 24 en RGB. Selecciona el mejor modo de video disponible. Utiliza doble
buffer.
necesita libxxf86vm-dev y libxxf86vm1
Tareas Pendientes
el tamaño de la imagen pasada y el tamaño de la ventana es el mismo, y no
deberia serlo, deberia ser posible por ejemplo tener una ventana en modo fu-
llscreen pero con una imagen de 320x240.
pt::renderers::GLWindow::∼GLWindow ()
Destruye la ventana
int pt::renderers::GLWindow::update ()
Actualiza la ventana
XF86VidModeModeInfo pt::renderers::GLWindow::deskMode
[private]
Modo de video
eyeboard/src/glwindow.h
eyeboard/src/glwindow.cpp
#include <image.h>
Métodos públicos
Image ()
Atributos privados
Ipp8u ∗ mp_pixels
Puntero a la imagen.
int m_width
Ancho de la imagen.
int m_height
Alto de la imagen.
int m_bpp
Bits por pixel.
int m_step_bytes
Distancia en bytes de una linea a la siguiente.
bool m_initialized
Si está inicializado.
Versión:
0.2
Fecha:
2006
Tareas Pendientes
arreglar el caos de drawCross necesita IPP
pt::Image::Image ()
pt::Image::∼Image ()
void pt::Image::drawCross (void ∗ img, int width, int height, IppiPoint center,
int size = 10) [static]
void pt::Image::drawCross (Image & img, IppiPoint center, int size = 10)
[static]
Pinta una cruz en el punto dicho de la imagen.
void pt::Image::drawRect (Image & img, int min_x, int max_x, int min_y, int
max_y)
Pinta un rectangulo en la imagen,
void pt::Image::drawRect (int min_x, int max_x, int min_y, int max_y)
void pt::Image::freeImage ()
Libera el espacio reservado.
eyeboard/src/image.h
eyeboard/src/image.cpp
#include <maths.h>
Métodos públicos
Int2dPoint ()
Int2dPoint (unsigned int _x, unsigned int _y)
Atributos públicos
unsigned int x
unsigned int y
Versión:
0.1
Fecha:
2006
pt::math::Int2dPoint::Int2dPoint () [inline]
Constructor vacío
eyeboard/src/maths.h
#include <kriging.h>
Tipos públicos
Métodos públicos
Kriging (int n)
∼Kriging ()
void setKrigingModel (EKrigingModel model)
void setDistance (float dist)
void addPoint (Real2dPoint point, Real2dPoint value)
void addPoint (IppiPoint point, IppiPoint value)
Real2dPoint getInterpolatedValue (Real2dPoint point)
void reset ()
unsigned int getNumPoints ()
Métodos privados
Atributos privados
EKrigingModel kriging_model
float distance
Ipp32f ∗ dist_xx
Ipp32f ∗ weights
Ipp32f ∗ dist_xp
Ipp32f ∗ aux_xx
Ipp32f ∗ buffer
bool dist_xx_calculated
Clases
struct SPointValue
Versión:
0.1
Fecha:
2006
Tareas Pendientes
debería estar creada con templates de tal forma que pudiese realizar interpola-
ciones entre dos espacios de dimensiones cualesquiera.
lineal
esférico
exponencial
gaussiano.
enum pt::math::Kriging::EKrigingModel
Representa los tipos de kriging posibles.
Valores de la enumeración:
LinearKriging Kriging(p. 163) lineal: el peso asociado es la distancia
SphericalKriging Kriging(p. 163) esférico: el peso es 1.5∗h - 0.5(h/a)∧ 3
ExponentialKriging Kriging(p. 163) exponencial: el peso es 1 - e∧ (-h/a)
GaussianKriging Kriging(p. 163) gausiano: el peso es 1 - e∧ -(-h/a)∧ 2
pt::math::Kriging::Kriging (int n)
Constructor.
Parámetros:
n representa el numero de puntos que tendrá.
pt::math::Kriging::∼Kriging ()
Destructor
eyeboard/src/kriging.h
eyeboard/src/kriging.cpp
pt::math::Real2dPoint
+x
+y
+ Real2dPoint()
+ Real2dPoint()
+ Real2dPoint()
+ operator=()
+ toIppiPoint()
+ dist()
point
value
pt::math::Kriging::SPointValue
+ point
+ value
+ SPointValue()
Métodos públicos
Atributos públicos
Real2dPoint point
Real2dPoint value
Real2dPoint pt::math::Kriging::SPointValue::point
Contiene las coordenadas del punto
Real2dPoint pt::math::Kriging::SPointValue::value
Contiene el valor de la muestra en ese punto
Nota:
La muestra es un espacio bidimensional
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/kriging.h
#include <logger.h>
Diagrama de herencias de pt::Logger
pt::Singleton< T >
# ms_Singleton
+ Singleton()
+ ~Singleton()
+ getSingleton()
+ getSingletonPtr()
pt::Logger
# my_log
# file_name
# app_name
# log_level
# log_type
+ Logger()
+ ~Logger()
+ logMessage()
+ syslogMessage()
+ setLogLevel()
+ setLogFile()
+ setAppName()
+ getSingleton()
pt::Logger
# my_log
# file_name
# app_name pt::Singleton< T >
# log_level
# log_type # ms_Singleton
+ Logger() + Singleton()
+ ~Logger() + ~Singleton()
+ logMessage() + getSingleton()
+ syslogMessage() + getSingletonPtr()
+ setLogLevel()
+ setLogFile()
+ setAppName()
+ getSingleton()
Métodos públicos
Atributos protegidos
std::ofstream my_log
std::string file_name
std::string app_name
int log_level
int log_type
Clase creada para loggear todos los eventos de una aplicacion "UNIX-like". Existen
dos tipos de logs: aquellos importantes para el sistema (sys log) que se guardan en
disco a traves del demonio syslogd, y aquellos particulares de la aplicacion (file
log) que se escriben en un fichero especificado.
Se consideran eventos importantes para el sistema:
"daemon started"
"critical error"
...
Logger(p. 169) puede ser utilizado para escribir en fichero cualquier tipo de infor-
macion util para una determinada aplicacion, siempre que sea en modo log (ap-
pend).
La distincion final entre el tipo de log (syslog o filelog) a utilizar sera decidida por
el usuario de esta clase, aunque se recomienda utilizar syslog solo en los casos en
los que contenga informacion relevante para el sistema.
La implementacion de esta clase busca seguridad y velocidad, por ello no abre y
cierra en cada evento de log el fichero en el que se guardaran los mensajes, sino
que utiliza un "flush" consiguiendo asi que se guarden los cambios en disco.
Esta clase es instanciable una sola vez (singleton)
pt::Logger::∼Logger () [virtual]
Destructor
eyeboard/src/logger.h
eyeboard/src/logger.cpp
#include <profiler.h>
Diagrama de herencias de pt::Profiler
pt::Singleton< T >
# ms_Singleton
+ Singleton()
+ ~Singleton()
+ getSingleton()
+ getSingletonPtr()
pt::Profiler
- profiles
+ Profiler()
+ ~Profiler()
+ createProfile()
+ startTimer()
+ stopTimer()
+ getMean()
+ getAcumTime()
+ getStdDev()
+ getMax()
+ getMin()
pt::Profiler
- profiles
+ Profiler() pt::Singleton< T >
+ ~Profiler() # ms_Singleton
+ createProfile()
+ startTimer() + Singleton()
+ stopTimer() + ~Singleton()
+ getMean() + getSingleton()
+ getAcumTime() + getSingletonPtr()
+ getStdDev()
+ getMax()
+ getMin()
Métodos públicos
Profiler ()
Constructor.
∼Profiler ()
Destructor.
Máximo.
Atributos privados
Clases
class CProfile
pt::Profiler::Profiler ()
Constructor.
pt::Profiler::∼Profiler ()
Destructor.
eyeboard/src/profiler.h
eyeboard/src/profiler.cpp
Métodos públicos
∼CProfile ()
void startTimer ()
void stopTimer ()
Almacena el tiempo en el que se detiene el cronometro.
Métodos privados
Atributos privados
float cur_val
Tiempo de media acumulado.
double acum_time
Tiempo total acumulado.
std::string prof_name
Nombre del profile.
vm_tick time_start
Tiempo al inicio.
vm_tick time_end
Tiempo al final.
vm_tick freq
Frecuencia.
pt::Profiler::CProfile::∼CProfile ()
void pt::Profiler::CProfile::startTimer ()
Almacena el tiempo en el que se inicia el cronometro.
void pt::Profiler::CProfile::stopTimer ()
Almacena el tiempo en el que se detiene el cronometro.
eyeboard/src/profiler.h
eyeboard/src/profiler.cpp
#include <maths.h>
Métodos públicos
Real2dPoint ()
Real2dPoint (IppiPoint p)
Real2dPoint (float _x, float _y)
void operator= (const IppiPoint &p)
IppiPoint toIppiPoint ()
Atributos públicos
float x
float y
Versión:
0.1
Fecha:
2006
pt::math::Real2dPoint::Real2dPoint () [inline]
Constructor vacío
Parámetros:
_x contiene la coordenada x
_y contiene la coordenada y
float pt::math::Real2dPoint::x
Contiene la coordenada x
float pt::math::Real2dPoint::y
Contiene la coordenada y
La documentación para esta clase fué generada a partir del siguiente archivo:
eyeboard/src/maths.h
#include <singleton.h>
Diagrama de herencias de pt::Singleton< T >
pt::Singleton< T >
# ms_Singleton
+ Singleton()
+ ~Singleton()
+ getSingleton()
+ getSingletonPtr()
pt::Logger
pt::Profiler
# my_log
# file_name - profiles
# app_name
# log_level + Profiler()
# log_type + ~Profiler()
+ createProfile()
+ Logger() + startTimer()
+ ~Logger() + stopTimer()
+ logMessage() + getMean()
+ syslogMessage() + getAcumTime()
+ setLogLevel() + getStdDev()
+ setLogFile() + getMax()
+ setAppName() + getMin()
+ getSingleton()
Métodos públicos
Singleton ()
∼Singleton (void)
static T ∗ ms_Singleton = 0
Desvincula el singleton
eyeboard/src/singleton.h
eyeboard/src/singleton.cpp
#include <eyeboard.h>
Métodos públicos
Atributos públicos
uchar b
uchar g
uchar r
uchar alfa
uchar pt::SPixel::alfa
uchar pt::SPixel::b
uchar pt::SPixel::g
uchar pt::SPixel::r
La documentación para esta estructura fué generada a partir del siguiente archivo:
eyeboard/src/eyeboard.h
#include <videowriter.h>
Tipos públicos
enum EPixelFormat {
PIX_FMT_NONE = -1, PIX_FMT_YUV420P, PIX_FMT_YUV422,
PIX_FMT_RGB24,
PIX_FMT_BGR24, PIX_FMT_YUV422P, PIX_FMT_YUV444P,
PIX_FMT_RGBA32,
PIX_FMT_YUV410P, PIX_FMT_YUV411P, PIX_FMT_RGB565,
PIX_FMT_RGB555,
PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, PIX_FMT_-
MONOBLACK, PIX_FMT_PAL8,
PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P,
PIX_FMT_XVMC_MPEG2_MC,
PIX_FMT_XVMC_MPEG2_IDCT, PIX_FMT_UYVY422, PIX_-
FMT_UYVY411, PIX_FMT_NB }
enum ECodecID {
CODEC_ID_NONE, CODEC_ID_MPEG1VIDEO, CODEC_ID_-
MPEG2VIDEO, CODEC_ID_MPEG2VIDEO_XVMC,
CODEC_ID_H261, CODEC_ID_H263, CODEC_ID_RV10, CODEC_-
ID_RV20,
CODEC_ID_MJPEG, CODEC_ID_MJPEGB, CODEC_ID_LJPEG,
CODEC_ID_SP5X,
CODEC_ID_JPEGLS, CODEC_ID_MPEG4, CODEC_ID_-
RAWVIDEO, CODEC_ID_MSMPEG4V1,
CODEC_ID_MSMPEG4V2, CODEC_ID_MSMPEG4V3, CODEC_-
ID_WMV1, CODEC_ID_WMV2,
CODEC_ID_H263P, CODEC_ID_H263I, CODEC_ID_FLV1,
CODEC_ID_SVQ1,
CODEC_ID_SVQ3, CODEC_ID_DVVIDEO, CODEC_ID_-
HUFFYUV, CODEC_ID_CYUV,
CODEC_ID_H264, CODEC_ID_INDEO3, CODEC_ID_VP3,
CODEC_ID_THEORA,
CODEC_ID_ASV1, CODEC_ID_ASV2, CODEC_ID_FFV1, CODEC_-
ID_4XM,
CODEC_ID_VCR1, CODEC_ID_CLJR, CODEC_ID_MDEC,
CODEC_ID_ROQ,
CODEC_ID_INTERPLAY_VIDEO, CODEC_ID_XAN_WC3,
CODEC_ID_XAN_WC4, CODEC_ID_RPZA,
Métodos públicos
VideoWriter ()
∼VideoWriter ()
int init (std::string fileName, int width, int height, int bpp, int fps, ECodec-
ID cdc=CODEC_ID_NONE)
void saveFrame (char ∗)
void close ()
Métodos privados
void open_video ()
AVFrame ∗ alloc_picture (int pix_fmt)
AVStream ∗ add_video_stream (int codec_id)
Atributos privados
std::string file_name
int width
int height
int bpp
PixelFormat pixel_format
int fps
AVOutputFormat ∗ fmt
AVFormatContext ∗ oc
AVStream ∗ video_st
AVFrame ∗ picture
AVFrame ∗ tmp_picture
uint8_t ∗ video_outbuf
int frame_count
int video_outbuf_size
bool initted
Versión:
0.1
Fecha:
2006
enum pt::renderers::VideoWriter::ECodecID
Identificador del codec, consultar /usr/include/ffmpeg/avcodec.h
Valores de la enumeración:
CODEC_ID_NONE
CODEC_ID_MPEG1VIDEO
CODEC_ID_MPEG2VIDEO
CODEC_ID_MPEG2VIDEO_XVMC
CODEC_ID_H261
CODEC_ID_H263
CODEC_ID_RV10
CODEC_ID_RV20
CODEC_ID_MJPEG
CODEC_ID_MJPEGB
CODEC_ID_LJPEG
CODEC_ID_SP5X
CODEC_ID_JPEGLS
CODEC_ID_MPEG4
CODEC_ID_RAWVIDEO
CODEC_ID_MSMPEG4V1
CODEC_ID_MSMPEG4V2
CODEC_ID_MSMPEG4V3
CODEC_ID_WMV1
CODEC_ID_WMV2
CODEC_ID_H263P
CODEC_ID_H263I
CODEC_ID_FLV1
CODEC_ID_SVQ1
CODEC_ID_SVQ3
CODEC_ID_DVVIDEO
CODEC_ID_HUFFYUV
CODEC_ID_CYUV
CODEC_ID_H264
CODEC_ID_INDEO3
CODEC_ID_VP3
CODEC_ID_THEORA
CODEC_ID_ASV1
CODEC_ID_ASV2
CODEC_ID_FFV1
CODEC_ID_4XM
CODEC_ID_VCR1
CODEC_ID_CLJR
CODEC_ID_MDEC
CODEC_ID_ROQ
CODEC_ID_INTERPLAY_VIDEO
CODEC_ID_XAN_WC3
CODEC_ID_XAN_WC4
CODEC_ID_RPZA
CODEC_ID_CINEPAK
CODEC_ID_WS_VQA
CODEC_ID_MSRLE
CODEC_ID_MSVIDEO1
CODEC_ID_IDCIN
CODEC_ID_8BPS
CODEC_ID_SMC
CODEC_ID_FLIC
CODEC_ID_TRUEMOTION1
CODEC_ID_VMDVIDEO
CODEC_ID_MSZH
CODEC_ID_ZLIB
CODEC_ID_QTRLE
CODEC_ID_SNOW
CODEC_ID_TSCC
CODEC_ID_ULTI
CODEC_ID_QDRAW
CODEC_ID_VIXL
CODEC_ID_QPEG
CODEC_ID_XVID
CODEC_ID_PNG
CODEC_ID_PPM
CODEC_ID_PBM
CODEC_ID_PGM
CODEC_ID_PGMYUV
CODEC_ID_PAM
CODEC_ID_FFVHUFF
CODEC_ID_RV30
CODEC_ID_RV40
CODEC_ID_VC9
CODEC_ID_WMV3
CODEC_ID_LOCO
CODEC_ID_WNV1
CODEC_ID_AASC
CODEC_ID_INDEO2
CODEC_ID_FRAPS
CODEC_ID_TRUEMOTION2
CODEC_ID_BMP
CODEC_ID_CSCD
CODEC_ID_MMVIDEO
CODEC_ID_ZMBV
CODEC_ID_AVS
CODEC_ID_SMACKVIDEO
CODEC_ID_NUV
CODEC_ID_PCM_S16LE
CODEC_ID_PCM_S16BE
CODEC_ID_PCM_U16LE
CODEC_ID_PCM_U16BE
CODEC_ID_PCM_S8
CODEC_ID_PCM_U8
CODEC_ID_PCM_MULAW
CODEC_ID_PCM_ALAW
CODEC_ID_PCM_S32LE
CODEC_ID_PCM_S32BE
CODEC_ID_PCM_U32LE
CODEC_ID_PCM_U32BE
CODEC_ID_PCM_S24LE
CODEC_ID_PCM_S24BE
CODEC_ID_PCM_U24LE
CODEC_ID_PCM_U24BE
CODEC_ID_PCM_S24DAUD
CODEC_ID_ADPCM_IMA_QT
CODEC_ID_ADPCM_IMA_WAV
CODEC_ID_ADPCM_IMA_DK3
CODEC_ID_ADPCM_IMA_DK4
CODEC_ID_ADPCM_IMA_WS
CODEC_ID_ADPCM_IMA_SMJPEG
CODEC_ID_ADPCM_MS
CODEC_ID_ADPCM_4XM
CODEC_ID_ADPCM_XA
CODEC_ID_ADPCM_ADX
CODEC_ID_ADPCM_EA
CODEC_ID_ADPCM_G726
CODEC_ID_ADPCM_CT
CODEC_ID_ADPCM_SWF
CODEC_ID_ADPCM_YAMAHA
CODEC_ID_ADPCM_SBPRO_4
CODEC_ID_ADPCM_SBPRO_3
CODEC_ID_ADPCM_SBPRO_2
CODEC_ID_AMR_NB
CODEC_ID_AMR_WB
CODEC_ID_RA_144
CODEC_ID_RA_288
CODEC_ID_ROQ_DPCM
CODEC_ID_INTERPLAY_DPCM
CODEC_ID_XAN_DPCM
CODEC_ID_SOL_DPCM
CODEC_ID_MP2
CODEC_ID_MP3
CODEC_ID_AAC
CODEC_ID_MPEG4AAC
CODEC_ID_AC3
CODEC_ID_DTS
CODEC_ID_VORBIS
CODEC_ID_DVAUDIO
CODEC_ID_WMAV1
CODEC_ID_WMAV2
CODEC_ID_MACE3
CODEC_ID_MACE6
CODEC_ID_VMDAUDIO
CODEC_ID_SONIC
CODEC_ID_SONIC_LS
CODEC_ID_FLAC
CODEC_ID_MP3ADU
CODEC_ID_MP3ON4
CODEC_ID_SHORTEN
CODEC_ID_ALAC
CODEC_ID_WESTWOOD_SND1
CODEC_ID_GSM
CODEC_ID_QDM2
CODEC_ID_COOK
CODEC_ID_TRUESPEECH
CODEC_ID_TTA
CODEC_ID_SMACKAUDIO
CODEC_ID_OGGTHEORA
CODEC_ID_DVD_SUBTITLE
CODEC_ID_DVB_SUBTITLE
CODEC_ID_MPEG2TS
enum pt::renderers::VideoWriter::EPixelFormat
Formato de pixel, consultar /usr/include/ffmpeg/avcodec.h
Valores de la enumeración:
PIX_FMT_NONE
PIX_FMT_YUV420P Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y sam-
ples).
pt::renderers::VideoWriter::VideoWriter ()
Constructor
pt::renderers::VideoWriter::∼VideoWriter ()
Destructor
void pt::renderers::VideoWriter::close ()
Cierra el fichero escribiendo todo lo que falte.
eyeboard/src/videowriter.h
eyeboard/src/videowriter.cpp
#include <worldprocessing.h>
Diagrama de herencias de pt::processing::WorldProcessing
pt::processing::BaseProcessing
# WIDTH
# HEIGHT
# m_capture
+ BaseProcessing()
+ ~BaseProcessing()
+ destroy()
+ processFrame()
+ getBufferPtr()
pt::processing::WorldProcessing
- NUMPOINTS
- roi
- gauss
- point_array
- temp_array
- points
- status
- initted
+ WorldProcessing()
+ ~WorldProcessing()
+ init()
+ destroy()
+ processFrame()
+ getImage24()
+ getImage()
+ getBufferPtr()
+ getPoint()
+ setPlayingOnly()
+ isFound()
- detection()
- isPoint()
- compX()
- compY()
pt::Image
- mp_pixels
- m_width
- m_height
- m_bpp
- m_step_bytes
- m_initialized
+ Image()
+ Image()
+ ~Image()
+ freeImage()
+ init()
+ getPixels()
+ getWidth()
+ getHeight()
+ getBpp()
+ isInitialized()
+ drawCross()
+ drawCross()
+ drawCross()
+ drawRect()
+ drawRect()
+ drawCross()
+ drawCross()
m_capture
pt::math::Distribution
points point_array
temp_array
pt::processing::WorldProcessing
- NUMPOINTS
- roi
- gauss
- point_array
- temp_array
- points
- status
- initted
+ WorldProcessing()
+ ~WorldProcessing()
+ init()
+ destroy()
+ processFrame()
+ getImage24()
+ getImage()
+ getBufferPtr()
+ getPoint()
+ setPlayingOnly()
+ isFound()
- detection()
- isPoint()
- compX()
- compY()
Métodos públicos
WorldProcessing ()
∼WorldProcessing ()
void init (int w, int h, int numpoints=9)
void destroy ()
void processFrame (Ipp8u ∗img)
Tipos privados
Métodos privados
void detection ()
bool isPoint (int i, int j, Ipp8u centro)
Atributos privados
Versión:
0.1
Fecha:
2006
Valores de la enumeración:
finding Los puntos de calibrado no se han encontrado en el ultimo frame,
pero se siguen buscando
found Los puntos de calibrado se encontraron en el último frame
playing Ya no es necesario buscar los puntos de calibrado (Ya se ha calibrado
el sistema)
pt::processing::WorldProcessing::WorldProcessing ()
Constructor
pt::processing::WorldProcessing::∼WorldProcessing ()
Destructor
math::Distribution pt::processing::WorldProcessing::point_array
[private]
Array de puntos de calibración
math::Distribution pt::processing::WorldProcessing::temp_array
[private]
Array temporal de puntos
La documentación para esta clase fué generada a partir de los siguientes archivos:
eyeboard/src/worldprocessing.h
eyeboard/src/worldprocessing.cpp
#include "avireader.h"
Namespaces
namespace pt
namespace pt::readers
Definiciones
#define READ4CC(x)
#define READSIZE(x)
#define READRAW(x) fread(static_cast<void∗>(&x), sizeof(x), 1, riff_-
file);
#define READ4CC(x)
Valor:
fread(x,4, 1, riff_file); \
if(!strcmp(x,#x)) \
return -1;
#define READSIZE(x)
Valor:
fread(static_cast<void*>(&x), 4, 1, riff_file); \
if(x<0) \
return -1;
Lee un entero
#include <stdio.h>
#include <cstring>
#include <string>
#include "basereader.h"
#include "logger.h"
Dependencia gráfica adjunta para avireader.h:
stdio.h
eyeboard/src/avireader.h cstring
string
Namespaces
namespace pt
namespace pt::readers
Clases
class pt::readers::AviReader
struct pt::readers::AviReader::SAviMainHeader
struct pt::readers::AviReader::AviStreamHeader
struct pt::readers::AviReader::STagRGBQUAD
struct pt::readers::AviReader::STagBITMAPINFOHEADER
struct pt::readers::AviReader::STagBITMAPINFO
struct pt::readers::AviReader::SWaveFormatEx
struct pt::readers::AviReader::SAviOldIndexEntry
struct pt::readers::AviReader::SAviOldIndex
Definiciones
#include "baseprocessing.h"
Namespaces
namespace pt
namespace pt::processing
#include <unistd.h>
#include <string.h>
#include <ippcc.h>
#include <ippi.h>
#include <ippcv.h>
#include <iostream>
#include <vm_time.h>
#include "image.h"
Dependencia gráfica adjunta para baseprocessing.h:
unistd.h
string.h
ippcc.h
eyeboard/src/baseprocessing.h ippi.h
ippcv.h
iostream
vm_time.h
Namespaces
namespace pt
namespace pt::processing
Clases
class pt::processing::BaseProcessing
#include "basereader.h"
Namespaces
namespace pt
namespace pt::readers
Namespaces
namespace pt
namespace pt::readers
Clases
class pt::readers::BaseReader
#include "camreader.h"
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
Dependencia gráfica adjunta para camreader.cpp:
sys/ioctl.h
sys/types.h
sys/stat.h
eyeboard/src/camreader.cpp sys/mman.h
fcntl.h
unistd.h
string.h
Namespaces
namespace pt
namespace pt::readers
#include <linux/videodev.h>
#include <pthread.h>
#include <cassert>
#include <iostream>
Dependencia gráfica adjunta para camreader.h:
linux/videodev.h
pthread.h
eyeboard/src/camreader.h
cassert
iostream
Namespaces
namespace pt
namespace pt::readers
Clases
class pt::readers::CamReader
Definiciones
#define CAMREADER_H
#define __STRICT_ANSI__
#define __STRICT_ANSI__
#define CAMREADER_H
#include "capture.h"
Namespaces
namespace pt
namespace pt::readers
namespace std
Definiciones
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/videodev2.h>
#include <linux/videodev.h>
#include <iostream>
#include <syslog.h>
#include <string>
#include <fstream>
#include <iomanip>
Dependencia gráfica adjunta para capture.h:
stdio.h
stdlib.h
string.h
assert.h
fcntl.h
unistd.h
errno.h
sys/stat.h
sys/types.h
sys/time.h
eyeboard/src/capture.h
sys/mman.h
sys/ioctl.h
asm/types.h
linux/videodev2.h
linux/videodev.h
iostream
syslog.h
string
fstream
iomanip
Namespaces
namespace pt
namespace pt::readers
Clases
class pt::readers::Capture
struct pt::readers::Capture::buffer
Definiciones
#define __STRICT_ANSI__
#define __STRICT_ANSI__
#include "distribution.h"
Namespaces
namespace pt
namespace pt::math
#include <ippi.h>
#include <ipps.h>
#include <stdio.h>
#include "logger.h"
#include "maths.h"
Dependencia gráfica adjunta para distribution.h:
ippi.h
eyeboard/src/distribution.h ipps.h
stdio.h
Namespaces
namespace pt
namespace pt::math
Clases
class pt::math::Distribution
#include "eyeboard.h"
#include "eyeboard.moc"
Dependencia gráfica adjunta para eyeboard.cpp:
eyeboard/src/eyeboard.cpp eyeboard.moc
Namespaces
namespace pt
#include <string>
#include <fstream>
#include <iostream>
#include "eyeboardbase.h"
#include <qcanvas.h>
#include <qdir.h>
#include <qtimer.h>
#include <qstring.h>
#include <qimage.h>
#include <qpixmap.h>
#include "capture.h"
#include "worldprocessing.h"
#include "eyeprocessing.h"
#include "maths.h"
#include "kriging.h"
#include "videowriter.h"
#include "logger.h"
#include "glwindow.h"
Dependencia gráfica adjunta para eyeboard.h:
string
fstream
iostream
eyeboardbase.h
qcanvas.h
eyeboard/src/eyeboard.h
qdir.h
qtimer.h
qstring.h
qimage.h
qpixmap.h
Namespaces
namespace pt
Clases
struct pt::SPixel
class pt::eyeboard
Application Main Window.
struct pt::eyeboard::SKey
Definiciones
#define QT_CLEAN_NAMESPACE
#define QT_CLEAN_NAMESPACE
#include "eyeprocessing.h"
Namespaces
namespace pt
namespace pt::processing
#include <unistd.h>
#include <string.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <ippcc.h>
#include <ippi.h>
#include <ippcv.h>
#include <iostream>
#include <vm_time.h>
#include "distribution.h"
#include "baseprocessing.h"
#include "logger.h"
Dependencia gráfica adjunta para eyeprocessing.h:
unistd.h
string.h
cv.h
cxcore.h
highgui.h
eyeboard/src/eyeprocessing.h
ippcc.h
ippi.h
ippcv.h
iostream
vm_time.h
Namespaces
namespace pt
namespace pt::processing
Clases
class pt::processing::EyeProcessing
#include <unistd.h>
#include "glwindow.h"
Dependencia gráfica adjunta para glwindow.cpp:
eyeboard/src/glwindow.cpp unistd.h
Namespaces
namespace pt
namespace pt::renderers
#include <GL/glx.h>
#include <GL/gl.h>
#include <X11/extensions/xf86vmode.h>
#include <X11/keysym.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <string>
#include <iostream>
#include "logger.h"
Dependencia gráfica adjunta para glwindow.h:
GL/glx.h
GL/gl.h
X11/extensions/xf86vmode.h
X11/keysym.h
stdio.h
eyeboard/src/glwindow.h stdlib.h
math.h
time.h
string.h
string
iostream
Namespaces
namespace pt
namespace pt::renderers
Clases
class pt::renderers::GLWindow
#include "image.h"
Namespaces
namespace pt
#include <string.h>
#include <assert.h>
#include <ippi.h>
#include "maths.h"
#include "logger.h"
Dependencia gráfica adjunta para image.h:
string.h
eyeboard/src/image.h assert.h
ippi.h
Namespaces
namespace pt
Clases
class pt::Image
#include "kriging.h"
Namespaces
namespace pt
namespace pt::math
#include <ippi.h>
#include <ippm.h>
#include <cmath>
#include <vector>
#include <iostream>
#include "maths.h"
#include "logger.h"
Dependencia gráfica adjunta para kriging.h:
ippi.h
ippm.h
eyeboard/src/kriging.h cmath
vector
iostream
Namespaces
namespace pt
namespace pt::math
Clases
class pt::math::Kriging
struct pt::math::Kriging::SPointValue
#include "logger.h"
Namespaces
namespace pt
#include <string>
#include <fstream>
#include <iomanip>
#include <syslog.h>
#include "singleton.h"
Dependencia gráfica adjunta para logger.h:
string
fstream
eyeboard/src/logger.h
iomanip
syslog.h
Namespaces
namespace pt
Clases
class pt::Logger
Definiciones
#define LL_EMERG 0
#define LL_ALERT 1
#define LL_CRIT 2
#define LL_ERR 3
#define LL_WARNING 4
#define LL_NOTICE 5
#define LL_INFO 6
#define LL_DEBUG 7
#define LL_ALERT 1
#define LL_CRIT 2
#define LL_DEBUG 7
#define LL_EMERG 0
Indica la importancia del mensaje a loggear. (Obtenidos de syslog.h) En orden de
importancia decreciente:
#define LL_ERR 3
#define LL_INFO 6
#define LL_NOTICE 5
#define LL_WARNING 4
#include "eyeboard.h"
#include <kapplication.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <klocale.h>
Dependencia gráfica adjunta para main.cpp:
kapplication.h
kaboutdata.h
eyeboard/src/main.cpp
kcmdlineargs.h
klocale.h
Funciones
Variables
Tareas Pendientes
do something with the command line args here
KCmdLineLastOption
}
#include "maths.h"
Namespaces
namespace pt
namespace pt::math
#include <math.h>
#include <ipp.h>
Dependencia gráfica adjunta para maths.h:
math.h
eyeboard/src/maths.h
ipp.h
Namespaces
namespace pt
namespace pt::math
Clases
class pt::math::Int2dPoint
class pt::math::Real2dPoint
class pt::math::Definitions
#include "profiler.h"
Namespaces
namespace pt
#include <vector>
#include <string>
#include <iostream>
#include <vm_time.h>
#include "singleton.h"
#include "logger.h"
Dependencia gráfica adjunta para profiler.h:
vector
string
eyeboard/src/profiler.h
iostream
vm_time.h
Namespaces
namespace pt
Clases
class pt::Profiler
class pt::Profiler::CProfile
#include "singleton.h"
Namespaces
namespace pt
#include <fstream>
#include <assert.h>
Dependencia gráfica adjunta para singleton.h:
fstream
eyeboard/src/singleton.h
assert.h
Namespaces
namespace pt
Clases
#include "videowriter.h"
Namespaces
namespace pt
namespace pt::renderers
#include <iostream>
#include <string>
#include <cstdio>
#include <avformat.h>
Dependencia gráfica adjunta para videowriter.h:
iostream
string
eyeboard/src/videowriter.h
cstdio
avformat.h
Namespaces
namespace pt
namespace pt::renderers
Clases
class pt::renderers::VideoWriter
#include "worldprocessing.h"
Namespaces
namespace pt
namespace pt::processing
#include "baseprocessing.h"
#include "logger.h"
#include "distribution.h"
#include "maths.h"
#include "cv.h"
#include "cxcore.h"
#include <stdlib.h>
#include <iostream>
Dependencia gráfica adjunta para worldprocessing.h:
cv.h
cxcore.h
eyeboard/src/worldprocessing.h
stdlib.h
iostream
Namespaces
namespace pt
namespace pt::processing
Clases
class pt::processing::WorldProcessing
Anexos
Capítulo 8
Tracker binocular. El sistema propuesto está formado por una cámara que
apunta a un solo ojo del usuario, lo cual supone la pérdida de profundidad de
la escena por parte del programa. La distancia al objeto apuntado ha de ser
inferida a partir de una imagen bidimensional. Un sistema que disponga de
una cámara para cada ojo podría calcular la distancia al objeto en cuestión y
podría, en función de ello, eliminar el tan odiado defecto del paralaje. Este
nuevo sistema permitiría registrar los movimientos de vergencia también.
• Moviendo ventanas con ayuda del otro ojo. De esta forma el ojo dere-
cho se utilizaría como “botón” de un ratón.
• Se podría jugar a juegos de ordenador utilizando el sistema construido
como ratón, lo cual incrementaría enormemente la velocidad con la que
normalmente movemos el ratón. Podría suponer el fin de la diversión
de los juegos en FPS.
Este sistema sería realmente útil en deportes como fórmula uno, rallies, ten-
nis. . .
[8] Nuevos periféricos utilizados como ayudas técnicas para personas con disca-
pacidad. Joaquín Fonoll Salvador.
[15] Navid Qaragozlou Ali Ajdari Rad, Karim Faez. Fast circle detection using
gradient pair vectors, 2003.
[16] Gautam Barua. Optimal estimations of random fields using kriging. In Colle-
ge on Soil Physics, March 2003.
[17] R.H.S. Carpenter. Movements of the Eyes. Pion Limited, sencond edition,
1988.
240 BIBLIOGRAFÍA
__STRICT_ANSI__ pt::processing::WorldProcessing,
camreader.h, 208 200
capture.h, 211 ∼eyeboard
∼AviReader pt::eyeboard, 134
pt::readers::AviReader, 99
aberraciones, 13
∼BaseProcessing
acum_time
pt::processing::BaseProcessing,
pt::Profiler::CProfile, 179
114
add_video_stream
∼BaseReader
pt::renderers::VideoWriter, 195
pt::readers::BaseReader, 117
addPoint
∼CProfile
pt::math::Distribution, 130
pt::Profiler::CProfile, 178
pt::math::Kriging, 165
∼CamReader
addTime
pt::readers::CamReader, 120
pt::Profiler::CProfile, 178
∼Capture Alexander Stepanov, 77
pt::readers::Capture, 125 alfa
∼Distribution pt::SPixel, 184
pt::math::Distribution, 130 all_image
∼EyeProcessing pt::processing::EyeProcessing, 151
pt::processing::EyeProcessing, 147 alloc_picture
∼GLWindow pt::renderers::VideoWriter, 195
pt::renderers::GLWindow, 154 app_name
∼Image pt::Logger, 172
pt::Image, 159 ARB, 77
∼Kriging atención, 7
pt::math::Kriging, 165 atención visual, 8
∼Logger attr
pt::Logger, 171 pt::renderers::GLWindow, 156
∼Profiler aux_xx
pt::Profiler, 175 pt::math::Kriging, 166
∼Singleton avi_main_header
pt::Singleton, 183 pt::readers::AviReader, 100
∼VideoWriter avi_old_index
pt::renderers::VideoWriter, 194 pt::readers::AviReader, 100
∼WorldProcessing avi_stream_header
242 ÍNDICE ALFABÉTICO
dwSize estela
pt::readers::AviReader::SAviOld- pt::eyeboard, 136
IndexEntry, 107 estela_pos
dwStart pt::eyeboard, 136
pt::readers::AviReader::Avi- ExponentialKriging
StreamHeader, 103 pt::math::Kriging, 165
dwStreams eye tracker, 25
pt::readers::AviReader::SAviMain- eye_h
Header, 105 pt::eyeboard, 136
dwSuggestedBufferSize eye_position
pt::readers::AviReader::Avi- pt::processing::EyeProcessing, 151
StreamHeader, 103 eye_processing
pt::readers::AviReader::SAviMain- pt::eyeboard, 136
Header, 105 eye_reader
dwTotalFrames pt::eyeboard, 137
pt::readers::AviReader::SAviMain- eye_w
Header, 105 pt::eyeboard, 137
dwWidth EyeBoard, 89
pt::readers::AviReader::SAviMain- eyeboard
Header, 105 pt::eyeboard, 134
eyeboard.h
e QT_CLEAN_NAMESPACE, 213
pt::math::Definitions, 129 eyeboard/src/avireader.cpp, 203
EagleEyes, 36 eyeboard/src/avireader.h, 204
ECodecID eyeboard/src/baseprocessing.cpp, 205
pt::renderers::VideoWriter, 188 eyeboard/src/baseprocessing.h, 205
EHT, 56 eyeboard/src/basereader.cpp, 206
EKrigingModel eyeboard/src/basereader.h, 206
pt::math::Kriging, 165 eyeboard/src/camreader.cpp, 207
electro-oculografía, 25 eyeboard/src/camreader.h, 207
EMachineStatus eyeboard/src/capture.cpp, 208
pt::processing::EyeProcessing, 147 eyeboard/src/capture.h, 209
entries eyeboard/src/distribution.cpp, 211
pt::readers::AviReader::SAviOld- eyeboard/src/distribution.h, 211
Index, 106 eyeboard/src/eyeboard.cpp, 212
EOG, 25 eyeboard/src/eyeboard.h, 212
EPixelFormat eyeboard/src/eyeprocessing.cpp, 214
pt::renderers::VideoWriter, 193 eyeboard/src/eyeprocessing.h, 214
esclerótica, 16, 60 eyeboard/src/glwindow.cpp, 215
escrito eyeboard/src/glwindow.h, 216
pt::eyeboard, 136 eyeboard/src/image.cpp, 217
EStatus eyeboard/src/image.h, 217
pt::processing::WorldProcessing, eyeboard/src/kriging.cpp, 217
200 eyeboard/src/kriging.h, 218
kriging_distance Logger
pt::eyeboard, 138 pt::Logger, 171
kriging_model logger
pt::math::Kriging, 167 pt::eyeboard, 138
kriging_name logger.h
pt::eyeboard, 138 LL_ALERT, 220
LL_CRIT, 220
láser, 231 LL_DEBUG, 220
last_tecla LL_EMERG, 220
pt::eyeboard, 138 LL_ERR, 220
left LL_INFO, 220
pt::readers::AviReader::Avi- LL_NOTICE, 220
StreamHeader, 104 LL_WARNING, 220
length LT_AUTH, 220
pt::readers::Capture::buffer, 128 LT_AUTHPRIV, 220
Lentes de contacto, 25 LT_CRON, 220
librerías, 83 LT_DAEMON, 221
limbo, 16 LT_FTP, 221
LinearKriging LT_KERN, 221
pt::math::Kriging, 165 LT_LPR, 221
LL_ALERT LT_MAIL, 221
logger.h, 220 LT_NEWS, 221
LL_CRIT LT_SYSLOG, 221
logger.h, 220 LT_USER, 221
LL_DEBUG LT_UUCP, 221
logger.h, 220 logMessage
LL_EMERG pt::Logger, 171
logger.h, 220 LONG
LL_ERR avireader.h, 205
logger.h, 220 LT_AUTH
LL_INFO logger.h, 220
logger.h, 220 LT_AUTHPRIV
LL_NOTICE logger.h, 220
logger.h, 220 LT_CRON
LL_WARNING logger.h, 220
logger.h, 220 LT_DAEMON
loadClosedEye logger.h, 221
pt::processing::EyeProcessing, 150 LT_FTP
loadOpenEye logger.h, 221
pt::processing::EyeProcessing, 150 LT_KERN
log_level logger.h, 221
pt::Logger, 172 LT_LPR
log_type logger.h, 221
pt::Logger, 172 LT_MAIL
NUMESTELAPOINTS PIX_FMT_GRAY8
pt::eyeboard, 138 pt::renderers::VideoWriter, 194
NUMPOINTS PIX_FMT_MONOBLACK
pt::processing::WorldProcessing, pt::renderers::VideoWriter, 194
202 PIX_FMT_MONOWHITE
numSamples pt::renderers::VideoWriter, 194
pt::math::Kriging, 167 PIX_FMT_NB
NUMTECLAS pt::renderers::VideoWriter, 194
pt::eyeboard, 138 PIX_FMT_NONE
pt::renderers::VideoWriter, 193
oc PIX_FMT_PAL8
pt::renderers::VideoWriter, 196 pt::renderers::VideoWriter, 194
ojo humano, 11 PIX_FMT_RGB24
open_device pt::renderers::VideoWriter, 194
pt::readers::Capture, 126 PIX_FMT_RGB555
open_eye pt::renderers::VideoWriter, 194
pt::processing::EyeProcessing, 147 PIX_FMT_RGB565
open_eye_saved pt::renderers::VideoWriter, 194
pt::processing::EyeProcessing, 147 PIX_FMT_RGBA32
open_video pt::renderers::VideoWriter, 194
pt::renderers::VideoWriter, 195 PIX_FMT_UYVY411
OpenCV, 77 pt::renderers::VideoWriter, 194
openDevice PIX_FMT_UYVY422
pt::readers::CamReader, 121 pt::renderers::VideoWriter, 194
openEyes, 59 PIX_FMT_XVMC_MPEG2_IDCT
openFile pt::renderers::VideoWriter, 194
pt::readers::AviReader, 100 PIX_FMT_XVMC_MPEG2_MC
OpenGL, 77 pt::renderers::VideoWriter, 194
operator= PIX_FMT_YUV410P
pt::math::Real2dPoint, 181 pt::renderers::VideoWriter, 194
options PIX_FMT_YUV411P
main.cpp, 222 pt::renderers::VideoWriter, 194
PIX_FMT_YUV420P
pantalla táctil, 34 pt::renderers::VideoWriter, 193
percepción, 91 PIX_FMT_YUV422
persecuciones lentas, 22 pt::renderers::VideoWriter, 193
persistencia de la visión, 19 PIX_FMT_YUV422P
phi (fenómeno), 19 pt::renderers::VideoWriter, 194
pi PIX_FMT_YUV444P
pt::math::Definitions, 129 pt::renderers::VideoWriter, 194
picture PIX_FMT_YUVJ420P
pt::renderers::VideoWriter, 196 pt::renderers::VideoWriter, 194
PIX_FMT_BGR24 PIX_FMT_YUVJ422P
pt::renderers::VideoWriter, 194 pt::renderers::VideoWriter, 194
QT_CLEAN_NAMESPACE pt::readers::AviReader::STag-
eyeboard.h, 213 RGBQUAD, 110
riff_file
r pt::readers::AviReader, 101
pt::SPixel, 184 riff_name
RANSAC, 58 pt::readers::AviReader, 101
ratón, 32 right
rcFrame pt::readers::AviReader::Avi-
pt::readers::AviReader::Avi- StreamHeader, 104
StreamHeader, 104 roi
READ4CC pt::processing::WorldProcessing,
avireader.cpp, 203 202
read_frame roi_point
pt::readers::Capture, 126 pt::processing::EyeProcessing, 152
readConfig roi_size
pt::eyeboard, 135 pt::processing::EyeProcessing, 152
readHeader run_timer
pt::eyeboard, 138
pt::readers::AviReader, 100
running
reading_frame_n
pt::readers::CamReader, 123
pt::readers::CamReader, 122
pt::renderers::GLWindow, 156
READRAW
avireader.cpp, 203 sacádicos, 22, 233
READSIZE saveClosedEye
avireader.cpp, 203 pt::processing::EyeProcessing, 150
Real2dPoint saveFrame
pt::math::Real2dPoint, 180, 181 pt::renderers::VideoWriter, 195
reconocimiento de voz, 35 saveOpenEye
reset pt::processing::EyeProcessing, 150
pt::math::Distribution, 130 scale_height
pt::math::Kriging, 166 pt::renderers::GLWindow, 156
resizeGLScene scale_width
pt::renderers::GLWindow, 155 pt::renderers::GLWindow, 156
retina, 18 screen
rgbBlue pt::renderers::GLWindow, 157
pt::readers::AviReader::STag- SEP
RGBQUAD, 110 pt::eyeboard, 139
rgbGreen setAppName
pt::readers::AviReader::STag- pt::Logger, 172
RGBQUAD, 110 setChannel
rgbRed pt::readers::CamReader, 122
pt::readers::AviReader::STag- setDistance
RGBQUAD, 110 pt::math::Kriging, 166
rgbReserved setImage
pt::readers::AviReader::Avi- vwin
StreamHeader, 104 pt::readers::CamReader, 123
trackball, 33
transformada de Hough, 51 wBitsPerSample
Treisman, 10 pt::readers::AviReader::SWave-
Turégano, Enrique, 74 FormatEx, 111
tvtime, 83 weights
pt::math::Kriging, 167
uninit_device wFormatTag
pt::readers::Capture, 126 pt::readers::AviReader::SWave-
Universidad de Extremadura, 74 FormatEx, 111
update WIDTH
pt::renderers::GLWindow, 155 pt::eyeboard, 139
updateHistogram pt::processing::BaseProcessing,
pt::processing::EyeProcessing, 151 115
pt::readers::Capture, 127
value width
pt::math::Kriging::SPointValue, pt::eyeboard::SKey, 141
168 pt::renderers::GLWindow, 157
variogram pt::renderers::VideoWriter, 196
pt::math::Kriging, 167 widthheight
vcaps pt::math::Kriging, 167
pt::readers::CamReader, 123 win
vchannel pt::renderers::GLWindow, 157
pt::readers::CamReader, 123 window_name
vergencias, 22 pt::renderers::GLWindow, 157
version wLanguage
main.cpp, 222 pt::readers::AviReader::Avi-
vestibulares, 23 StreamHeader, 104
video WORD
pt::eyeboard, 139 avireader.h, 205
video-oculografía, 26 world_canvas_pixmap
video_outbuf pt::eyeboard, 139
pt::renderers::VideoWriter, 196 world_h
video_outbuf_size pt::eyeboard, 139
pt::renderers::VideoWriter, 196 world_image
video_st pt::eyeboard, 139
pt::renderers::VideoWriter, 196 world_pixmap_array
VideoWriter pt::eyeboard, 139
pt::renderers::VideoWriter, 194 world_processing
Visio, 75 pt::eyeboard, 139
Von Helmholtz, 8 world_reader
vpic pt::eyeboard, 139
pt::readers::CamReader, 123 world_sprite
pt::eyeboard, 140
world_w
pt::eyeboard, 140
WorldProcessing
pt::processing::WorldProcessing,
200
wPriority
pt::readers::AviReader::Avi-
StreamHeader, 104
x
pt::eyeboard::SKey, 141
pt::math::Int2dPoint, 162
pt::math::Real2dPoint, 181
pt::renderers::GLWindow, 157
x_array
pt::math::Distribution, 130
xAt
pt::math::Distribution, 130
xawtv, 83
xioctl
pt::readers::Capture, 126
y
pt::eyeboard::SKey, 141
pt::math::Int2dPoint, 162
pt::math::Real2dPoint, 181
pt::renderers::GLWindow, 157
y_array
pt::math::Distribution, 131
Yarbus y Noton, 10
yAt
pt::math::Distribution, 130