dispositivo apuntador mediante visión artificial, adecuado para

Anuncio
DISPOSITIVO APUNTADOR MEDIANTE VISIÓN
ARTIFICIAL, ADECUADO PARA USUARIOS DE
COMPUTADOR CON DISCAPACIDAD MOTORA EN
MIEMBROS SUPERIORES
LEIDY MARCELA PEÑA BUENO
YESID RODRÍGUEZ LOZANO
UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS
Facultad Tecnológica
Bogotá
2015
1
DISPOSITIVO APUNTADOR MEDIANTE VISIÓN
ARTIFICIAL, ADECUADO PARA USUARIOS DE
COMPUTADOR CON DISCAPACIDAD MOTORA EN
MIEMBROS SUPERIORES
LEIDY MARCELA PEÑA BUENO
YESID RODRÍGUEZ LOZANO
Trabajo de grado para optar al título de Ingeniero (a) en Control
Dirigido por: M. Eng. Lely Adriana Luengas Contreras
UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS
Facultad Tecnológica
Bogotá
2015
3
4
DEDICATORIA
Leidy: Dedico este trabajo a mis padres, por brindarme su apoyo y
fortaleza en el desarrollo y tanscurso de este, ayudándome a concluir
satisfactoriamente nuestro proyecto.
Lo dedico a Nuestras familias, por la inmensa paciencia que tuvieron
con cada uno de nostros y acompañarnos en cada etapa del mismo.
Dedico a Dios, por brindarme la oportunidad de estar aqui, de
brindarme la paciencia y la sabiduria que se necistaba en los momentos
diciles.
Yesid: Dedico los frutos de este proyecto a mi familia... las personas
que fueron mi inspiraron durante su desarrollo.
AGRADECIMIENTOS
Leidy: En primer lugar, agradezco a Dios por darme la voluntad y la
fuerza para concluir este capitulo tan importante en nuestras vidas.
También agradezco innitamente a nuestras familias, por creer en
nostros, por que en gran parte, gracias a ellos hoy podemos ver
alcanzadas nuestras metas ya que siempre estuvieron impulsandonos en
los momentos más diciles de nuestra carrera.
A la ingeniera Lely Luengas, por habernos guiado en el proceso, por la
paciencia y por la dedicación que tuvo.
Mil palabras no bastarían para agradecerles su apoyo, su comprensión
y sus consejos en los momentos difíciles.
A todos espero no defraudarlos y les ofrezco mi apoyo, sincero e
incondicional.
Yesid: Muchas gracias.
Contenido
1. Introducción
1.1.
Descripción
1.2.
Objetivos
1.3.
17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
1.2.0.1.
Objetivo General . . . . . . . . . . . . . . . . . . . . .
17
1.2.0.2.
Objetivos Especícos . . . . . . . . . . . . . . . . . . .
18
Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2. Estado del Arte
21
2.1.
Proyectos académicos en otros países
. . . . . . . . . . . . . . . . . . .
21
2.2.
Proyectos académicos a nivel Nacional
. . . . . . . . . . . . . . . . . .
23
2.3.
Proyectos de grado en la Universidad Distrital . . . . . . . . . . . . . .
24
3. Marco Teórico
3.1.
3.2.
25
Discapacidad Motora en Miembros Superiores
. . . . . . . . . . . . . .
25
3.1.1.
Niveles de Lesión Cervical
. . . . . . . . . . . . . . . . . . . . .
25
3.1.2.
La columna vertebral . . . . . . . . . . . . . . . . . . . . . . . .
27
3.1.3.
Tetraplejia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.1.3.1.
Denición . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.1.3.2.
Causas de la Tetraplejía
. . . . . . . . . . . . . . . . .
28
3.1.3.3.
Tipos de Tetraplejia
. . . . . . . . . . . . . . . . . . .
29
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
3.2.1.
Protocolos de Prueba . . . . . . . . . . . . . . . . . . . . . . . .
30
3.2.2.
ISO 9241-411:2012
. . . . . . . . . . . . . . . . . . . . . . . . .
30
. . . . . . . . . . . . . . . . . . . . . . . . . .
31
Productos de Apoyo
3.3.
Plataformas Disponibles
3.4.
Procesamiento de Imágenes
3.4.1.
. . . . . . . . . . . . . . . . . . . . . . . .
33
Relaciones Básicas Entre Píxeles . . . . . . . . . . . . . . . . . .
33
3.4.1.1.
34
Vecinos de un Píxel . . . . . . . . . . . . . . . . . . . .
9
CONTENIDO
3.4.1.2.
3.4.2.
. . . . . . . . . . . .
34
Técnicas de Iluminación
. . . . . . . . . . . . . . . . . . . . . .
34
3.4.2.1.
La Iluminación
. . . . . . . . . . . . . . . . . . . . . .
35
3.4.2.2.
Ventajas y Desventajas de la Iluminación.
. . . . . . .
36
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
Ecualización del Histograma . . . . . . . . . . . . . . .
36
Visión Articial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
3.5.1.
Etapas En Un Proceso De Visión Articial . . . . . . . . . . . .
38
3.5.2.
Adquisición de Imágenes . . . . . . . . . . . . . . . . . . . . . .
40
3.5.3.
Preprocesado
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.5.4.
Segmentación
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.5.5.
Análisis
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
Filtros y Clasicadores para Detección de Rostros. . . . . . . . . . . . .
41
3.6.1.
Algoritmo Haar en Cascada (Voila&Jones) . . . . . . . . . . . .
42
3.6.2.
Integrales Proyectivas . . . . . . . . . . . . . . . . . . . . . . . .
44
3.6.2.1.
Deniciones
45
3.6.2.2.
Normalización de Una Imagen Proyectiva
3.4.3.
Histograma
3.4.3.1.
3.5.
3.6.
3.7.
Medida de Distancia entre Pixels
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
46
Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.7.1.
Raspbian
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.7.2.
Python 2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
3.7.3.
OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
3.7.4.
NumPy
49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4. Desarrollo
4.1.
Selección de Tecnologías
4.2.
Dispositivo Apuntador
4.3.
4.4.
10
51
. . . . . . . . . . . . . . . . . . . . . . . . . .
51
. . . . . . . . . . . . . . . . . . . . . . . . . . .
53
4.2.1.
Hardware
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
4.2.2.
Software para Tarjeta Principal (Raspberry Pi2) . . . . . . . . .
54
4.2.3.
Software para tarjeta auxiliar
. . . . . . . . . . . . . . . . . . .
66
Metodología para pruebas funcionales . . . . . . . . . . . . . . . . . . .
66
4.3.1.
66
Método
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ejecución Financiera
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
CONTENIDO
5. Resultados, Conclusiones y Trabajo Futuro
69
5.1.
Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
5.2.
Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
5.3.
Trabajo futuro
71
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A. Código Python para Raspberry Pi 2
73
B. Manual de Usuario
85
C. Poster para Sustentación
97
D. Presentación para Sustentación
99
Referencias
113
11
CONTENIDO
12
Lista de Figuras
3.1.
Niveles de afectación de las lesiones en las vertebras .
3.2.
Estructura de la columna vertebral. Fuente: http://www.fondosmil.com/4safe/La-columna-vertebral.jpg
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
3.8.
Tipos de Iluminación a) Frontal b) Retroiluminación . . . . . . . . . .
imagen y su histograma donde se puede observar la gran cantidad de
puntos obscuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Imagen y su histograma donde se puede observar un amplio rango de grises
Diagramas de Bloques de las etapas de un sistema de visión articial .
Diagrama de bloques Clasicador Haar Cascad e . . . . . . . . . . . . .
Imagen integral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9.
Filtros Haar rotados, trasladado y con cambios de escala. . . . . . . . .
3.3.
3.4.
3.5.
3.6.
3.7.
26
28
35
37
37
39
43
43
44
3.10. Ejemplo de integral proyectiva horizontal y vertical de una imagen. Arriba a la izquierda, la imagen de entrada, hormiga. A la derecha, la proyección vertical,
3.11.
P V hormiga .
Abajo, la proyección horizontal,P H hormiga .
Imágenes proyectivas de un rostro
. . . . . . . . . . . . . . . . . . . . .
46
47
3.12. Normalización de señales en el valor. a) Integrales proyectivas de la gura 3.12, normalizadas con la operación
proyecciones normalizadas con
normalminmax .
normalmedvar .
b) Las mismas
. . . . . . . . . . . . . . .
48
. . . . . . . . . . . . . .
53
4.1.
Arquitectura hardware del sistema apuntador
4.2.
Diagrama de ujo del algoritmo desarrollado para la tarjeta principal
(Raspberry) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
4.3.
Regiones De Interés (ROI) denidas para la boca y los ojos.
57
4.4.
Integrales Proyectivas horizontales y verticales normalizadas para imá-
. . . . . .
genes de la boca abierta y la boca cerrada. Ambas imágenes obtenidas
con luz cenital.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
13
LISTA DE FIGURAS
4.5.
Modelo para IPV (en negro), construido en hoja de cálculo con las IPr
de 19 personas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.6.
60
Detección del desplazamiento. a) Rostro con marca central, b) Rostro en
Centro Actual con el Centro de Referencia,
c) Rostro desplazado con respecto al Centro de Referencia. . . . . . . .
64
4.7.
Zonas de velocidad denidas para el cursor . . . . . . . . . . . . . . . .
65
4.8.
Diagrama de ujo del algoritmo desarrollado para la tarjeta auxiliar
posición de coincidencia de su
(Teensy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.
Gráco del rendimiento del dispositivo apuntador en comparación con
dos dispositivos de uso común . . . . . . . . . . . . . . . . . . . . . . .
14
66
69
Lista de Tablas
3.1.
Comparación de plataformas tecnológicas de desarrollo. Fuente: Autores
33
4.1.
Ejecución nanciera. Fuente: Autores . . . . . . . . . . . . . . . . . . .
68
15
LISTA DE TABLAS
16
Capitulo 1
Introducción
1.1. Descripción
Buscando aportar al proceso de inclusión social e independencia de las personas con
discapacidad motora en sus miembros superiores, que además conservan la movilidad
voluntaria de los músculos de la cabeza, se desarrolló un dispositivo apuntador que
permite posicionar el cursor en la pantalla del computador de acuerdo al movimiento
de la cabeza del usuario, usando técnicas de Visión Articial. Las acciones de selección,
como el clic derecho y el izquierdo, se realizan mediante el parpadeo de cada ojo. Así
mismo, se accede a una rutina de entrenamiento y conguración mediante la apertura
de la boca. El desarrollo se realizó utilizando una plataforma hardware/software de uso
libre, la cual se encarga de capturar las imágenes, procesarlas, analizarlas, interpretarlas
y enviar los datos obtenidos al computador. El dispositivo se acopla al monitor del
computador usando un sistema de agarre por presión y se conecta como cualquier otro
periférico HID por puerto USB.
1.2. Objetivos
1.2.0.1. Objetivo General
El principal objetivo de este proyecto es obtener un dispositivo apuntador que permita controlar el cursor del computador mediante movimientos de la cabeza, utilizando
técnicas de visión articial.
17
1. INTRODUCCIÓN
1.2.0.2. Objetivos Especícos
Seleccionar la conguración de la plataforma hardware/software más apropiada
para desarrollar el proyecto (tipo de tarjeta principal, sistema operativo, tipo de
cámara, fuente de alimentación, interface de comunicación, lenguaje de programación, display).
Desarrollar el software para la tarjeta principal, el cual permita controlar el cursor
del computador y generar las acciones de selección (clic).
Integrar el software y todo el hardware que compone el dispositivo apuntador.
Generar un manual de usuario, donde se expliquen las características del sistema
y su funcionamiento.
1.3. Motivación
El pasado mes de septiembre de 2014, el Ministerio de las Tecnologías de la Información y las Comunicaciones (MinTIC) llevó a cabo el evento Colombia Appcesible,
buscando soluciones mediante las TIC a problemáticas relacionadas con la discapacidad
sensorial y física . Este evento, que no es un hecho aislado (accesibilidad en páginas web
, fútbol para todos , Convertic ), pone de maniesto la importancia que han cobrado en
la actualidad las tecnologías de apoyo para las personas con discapacidad, aportando
autonomía, mejor calidad de vida y un entorno más incluyente para este sector de la
población. [1] El desarrollo actual de las TIC y de los computadores, convierten su
uso en un factor diferenciador en el ámbito social, económico y laboral, generando una
barrera de exclusión para las personas que no pueden acceder o manipular este tipo
de tecnologías. Así mismo, cobran importancia los dispositivos periféricos mediante los
cuales se ingresa la información a los computadores, ya que generalmente se diseñan
para una población estándar y no tiene en cuenta las necesidades de las personas con
discapacidad motora en los miembros superiores[2].
Según datos del Dane (marzo de 2010), en Colombia hay más de 2.3 millones de
personas con discapacidad, de las cuales más del 6 % (aproximadamente 147.000 habitantes) tienen dicultades para manipular objetos con las manos[3]; de estos, más de
35.000 se encuentran en Bogotá [3]. Además, genera inquietud el hecho de que alrededor
de 217.000 personas en Colombia, no estudian por causa de su discapacidad [3].
18
1.3 Motivación
De acuerdo a la Encuesta Nacional de Demografía y Salud (ENDS 2010) [4], el 1,1 %
de la población en los hogares encuestados mencionó como discapacidad el no poder
usar los brazos y/o manos. Esta discapacidad también se va incrementando con la edad
y llega al 5 % entre las personas de 65 años y más; es ligeramente mayor en los niveles de
riqueza más bajos y llega al 2 % en la región Central y en el departamento del Quindío.
En Medellín es de 3 %.
El funcionamiento de un individuo es el resultado de la interacción dinámica entre la
condición de salud y los factores contextuales, de tal manera que interviniendo uno de
estos factores se puede modicar uno o más de los otros elementos, siendo responsabilidad de la sociedad realizar las modicaciones ambientales que faciliten la participación
plena de las personas con discapacidad en todas las esferas de la vida social [5]. Lo
anterior proporciona la motivación para desarrollar un producto de apoyo que facilite
el acceso a las funciones del computador, buscando mejorar las condiciones de vida de
las personas con discapacidad motora en miembros superiores y por ende, contribuir a
mejorar su condición de salud.
Las personas con discapacidad motora en los miembros superiores, requieren productos de apoyo para interactuar con los computadores, los cuales les permitan acceder
a las diferentes aplicaciones, ingresar información y realizar acciones de selección (clic),
sin necesitar el movimiento de sus extremidades superiores o de la colaboración de otra
persona. Es preferible que estos productos de apoyo sean independientes del sistema
operativo, que se puedan utilizar con la mayoría de aplicaciones sin importar su versión
o estado de actualización, que funcionen en la mayoría de computadores sin depender
de la conguración del hardware y que el desempeño no se vea afectado por la velocidad del equipo (rendimiento). Además, para brindar un mayor grado de comodidad
e independencia al usuario, los productos de apoyo deberían ser inalámbricos y evitar
sensores o dispositivos acoplados a la cabeza.
Este proyecto brinda, a las personas con algún tipo de discapacidad motora en
miembros superiores, un producto de apoyo que realiza las funciones básicas de un
ratón para computador, llevando a cabo el control con los movimientos de la cabeza
del usuario y gestos faciales. Se utilizan técnicas de Visión Articial, evitando sensores
o cables entre el computador y el usuario. El desarrollo se llevó a cabo sobre una
plataforma hardware/software de uso libre y contó en todas sus fases con el apoyo del
grupo de investigación METIS de la Universidad Distrital Francisco José de Caldas Facultad Tecnológica.
19
1. INTRODUCCIÓN
20
Capitulo 2
Estado del Arte
A nivel académico y comercial se vienen utilizando, desde hace varios años, desarrollos de software con tratamiento de imágenes y diversidad de sensores para detectar
movimientos conscientes de extremidades del cuerpo humano, así como movimientos de
la cabeza o gestos de la cara, para controlar la posición del cursor en la pantalla de los
computadores. A continuación se presentan algunas de las propuestas más destacadas,
en el sector académico.
2.1. Proyectos académicos en otros países
Titulo: The Camera Mouse: Visual Tracking of Body Features to Provide Computer Access for People With Severe Disabilities.., The Camera Mouse: Seguimiento
visual de las características del cuerpo para proporcionar acceso al computador,
para personas con discapacidades severas [6]
ˆ
Autor: Margrit Betke, Member, IEEE, James Gips, Member, IEEE, and
Peter Fleming
ˆ
Año: 2002
ˆ
Descripción: El sistema de "Camera Mouse" ha sido desarrollado para proporcionar acceso a la computadora para las personas con discapacidades
severas. El sistema realiza el seguimiento de los movimientos del usuario del
ordenador con una cámara de vídeo y las traduce en los movimientos del puntero del ratón en la pantalla. Pueden ser rastreadas diferentes características
corporales, tales como la punta de la nariz del usuario o el dedo.
21
2. ESTADO DEL ARTE
Titulo: NaviGaze: enabling access to digital media for the profoundly disabled ,
NaviGaze: Permitiendo el acceso a medios digitales a personas con discapacidad
severa [7]
ˆ
Autor: Ryan O'Grady, Cybernet Systems Corporation, Ann Arbor, MI ,
Charles J. Cohen, Cybernet Systems Corporation, Ann Arbor, MI, Glenn
Beach Cybernet Systems Corporation, Ann Arbor, MI and Gary Moody
Cybernet Systems Corporation, Ann Arbor, MI
ˆ
Año: 2004
ˆ
Descripción: Debido a que muchas personas con discapacidad todavía tienen
un control signicativo de su movimiento de la cabeza, el seguimiento de la
cabeza es una elección lógica. Se ha desarrollado un software de seguimiento
no intrusivo de la cabeza para controlar el cursor, junto con el reconocimiento de parpadeo del ojo para emular el clic del ratón. El sistema, llamado
NaviGaze, también permite el uso de un ratón y un teclado estándar, por lo
que es ideal para su uso en entornos de computación públicos.
Titulo: Fuzzy Mouse Cursor Control System for Computer Users with Spinal
Cord Injuries, Sistema de control difuso del cursor del ratón para los usuarios
de ordenador con daño en la Medula Espinal [8]
ˆ
Autor: Tihomir Surdilovic
ˆ
Año: 2006
ˆ
Descripción: a pesar de no utilizar visión articial, propone el uso de un
control difuso para mejorar el desempeño de un sistema que posiciona el
cursor mediante un dispositivo neumático para la boca y utilizando técnicas
de escaneo de la pantalla
Titulo: Eye Tracking Based Communication System for Patient with Major
Neoro-locomotor Disabilites, Sistema de Comunicación basado en el seguimiento
de los ojos para los pacientes con importantes Discapacidades Neuro-locomotoras [9]
ˆ
Autor: Lupu, R.G. Bozomitu, R.G. ; Ungureanu, F. ; Cehan, V., Fac. of Autom. Control & Comput. Eng., Gh. Asachi Tech. Univ. of Iasi, Iasi, Romania
ˆ
22
Año: 2011
2.2 Proyectos académicos a nivel Nacional
ˆ
Descripción: desarrolla un sistema de comunicación inalámbrica para pacientes con dicultad para hablar, compuesto por un computador de usuario, un
servidor de mensajes y terminales móviles. La pantalla del computador de
usuario está dividida en cuatro partes, cada una con un mensaje y un dibujo alusivo; una cámara sujeta a unas gafas, capta la dirección de la mirada
del paciente para identicar el mensaje que está observando. El mensaje se
selecciona mediante un parpadeo y es enviado por el servidor, al dispositivo
móvil del profesional a cargo. Para seguir el movimiento de la pupila, utiliza
un algoritmo de la librería OpenCV.
2.2. Proyectos académicos a nivel Nacional
Titulo: Control de mouse para computador mediante potenciales eléctricos oculares [10]
ˆ
Autor: Carolina Arboleda Clavijo; Eliana García Cossio; Marcela Palacio
Ochoa. Programa de Ingeniería Biomédica, Líneas de Bioinstrumentación,
Señales e Imágenes; Ingeniería en Rehabilitación, Escuela de Ingeniera de
Antioquia.
ˆ
Año: 2007
ˆ
Descripción: se presenta la construcción de un prototipo de mouse, cuyo
movimiento en sentido horizontal es determinado por las señales eléctricas
provenientes de desplazamientos oculares derecha-izquierda, que son captados por amplicadores de biopotenciales y posteriormente procesados y
microcontrolados. En este caso se utilizan microcontroladores PIC para su
implementación.
Titulo: Diseño y construcción de un periférico indicador de posición X-Y, controlado por movimientos de la cabeza [11]
ˆ
Autor: Digo Gutierrez Muñoz, Universidad Militar Nueva Granada, Facultad
Mecatrónica.
ˆ
Año: 2002
ˆ
Descripción: se implementa un dispositivo controlado por medio de un microcontrolador PIC, dos sensores análogos que convierten la señal de la velocidad
23
2. ESTADO DEL ARTE
de la cabeza y un micrófono para controlar los clics del mouse, permitiendo
al usuario con uno o dos soplidos controlar las funciones de selección.
2.3. Proyectos de grado en la Universidad Distrital
Titulo: Ratón USB para personas tetrapléjicas controlado con el movimiento de
la cabeza
ˆ
Autor: Danny Alexander Riaño Gómez; Omar Salazar Morales y Jose Jairo
Soriano Méndez; Universidad Distrital Francisco Jose de Caldas. [12]
ˆ
Año: 2014
ˆ
Descripción: La implementación se realizó con un microcontrolador que dispone de interfaz USB y conversor analógico-digital (ADC). El registro del
movimiento de la cabeza del usuario y la posición de la pantalla se hizo
mediante tecnología de acelerómetros de tres ejes acoplados a la cabeza.
Los algoritmos diseñados e implementados en el rmware del microcontrolador realizan todo el trabajo necesario para procesar la información de los
acelerómetros y así controlar el cursor en pantalla.
24
Capitulo 3
Marco Teórico
3.1. Discapacidad Motora en Miembros Superiores
El conocimiento que la humanidad ha adquirido acerca de la lesión medular se
encuentra documentado desde los tiempos del antiguo imperio egipcio. Hipócrates ya
había relacionado las fracturas y luxaciones de las vértebras con parálisis de los miembros. Celsus diferenciaba los efectos que se producían en los miembros, de acuerdo a
la altura en la que se generaba la lesión de la columna. Hasta el siglo XVII la lesión
medular se consideraba mortal, realizándose las primeras cirugías exitosas con recuperación de la movilidad. La Segunda Guerra Mundial motivó el desarrollo de centros de
atención especícos para atender las lesiones medulares con enfoque multidisciplinario,
mejorando la calidad y la expectativa de vida de los pacientes. Buscando reintegrar al
paciente a su vida familiar, social y laboral se introduce el deporte como parte esencial
del tratamiento [13].
La discapacidad por Lesión Medular se considera uno de los principales problemas
de salud en rehabilitación y es causada más frecuentemente por traumatismos en la
columna vertebral. La Lesión Medular (LM) representa el daño que sufre la médula
espinal que conlleva la alteración temporal o permanente de las funciones motora, sensitiva y/o autónomas, las cuales se presentan normalmente por debajo del nivel de la
lesión [14], generando importantes procesos de discapacidad [15].
3.1.1. Niveles de Lesión Cervical
La Lesión Medular se puede clasicar en [16]:
Completa_A:
Ausencia de función motora y sensitiva
25
3. MARCO TEÓRICO
Incompleta_B:
Ausencia de función motora y preserva la función sensitiva
Incompleta_C:
Preserva función motora y más de la mitad de los músculos llave
tienen balance muscular menor que tres
Incompleta_D:
Preserva función motora y más de la mitad de los músculos llave
tienen balance muscular de tres o más
Normal_E:
Funciones motora y sensitiva normales.
Se denomina de acuerdo al último nivel que preserva todas las funciones neurológicas
(motoras, sensitivas y autonómicas), clasicándose como cervicales (C1 a C8), torácicas
altas (T1 a T6), torácicas bajas (T7 a T12), lumbosacras (L1 a S1) y del cono medular
(sacro coccígeas). Entre más alta la lesión mayor será el compromiso funcional del
paciente [15]. En la gura 3.1 se puede apreciar un resumen gráco de la posibles
afectaciones de acuerdo a la lesión sufrida por el paciente.
Figura 3.1: Niveles de afectación de las lesiones en las vertebras .
Fuente:[17]
26
3.1 Discapacidad Motora en Miembros Superiores
La lesión medular se puede originar por enfermedades congénitas (espina bída), como consecuencia de otra enfermedad (mielitis, poliomielitis, esclerosis en placas, hemorragia o trombosis de la arteria vertebral, metástasis vertebro-medulares, glioblastoma,
ependinoma, estenosis espinal) o por traumatismos (contusión, sección total o parcial
de la médula espinal) [13].
3.1.2. La columna vertebral
Es un conjunto de vértebras superpuestas, la cual constituye el soporte estructural
del esqueleto, sosteniendo el tronco, la cabeza y las extremidades superiores; sirve de
jación para músculos que estabilizan o mueven esos miembros, además de alojar y
proteger la médula y las raíces de los nervios espinales. Como se aprecia en la gura
3.2, en la columna vertebral se diferencian las regiones Cervical, Dorsal, Lumbar, Sacra
y Coxígea. De igual manera, se aprecia que cada vértebra posee un cuerpo vertebral
(el cual hace contacto con el disco intervertebral) y un arco neural (por donde pasa la
médula espinal) [18]
La primer vértebra cervical (C1) se conoce como Atlas y sirve como apoyo al cráneo.
La segunda vértebra (C2) se conoce como Axis y es el pivote sobre el cual gira el
conjunto Atlas-Cráneo. Es el único par de vértebras móviles que no presenta un disco
intervertebral. La zona dorsal posee discos intervertebrales más delgados, por lo que su
movilidad es más limitada que la zona lumbar, cuyos discos poseen mayor altura [18].
La Médula Espinal es una porción del sistema nervioso central que desciende desde
el cráneo, a través de la columna vertebral, hasta la zona lumbar, ramicándose mediante raíces nerviosas que salen de la columna hacia las diferentes partes del cuerpo.
Constituye el medio de comunicación entre el cerebro y el cuerpo, transportando información motora y sensitiva. Las zonas de la médula también toman el nombre de las
zonas de la columna. La zona cervical comunica áreas del cuello, hombros y brazos con
el cerebro. La zona dorsal comunica con músculos del tórax y posee nervios del Sistema
Nervioso Simpático. La zona lumbo-sacra comunica con áreas de los pies, piernas, pelvis
y parte inferior del abdomen [18].
27
3. MARCO TEÓRICO
Figura 3.2: Estructura de la columna vertebral. Fuente: http://www.fondosmil.com/4safe/La-columna-vertebral.jpg
3.1.3. Tetraplejia
3.1.3.1. Denición
La American Spinal Injury Association (ASIA), dene la
Tetraplejia
como la
disminución o pérdida de la función motora y/o sensitiva en los segmentos cervicales de
la médula espinal causado por daño de los elementos neurales dentro del canal espinal.
Conlleva la disminución en el funcionamiento de las cuatro extremidades, el tronco, las
piernas y órganos pélvicos. De igual manera, dene la
Paraplejia como la disminución
o pérdida de las funciones motoras y/o sensitivas de los segmentos torácicos, lumbares
o sacros de la médula espinal, como consecuencia del daño en los elementos neurales del
canal espinal. Se conserva el funcionamiento de los brazos, pudiendo afectar el tronco,
las piernas y los órganos pélvicos [16].
3.1.3.2. Causas de la Tetraplejía
La Lesión Medular puede desarrollarse según diferentes mecanismos que dañarían
los tejidos de tres maneras diferentes: Destrucción por traumatismo directo, compresión
por fragmentos óseos, hematoma o material discal o isquemia por daño en las arterias
espinales.[13]
La clasicación de la Lesión Medular puede sistematizarse según la causa que la
provoca[13]:
28
3.1 Discapacidad Motora en Miembros Superiores
1. Causas médicas:
Enfermedades de nacimiento: Espina bída o mielomeningocele.
Como consecuencia de otras enfermedades:
ˆ
Infecciosas: Mielitis víricas o bacterianas, poliomielitis.
ˆ
Enfermedades inamatorias o degenerativas: Esclerosis en placas.
ˆ
Lesiones vasculares: Hemorragia o trombosis de la arteria vertebral que
generan isquemia.
ˆ
Tumores: Metástasis vertebro-medulares, glioblastoma, ependimoma, etc.
ˆ
Lesiones osteoarticulares: Estenosis de cana
2. Causas traumáticas: Contusión, sección total o parcial de la médula espinal. La
lesión medular de causa traumática es la más frecuente.
3.1.3.3. Tipos de Tetraplejia
Tetraplejia
C1-C3: Las personas presentan afectación en los músculos de las cuatro
extremidades y el tronco. Requieren ventilación mecánica asistida.
Tetraplejia
C4: Las personas conservan movilidad en algunos músculos de cabeza y
cuello. Requieren inicialmente ventilación mecánica asistida.
Tetraplejia
C5: Conservan movilidad en cabeza, cuello y exión del codo, así como la
autonomía para respirar.
Tetraplejia
C6: Conservan movilidad en cabeza, cuello, exión del codo y extenso-
res de muñeca, así como la autonomía para respirar. Pueden conducir vehículos
adaptados.
Tetraplejia
C7: Conservan movilidad en cabeza, cuello, exión y extensión del codo
y extensores de muñeca, así como la autonomía para respirar.
Tetraplejia
C8: Además, conservan la función de los exores de los dedos.
29
3. MARCO TEÓRICO
3.2. Productos de Apoyo
Se reere a todo producto, instrumento, equipo o tecnología adaptada o diseñada
especícamente para mejorar el funcionamiento de una persona en condición de discapacidad [5], apoyando su inclusión y respondiendo a sus necesidades particulares[19].
En este sentido, los usuarios de los productos de apoyo no solamente son las personas
con discapacidad, sino que también incluye a sus familias, cuidadores, tutores, educadores, profesionales de la salud y empleadores entre otros [19]. Por otra parte, la norma
UNE-EN ISO 9999 clasica a los ratones de computador dentro del código ISO: 22
36 06, incluyendo ratones de bola (trackballs), lápices ópticos, joysticks conectados al
puerto de ratón y emuladores de ratón.
3.2.1. Protocolos de Prueba
La metodología de pruebas para dispositivos apuntadores se encuentra estandarizada
en la norma ISO 9241-411 (2012) Evaluation methods for the design of physical input
devices . Plantea métodos estandarizados para el análisis de laboratorio y comparación
de dispositivos físicos de entrada al computador, con los cuales se obtienen resultados
cuantitativos que permiten comparar su rendimiento. Además, aporta tablas y datos que
permiten validar el funcionamiento de los dispositivos según los resultados obtenidos en
los protocolos de prueba. Constituye una actualización de la norma ISO 9241-9 (2000)
Requirements for non-keyboard input devices y hace parte de la norma general ISO
9241 Ergonomic requirements for oce work with visual display terminals (VDTs) .
3.2.2. ISO 9241-411:2012
Ley de Fitts ) para el tiempo que
En 1954 el psicólogo Paul Fitts propuso un modelo (
tarda el movimiento humano que inicia apuntando a un objeto y termina apuntando
a otro objeto. Este tiempo está determinado por la distancia entre los objetos y el
ancho del objeto nal. La condición es que el movimiento se debe realizar lo mas rápido
posible. La ecuación básica del modelo es:
M T = a + b ∗ ID
donde MT es el tiempo que tarda el movimiento
ID es el índice de dicultad
b es el valor de la pendiente de la recta
a es el punto de intersección con el eje MT
30
3.3 Plataformas Disponibles
El Indice de Dicultad de la tarea (ID) se determina mediante la ecuación:
ID = log2
2D
W
donde D es la distancia entre el punto inicial y el centro del objeto nal
W es el ancho del punto nal
Según esta norma el IDe (indice efectivo de dicultad) se determina aplicando una
ligera variación a la propuesta de Fitts:
IDe = log2
De
We
+1
donde De es el promedio de la distancia entre puntos del movimiento
We es el ancho efectivo del punto nal y se dene como:
W e = 4,133 ∗ SD
donde SD es la desviación estándar de la distancia entre puntos del movimiento
El rendimiento del dispositivo o
Throughput
(TP) relaciona la dicultad de la tarea
con el tiempo que toma realizarla [20]:
TP =
ID
MT
Esta ley resulta apropiada para evaluar y comparar cuantitativamente los dispositivos apuntadores[21]. Por lo anterior, la norma ISO 92491-411:2012 estandariza la
evaluación de dispositivos teniendo en cuenta los trabajos de Soukore y MacKenzie
basados en la Ley de Fitts, aunque las primeras evaluaciones comparativas datan de
1978 .
3.3. Plataformas Disponibles
En el cuadro 3.1 se resumen las características relevantes de cinco tecnologías de
desarrollo que fueron seleccionadas como candidatas para este proyecto, gracias a sus
posibilidades de desarrollo en visión articial. Del análisis de estas características se
aprecia que:
KINECT: La detección de objetos se realiza por hardware lo que incrementa su
velocidad de respuesta. Presenta facilidades de desarrollo enfocadas en windows.
Requiere la instalación de controladores y diseño del aplicativo que se ejecuta en
el computador como interface con el Kinect.
CUBIEBOARD: Se obtiene un sistema que funciona independientemente de la
plataforma de desarrollo. No requiere instalar controladores en el computador
para funcionar cono dispositivo HID. Provee puertos y características adicionales
para futuros desarrollos.
31
3. MARCO TEÓRICO
DISPOSITIVO MOVIL: Desarrollo en plataforma Android. No tiene puertos de
I/O. Limitado para futuras mejoras. Se conecta por puerto USB como dispositivo
de comunicaciones por lo que requiere comunicarse por vía inalámbrica para funcionar como dispositivo HID. Requiere controlador diferente para cada sistema
operativo y diseño de aplicativo.
BEAGLEBONE: Hardware Open Source. Se obtiene un sistema que funciona
independientemente de la plataforma de desarrollo. No requiere instalar controladores para funcionar como dispositivo HID. Provee puertos y características
adicionales para futuros desarrollos. Limitada comunidad de soporte.
RASPBERRY: Mini Computador de Placa Única (SBC), con el cual se obtiene un sistema que funciona independientemente de la plataforma de desarrollo.
No requiere instalar controladores para funcionar como dispositivo HID. Provee
puertos y características adicionales para futuros desarrollos. Activa comunidad
de desarrolladores. El hardware no es Open Source pero actualmente está bastante
difundido a nivel mundial. Presenta un costo inferior al de los otros microcomputadores de características similares y una destacada distribución a nivel nacional.
El mismo fabricante distribuye una cámara totalmente compatible, con buena
resolución, costo moderado y bus de comunicación de alta velocidad.
32
3.4 Procesamiento de Imágenes
Cuadro 3.1: Comparación de plataformas tecnológicas de desarrollo. Fuente: Autores
3.4. Procesamiento de Imágenes
3.4.1. Relaciones Básicas Entre Píxeles
Se mencionan algunas deniciones de relaciones simples, pero muy importantes entre
los pixels de una imagen digital, que permiten comprender de mejor forma los métodos
de clasicación que se aplican para el reconocimiento del rostro, ojos y boca.
33
3. MARCO TEÓRICO
3.4.1.1. Vecinos de un Píxel
Un píxel
p
de coordenadas
(x,y)
tiene 4 vecinos horizontales y verticales cuyas
coordenadas son:
(x + 1, y), (x − 1, y), (x, y + 1), (x, y − 1)
Este conjunto de pixels, que recibe el nombre de 4-vecinos de
píxel está a distancia unitaria de
imagen digital si
(x,y)
(x,y),
(3.1)
p
se nota
y algunos de los vecinos de
p
N4 (p). Cada
caen fuera de la
está en el borde de la imagen.[22]
Los pixels diagonales vecinos de
p
tienen coordenadas
(x + 1, y + 1) , (x − 1, y − 1) , (x − 1, y + 1) (x + 1, y − 1)
y se notan
de
p
N D (p)
y se notan
de la imagen si
estos puntos, junto con los cuatro vecinos. se llaman 8 - vecinos
N8 (p).
(x,y)
(3.2)
Al igual que antes, algunos puntos de
ND (p)
y
N8 (p)
caen fuera
esta en el borde de la misma.[22]
3.4.1.2. Medida de Distancia entre Pixels
Para los pixels
p,q y z
denimos las coordenadas
(x,y), (s,t) y (u,v) respectivamente.
D es una función de distancia si cumple:
D(p, q) ≥ 0
D(p,q) = D(q,p)
D(p, z) ≤ D(p, q) + D(q, z)[22]
De esta forma, la distancia euclidea entre
pyq
se dene como:
q
De (p, q) = (x − s)2 + (y − t)2
(3.3)
Para esta medida de distancia los pixeles a distancia menor o igual
que un valor r de uno dado, (x,y) definen un disco de radio r centrado
en él.[22]
3.4.2. Técnicas de Iluminación
Una vez elegidos los elementos constituyentes del SVA (Sistema de Visión Articial)
Un
entorno debidamente controlado es imprescindible para obtener unas buenas condiciones
se pasa a estudiar los elementos correspondientes al entorno y la forma de situarlos.
34
3.4 Procesamiento de Imágenes
de partida,
que aseguren una óptima adquisición. Dentro del entorno aparecen como
partes fundamentales que inuyen en las expectativas tanto de calidad como de la
imagen buscada: La iluminación, el fondo, la posición de la cámara, etc.[22]
3.4.2.1. La Iluminación
La iluminación de la escena debe realizarse de una forma correcta, dada la importancia que tiene en el resultado nal de las imágenes capturadas para las tareas de
procesamiento en computador. Existen fundamentalmente dos formas de iluminación
como se observa en la gura 3.3.
Figura 3.3:
Tipos de Iluminación a) Frontal b) Retroiluminación
[22]
Iluminación Frontal:
Donde la luz incide directamente sobre el objeto, ya sea verti-
calmente, horizontalmente, de forma oblicua o de forma difusa, la iluminación frontal
permite distinguir los detalles de los objetos, así como su forma, permitiendo extraer
mas parámetros de cada objeto como su color, detalles internos, etc, que permite una
mejor segmentación.
Iluminación trasera o retroiluminación:
Donde se ilumina una pantalla de forma
que lo que se busca es el contorno del objeto a modo de sombra. Este objeto puede
estar delante o detrás de la pantalla, la retroiluminación sólo sirve para la detección de
contornos simplicando por otra parte la etapa de segmentación que se debe efectuar
posterior a la captura de la imagen. [22]
35
3. MARCO TEÓRICO
3.4.2.2. Ventajas y Desventajas de la Iluminación.
La iluminación del objeto permite distinguir claramente los detalles del mismo, pero
esta iluminación puede presentar diferentes inconvenientes.
La iluminación con focos de luz jos va a producir dos fenómenos contraproducentes:
La creación de sombras y los reejos.
Las sombras que crean los focos de luz oblicuos, son un serio inconveniente para
detectar correctamente las formas de los objetos, sobre todo cuando estos son oscuros.
En términos generales el efecto de las sombras es algo que se trata de evitar.
Al usar focos de luz, en objetos brillantes se producen brillos que también afectan
seriamente la detección de los contornos y detalles de los objetos.
La mejor forma de evitar estos dos efectos consiste en utilizar luz difusa, ya sea
con fuentes especiales (bras ópticas que expanden la luz en todas direcciones), con
el uso de lamparas circulares que iluminen de forma homogénea o con el uso de luz
indirecta.[22]
3.4.3. Histograma
El
histograma
de una imagen es una curva donde se representan la frecuencia con
que aparece cada nivel de gris en la imagen. Generalmente se suelen representar en el
eje de las
x
el nivel de gris ( por ejemplo de 0 a 255) y en el eje
y
el número de pixeles
en cada nivel de gris.
Observando los histogramas de las guras 3.4 y 3.5 se puede obtener una idea
aproximada de la distribución de niveles de grises de la imagen dónde está la mayor
parte de la información para, por ejemplo, poder realizar una compresión de la imagen;
usarla para la segmentación, etc.[22]
3.4.3.1. Ecualización del Histograma
La ecualización del histograma trata de repartir los
pixels,de forma que la luminancia
de éstos esté más distribuida, consiguiendo de esta forma, aumentar el contraste y
distinguir mejor de los distintos objetos que forman la imagen.[22]
3.5. Visión Articial
La visión articial es una disciplina cientíca y tecnológica que engloba todos los
procesos y elementos que proporciona 36
ojos a una máquina mediante el modelado e
3.5 Visión Articial
Figura 3.4:
obscuros
imagen y su histograma donde se puede observar la gran cantidad de puntos
[23]
Figura 3.5:
Imagen y su histograma donde se puede observar un amplio rango de grises
[23]
37
3. MARCO TEÓRICO
implementación de procesos propios de la visión y constituye una herramienta para
establecer la relación entre el mundo físico tridimensional y las vistas bidimencionales
tomadas de él [24] [25].
Las estructuras y propiedades del mundo tridimensional que se quieren deducir en
visión articial incluyen no solo sus propiedades geométricas, sino también sus propiedades materiales. Ejemplos de propiedades geométricas son la forma, tamaño y localización de los objetos. Ejemplos de propiedades materiales son su color, iluminación,
textura y composición. [22]
Una de las más amplias ramas de la visión articial está guiada precisamente a
simplicar las imágenes y eliminar el ruido introducido por los sensores, facilitando la
tarea de interpretación. Este
pre-procesado
consiste en algoritmos matemáticos que
calculan nuevas intensidades luminosas para los pixeles y la mayoría consumen gran
cantidad de tiempo de cálculo, en proporción directa con la resolución de la imagen.
Esto representa un inconveniente cuando se pretende que el sistema trabaje en tiempo
.
real [22]
3.5.1. Etapas En Un Proceso De Visión Articial
En la gura 3.6 se presentan los pasos fundamentales relacionados con hadware,
software y desarrollos matemáticos que se aplican a la visión articial.
38
3.5 Visión Articial
Figura 3.6:
Diagramas de Bloques de las etapas de un sistema de visión articial
[22]
La primera fase, consiste en la captura o adquisición de las imágenes digitales
mediante algún tipo de sensor.[23]
La segunda etapa consiste en el tratamiento digital de las imágenes, con objeto de
facilitar las etapas posteriores. En esta etapa de pre-procesado, mediante ltros
y transformaciones geométricas, se eliminan partes indeseables de la imagen o se
realzan partes interesantes de la misma.[23]
El siguiente paso se conoce como segmentación, y consiste en aislar los elementos
que interesan de una escena para comprenderla[23]
La parametrización, que recibe también el nombre de extracción de características
o selección de rasgos, se dedica a extraer características que producen alguna
información cuantitativa de interés o rasgos que son básicos para diferenciar una
clase de objetos de la otra.[22]
39
3. MARCO TEÓRICO
El reconocimiento es el proceso que asigna una etiqueta a un objeto basada en la
información que proporcionan los rasgos diferenciadores (clasicación).
La interpretación lleva a asignar signicado al conjunto de objetos reconocidos.[22]
3.5.2. Adquisición de Imágenes
Busca conseguir que la imagen sea lo más adecuada posible para que se pueda
continuar con las siguientes etapas. Una correcta adquisición de la imagen supone un
paso muy importante para que el proceso de reconocimiento tenga éxito. Dentro de
esta etapa existen múltiples factores que atañen directamente al proceso de captura
de la imagen, formados fundamentalmente por el sistema hardware de visión articial
(cámara, óptica, tarjeta de adquisición de imagen,ordenador y software) y el entorno y
posicionamiento de los elementos (la iluminación, fondo, posición correcta de la cámara,
ruido eléctrico-óptico externo, etc.).[22]
3.5.3. Preprocesado
Toda imagen que se adquiere por medios ópticos, electro-ópticos o electrónicos sufre
en una cierta medida los efectos de la degradación que se maniesta en forma de ruido,
pérdida de denición y delidad de la imagen. La degradación viene provocada por el
ruido de los sensores de captura, imprecisiones en el enfoque de la cámara, movimiento
de la misma o perturbaciones aleatorias, entre las que tiene relevancia el efecto de la propagación de la radiación en el medio de transmisión. El preprocesado pretende reparar
en la imagen, entre otros desperfectos, la deformación, el ruido, poco o mucho contraste
o brillo, ecualización inapropiada, etc. Los algoritmos de preprocesamiento permiten
modicar la imagen para eliminar ruido, transformarla geométricamente, mejorar la
intensidad o el contraste, etc.[22]
3.5.4. Segmentación
Segmentar una imagen digital signica dividirla en zonas distinguibles e individualizadas. Es decir, consiste en diferenciar los diversos objetos y donde se encuentran con
respecto al fondo de la imagen.
Al nal de la etapa de segmentación se tienen que conocer perfectamente los objetos que hay, para extraer las características propias de cada uno de ellos. Además, cada
pixel de la imagen debe tener una etiqueta que los dena, de forma que simplemente
40
3.6 Filtros y Clasicadores para Detección de Rostros.
por agrupación de puntos con la misma etiqueta y conectados espacialmente, se pueda
determinar la lista de objetos (estos objetos son realmente zonas o regiones individualizadas dentro de la imagen, ya que un objeto, en el sentido estricto de la palabra, puede
estar repartido en varias regiones diferentes dentro de la imagen obtenida). La etapa
de segmentación es crucial para el reconocimiento de formas pudiéndose complicar o
simplicar enormemente según sea la escena mas o menos compleja. [22]
3.5.5. Análisis
Una vez realizado el proceso de segmentación, el siguiente paso consiste en obtener parámetros que denan las características de cada objeto: forma, textura, color,
orientación, posición, etc.
De todos los parámetros que se puedan obtener, habrá que seleccionar aquellos que
tengan las siguientes características:
Ser discriminantes. Es decir, que diferencien lo mejor posible los objetos de una
familia o clase con los de las otras.
Ser independientes entre si. Los parámetros que denan cada objeto no tienen
que estar relacionados, de forma que si varía uno, los demás no varíen por culpa
de éste.
Ser sucientes. Tienen que delimitar de forma suciente la pertenencia de un
objeto a una clase determinada.
Dentro de los descriptores se denen tres categorías básicas: descriptores de frontera,
descriptores de región y de estructuras tridimensionales.[22]
3.6. Filtros y Clasicadores para Detección de Rostros.
Inicialmente el problema de detección del rostro en los sistemas de reconocimiento
no recibió la atención necesaria y se partía de que el rostro ya había sido detectado,
fue solo en la década de los ochenta que surgieron los primeros algoritmos, basados
en técnicas heurísticas y antropométricas, y en la década de los noventa cuando el
desarrollo de algoritmos de detección de rostros inició su crecimiento[26], proponiéndose
una gran variedad de técnicas, desde algoritmos básicos de detección de bordes hasta
41
3. MARCO TEÓRICO
algoritmos compuestos de alto nivel que utilizan métodos avanzados de reconocimiento
de patrones.[27]
3.6.1. Algoritmo Haar en Cascada (Voila&Jones)
Los clasicadores buscan en los objetos de una imagen, características de distancia
o similitud con respecto a las propiedades de cada clase, con el n de determinar a
? ]. El conjunto de características discriminantes de un objeto
cual de ellas pertenecen [
en particular, constituyen su
patrón
y las
funciones discriminantes
son aquellas que
determinan el grado de semejanza del patrón con las clases del universo estudiado. Estas
funciones discriminantes se crean a partir del entrenamiento con patrones similares a
los de cada clase, los cuales conforman un
conjunto de aprendizaje.
Otro conjunto con
características similares, y en lo posible sin elementos compartidos, se utiliza para probar
la respuesta de las funciones discriminantes, por lo que recibe el nombre de conjunto de
prueba [
? ]. Al nal de este proceso de prueba se determina la probabilidad de error,
la cual constituye un indicador importante de la calidad del clasicador. Para el caso
del Algoritmo Haar en Cascada aplicado a la detección de rostros, se han obtenido
experimentalmente porcentajes de detección cercanos al 100 %. [27]
Uno de los métodos más utilizados para segmentar rostros en una imagen requiriendo
tiempos mínimos de procesamiento, los constituye el formulado por Paul Viola y Michale
Jones, el cual contempla la utilización de un ltro de base Haar para la extracción de
características, la imagen en su versión integral, AdaBoost como método de aprendizaje
y un clasicador en cascada. Las
características Haar
están formadas por rectángulos
adyacentes de colores claro y oscuro en diferentes posiciones y conguraciones, las cuales
son buscadas en toda la imagen y a diferentes escalas, para determinar la presencia de
características particulares (denidas en el proceso de entrenamiento) en cada región,
obteniendo la ubicación de rostros dentro de la imagen. La imagen sobre la cual se
realiza la búsqueda de estas características de manera rápida a diferentes escalas, es
llamada
imagen integral
ya que cada uno de sus pixeles se forma al sumar los valores
de los pixeles que se encuentran arriba y los que se encuentran a la derecha de cada
pixel correspondiente de la imagen original. Mediante la aplicación en serie (cascada)
de clasicadores AdaBoost, se genera un clasicador mas robusto y eciente [28] [29]
[30].
La metodología basada en el clasicador Haar en cascada se esquematiza de forma
sencilla en la gura 3.7 donde se muestra el diagrama de bloques del proceso de la
42
3.6 Filtros y Clasicadores para Detección de Rostros.
detección del rostro.
Figura 3.7:
Diagrama de bloques Clasicador Haar Cascad e
[27]
Imagen Integral: Esta imagen permite extraer de forma rápida características a
diferentes escalas, ya que no se trabaja directamente con los valores de intensidad si no con una imagen acumulativa que se construye a partir de operaciones
matemáticas básicas.
Figura 3.8:
Imagen integral
[27]
La imagen integral (ver gura 3.8), en la localización x, y, contiene la suma de los
píxeles de la parte superior izquierda de la imagen y se puede calcular como se indica
a continuación:
ii(x, y) =
X
Im(x',y')
(3.4)
x0 ≤x,y≤y 0
43
3. MARCO TEÓRICO
Figura 3.9: Filtros Haar rotados, trasladado y con cambios de escala.
[27]
Donde
ii (x, y)
es la imagen integral e
Im (x, y)
es la imagen original.
Extracción de Características: Es realizada aplicando a la imagen ltros con bases
Haar. Estos ltros pueden ser calculados ecientemente sobre la imagen integral,
son selectivos en la orientación espacial y frecuencia, y permiten ser modicados
en escala y orientación. En la gura 3.9, se muestran algunos de los ltros usados
para la extracción de características.
Los ltros con bases Haar, realizan una codicación de diferencia de intensidades en
la imagen, generando características de contornos, puntos y líneas, mediante la captura
de contraste entre regiones.[27] [30]
Clasicación: Etapa dentro del algoritmo de detección que se encarga de asignar
un conjunto de características dado, a una clase con la que se encuentra una mayor
similitud, de acuerdo a un modelo inducido durante el entrenamiento. En este caso
se emplea el método de clasicación
Boosting, el cual combina varios clasicadores
básicos para formar un único clasicador más complejo y preciso. Se basa en la idea
de que varios clasicadores sencillos, con una precisión ligeramente superior a una
clasicación aleatoria, pueden combinarse para formar un clasicador de mayor
precisión, siempre y cuando se disponga de un número suciente de muestras de
entrenamiento.[27]
3.6.2. Integrales Proyectivas
Las Integrales Proyectivas constituyen una técnica de reducción de problemas de
dimensión 2D a problemas de dimensión 1D, donde cada valor de salida es la media
44
3.6 Filtros y Clasicadores para Detección de Rostros.
aritmética de una la o columna de datos matriciales de entrada. Las proyecciones han
sido usadas en diversas aplicaciones del procesamiento facial, normalmente combinadas
con otras características.
Una Integral Proyectiva es la media de los valores de gris de una imagen a lo largo de
las las o columnas de pixeles. Si bien las proyecciones constituyen una de las técnicas
clásicas del análisis de imágenes, su utilización en el contexto de detección facial ha
estado marcada por el diseño de métodos heurísticos y especícos.[31]
3.6.2.1. Deniciones
Imagen: Una imagen, i, con n canales es una función discreta en dos variables
i = [o, ..., xmax ] X [0, ..., ymax ] ⇒ Rn
(3.5)
Región de una imagen: Una región, R, en una imagen, i, es un conjunto de pares de
píxeles:{(x1, y1), (x2, y2), ..., (xk , yk )} ,con
{1, ...k} .Además,
xi ∈ {0, ..., xmax } ,yi ∈{0, ..., ymax } ,∨i ∈
el conjunto de píxeles debe ser contiguo, es decir, todos los pí-
xeles deben ser adyacentes entre sí, directamente o a través de otros píxeles del
conjunto. [31]
Señal unidimensional: Una señal unidimensional, s, (o, simplemente, una señal)
es una función discreta en una variable:
ˆ
s : [smin , ..., smax ] → R
(3.6)
Integrales proyectivas verticales y horizontales. La integral proyectiva vertical (la
proyección vertical) de una región R en una imagen en escala de grises
señal unidimensional, PVR
PVR :dominioY (R)
i∈I1 es una
:
→R
denida por:
P V R (y) := i(x, y), ^(x, y) ∈ R
(3.7)
De forma similar, la proyección horizontal de una región R en una imagen en
escala de grises,
i ∈ I 1,
denotada por
P HR (X) :=i(x, y),∨(x, y) ∈ R[31]
45
3. MARCO TEÓRICO
denida por:
P H R (y) := i(x, y), ^(x, y) ∈ R
(3.8)
En la gura 3.10 se muestra algunos ejemplos de proyecciones verticales y horizontales
de la misma imágen, en la cual se han proyectado las imágenes completas, es decir, la
región R sería toda la imagen de entrada.
Figura 3.10: Ejemplo de integral proyectiva horizontal y vertical de una imagen. Arriba
a la izquierda, la imagen de entrada, hormiga. A la derecha, la proyección vertical,
P V hormiga .
Abajo, la proyección horizontal,P H hormiga .
[31]
3.6.2.2. Normalización de Una Imagen Proyectiva
La normalización constituye un proceso de transformaciones en el conjunto de valores que toman dos o más proyecciones distintas, de forma que los valores resultantes se
encuetren dentro de un rango determinado. Por ejemplo, las tres proyecciones de la gura 3.11. Todas ellas presentan una estructura similar, correspondientes a los elementos
faciales más destacados: cejas, ojos, nariz y boca.[31]
46
3.6 Filtros y Clasicadores para Detección de Rostros.
Figura 3.11:
Imágenes proyectivas de un rostro
[31]
Sin embargo, toman valores distintos al haber sido obtenidas de tres canales diferentes, R, G y B. Podemos normalizar los valores de las señales, que originalmente están
en el intervalo [0, ..., 255], a valores entre 0 y 1 con una operación del tipo:
normal01 (s)(i) := s(i)/255
(3.9)
Y si, de hecho, queremos que las señales resultantes tomen los valores 0 y 1 en algún
punto, podemos aplicar la transformación:
normalminmax (s)(i) :=
s(i) − min(s)
max(s) − min(s)
(3.10)
Siendo:
min(s) :=
mı́n
{s(i)}
(3.11)
{s(i)}
(3.12)
Oidominio(s)
max (s) :=
máx
Oidomini(s)
En la gura 3.12.a) se muestran las mismas proyecciones de la gura 3.11 normalizadas con esta transformación. El resultado es equivalente a una compensación previa
del brillo de una imagen. Los valores de las tres señales, que antes tomaban intervalos
muy dispares, se encuentran ahora en posiciones similares. De esta forma, las señales
resultantes se pueden comparar entre sí con más facilidad.[31]
47
3. MARCO TEÓRICO
Figura 3.12: Normalización de señales en el valor. a) Integrales proyectivas de la gura 3.12, normalizadas con la operación
normalizadas con
normalminmax .
b) Las mismas proyecciones
normalmedvar .
[31]
En muchas situaciones sería preferible disponer de una normalización más robusta,
no basada exclusivamente en los valores máximos y mínimos. Esa normalización podría
usar la media y la varianza de las señales; de esta forma, el cálculo es menos sensible
a la variación esporádica de los picos de la señal. Por ejemplo, para conseguir señales
con media 0 y varianza 1 la transformación a aplicar es del tipo:
normalmedvar (s) (i) :=
s (i) − media(s)
p
vas(s)
(3.13)
La gura 3.12.b) muestra un ejemplo de esta normalización en el valor, para las mismas señales de la gura 3.12a). En este caso concreto, el resultado es muy parecido con
ambas operaciones. No obstante, la normalización con media/varianza es ligeramente
mejor para el ejemplo, y en general será siempre más robusta.[31]
3.7. Software
3.7.1. Raspbian
Raspbian es un sistema operativo libre basado en Debian, optimizado para el hardware Raspberry Pi. Sin embargo, Raspbian ofrece más que un SO puro; viene con más
de 35.000 paquetes, software pre-compilado y empaquetado en un formato que hace
más fácil la instalación en su Raspberry Pi.
La construcción inicial de más de 35.000 paquetes de Raspbian, optimizado para
un mejor rendimiento en el Raspberry Pi, se terminó en junio de 2012. Sin embargo,
48
3.7 Software
Raspbian está todavía en desarrollo activo, con un énfasis en la mejora de la estabilidad
y el rendimiento de los paquetes de Debian.[32]
3.7.2. Python 2.7
Python es un lenguaje interpretado de programación interactiva orientada a objetos.
Incorpora módulos, excepciones, tipado dinámico, tipos de datos dinámicos de muy
alto nivel, y clases. Python combina una potencia extraordinaria con una sintaxis muy
clara. Tiene interfaces para muchas llamadas de sistema y las bibliotecas, así como a
diversos sistemas de ventanas, y es extensible en C o C ++. También es utilizable como
un lenguaje de extensión para aplicaciones que necesitan una interfaz programable.
Finalmente, Python es portátil: se ejecuta en muchas variantes de Unix, en el Mac y
en PC bajo MS-DOS, Windows, Windows NT y OS / 2.
Es administrado por la Python Software Foundation. Posee una licencia de código
abierto, denominada Python Software Foundation License, que es compatible con la
Licencia pública general de GNU a partir de la versión 2.1.1, e incompatible en ciertas
versiones anteriores.[33]
3.7.3. OpenCV
La Open Source Computer Vision library (OpenCV) provee bloques funcionales
para la aplicación y experimentación con Visión Articial. Es liberada bajo una licencia
BSD y por lo tanto es gratis, tanto para uso académico como comercial. Cuenta con
interfaces de C ++, C, Python y Java y es compatible con Windows, Linux, Mac OS,
iOS y Android. OpenCV fue diseñado para la eciencia computacional y con un fuerte
enfoque en aplicaciones en tiempo real. Escrito en C / C ++, la biblioteca puede tomar
ventaja de procesamiento multi-procesador. Constituye una interfaz de alto nivel para
?]
capturar, procesar y visualizar imágenes.[
3.7.4. NumPy
NumPy es una librería cientíca de propósito general diseñada para Python. Presenta entre otras características:
Una poderosa capacidad de manipular objetos de matrices N-dimensional.
Sosticadas funciones de
Broadcasting
para operar matrices con formas diferentes.
49
3. MARCO TEÓRICO
Herramientas para integrar código C/C++ y Fortran.
Utilidades de álgebra lineal, transformada de Fourier y números aleatorios.
Además de sus usos cientícos, NumPy también puede ser utilizado como un contenedor
multi-dimensional eciente de datos genéricos o para denir tipos de datos arbitatrarios.
Esto permite integrar NumPy rápidamente con una amplia variedad de bases de datos.
Está licenciado bajo la licencia BSD, lo que permite su reutilización con pocas
restricciones.[34]
50
Capitulo 4
Desarrollo
4.1. Selección de Tecnologías
Como resultado de las primeras etapas del proceso de ejecución de este proyecto, se
denieron las características funcionales del sistema, las cuales fueron determinantes a
la hora de seleccionar la plataforma sobre la cual se realizó el desarrollo y se encuentran
alineadas con los objetivos planteados inicialmente. Estas características fueron:
Control del cursor del computador mediante movimientos de la cabeza.
Generación de acciones de selección (clic) mediante gestos faciales.
Utilización de técnicas de visión articial, evitando el uso de accesorios instalados
en la cabeza.
Comunicación con el computador mediante puerto USB, emulando un dispositivo
de interfaz humana (HID), eliminando la necesidad de instalar controladores.
Uso de software de libre distribución para el desarrollo de los algoritmos de control.
Dentro de la gran cantidad de opciones de plataformas hardware disponibles, se realizó
una selección de las cinco que se consideraron mas representativas en su clase, lo que
generó un proceso de análisis de características relevantes, ventajas y desventajas para
las plataformas basadas en el dispositivo Kinect de Microsoft, la tarjeta de desarrollo
Cubieboard, el microcomputador Eagle BlackBone, el microcomputador Raspberry Pi
2 y un teléfono celular de Samsung. Este proceso se resume en el cuadro comparativo
que se encuentra dentro del marco teórico. Se decidió realizar un proceso de implementación básica de las plataformas de desarrollo para el Kinect y para el microcomputador
51
4. DESARROLLO
Raspberry Pi 2, con el n de determinar la mas adecuada para continuar el proceso
de desarrollo. Finalmente, teniendo en cuenta las características funcionales denidas
inicialmente, la facilidad de uso de la platafroma de desarrollo y la disponibilidad de
información, el proyecto se llevó a cabo sobre una plataforma hardware/software compuesta por:
Sistema operativo Raspbian 3.18, versión compacta de la distribución Debian de
Linux. Software de libre distribución, respaldado por una buena comunidad de
desarrolladores, que permite una fácil integración con el hardware seleccionado.
Lenguaje de programación Python 2.7, interpretado, de alto nivel, relativamente
fácil de usar y de libre distribución.
Librería Open Source Computer Vision (OpenCV) versión 2.4.10, de libre distribución, multiplataforma, desarrollada inicialmente por Intel, la cual contiene
una amplia recopilación de algoritmos para implementar visión por computador,
análisis de imágen o aprendizaje automático.
1
Plataforma hardware, basada en un microcomputador Raspberry Pi 2 , disponible
comercialmente y compatible con versiones de sistemas operativos Linux y Windows. Utiliza una tarjeta microSD de 16GB como disco duro y admite conexión
de periféricos esenciales en la fase de desarrollo (monitor, teclado y ratón).
Cámara Raspberry Pi NoIR de 5Mp, la cual se conecta al microcomputador Raspberry Pi 2 mediante un bus Camera Serial Interface (CSI) de alta velocidad.
Tarjeta Teensy 3.1, de tamaño reducido, compatible con la plataforma de desarrollo Arduino, fácilmente programable como dispositivo
Human Interfaz Device
(HID).
Fuente de alimentación de 5VDC a 2A, para las dos tarjetas electrónicas.
52
4.2 Dispositivo Apuntador
4.2. Dispositivo Apuntador
4.2.1. Hardware
Figura 4.1: Arquitectura hardware del sistema apuntador
Fuente: Autores
La gura 4.1 presenta la estructura hardware del dispositivo desarrollado. El proceso
de captura de la imágen, con una denición de 5 millones de pixeles y una resolución
de 640x840 pixeles, se realiza con la cámara Raspberry Pi NoIR, la cual permite una
comunicación a alta velocidad con la tarjeta principal (microcomputador Raspberry
Pi 2) a través de un bus dedicado, mediante Interfaz Serial para Cámaras (CSI por
sus siglas en inglés). Esta imágen es almacenada por la tarjeta principal (Raspberry
Pi 2), donde se realiza el procesamiento de la imágen, su segmentación, clasicación
e interpretación. Igualmente, en la tarjeta principal se realiza la determinación de las
acciones de selección que se comunican, mediante protocolo I2C en modo estándar
(100Kbps) a través de puerto serial, a la tarjeta auxiliar Teensy 3.1. Esta tarjeta contiene
el algoritmo que la congura como dispositivo HID, emulando un ratón de computador
por puerto USB, así como el algoritmo necesario para realizar una comunicación I2C.
Ambas tarjetas se alimentan mediante una fuente externa que provee los 5VDC que
requieren los circuitos electrónicos. Las tarjetas en su conjunto, se alojan en una carcaza
de acrílico que permite su jación a la parte posterior del computador (o a cualquier
otra supercie lisa) mediante un sistema de ventosa.
53
4. DESARROLLO
4.2.2. Software para Tarjeta Principal (Raspberry Pi2)
En la gura 4.2 se detalla el ujo de procesos del código software desarrollado en
lenguaje Python para el microcomputador Raspberry Pi 2.
Figura 4.2: Diagrama de ujo del algoritmo desarrollado para la tarjeta principal (Raspberry)
Fuente: Autores
A continuación se describen sus módulos principales:
PRE-PROCESADO. El código se encarga de recibir las imágenes capturadas por la
cámara en una resolución de 640x480 pixeles (RGB), almacenándolas como un arreglo
54
4.2 Dispositivo Apuntador
(array) tridimensional de la forma:

I (i,,j,k)



v0,0,R v0,1,R . . . v0,m,R
v0,0,G v0,1,G . . . v0,m,G
v0,0,B v0,1,B . . . v0,m,B
 v1,0,R v1,1,R . . . v1,m,R   v1,0,G v1,1,G . . . v1,m,G   v1,0,B v1,1,B . . . v1,m,B 




=  ..
  ..
  ..

.
.
.
.
.
.
..
..
..
.
.
.
.
.
.
 .





.
.
.
.
.
.
.
.
.
.
.
vn,0,R vn,1,R . . . vn,m,R
vn,0,G vn,1,G . . . vn,m,G
vn,0,B vn,1,B . . . vn,m,B
(4.1)
Donde
m
= (640-1) y
n
= (480-1) y en el cual, cada posición almacena el valor de
color (Red,Green,Blue) de cada pixel correspondiente en la imagen capturada.
Utilizando la función
cv2.cvtColor()
de OpenCV, se convierte el arreglo tridimen-
sional en un arreglo bidimensional correspondiente a una imagen en escala de grises con
resolución 640x480:

I (i,j)

v0,0
v0,1 . . . v0,639
 v1,0
v1,1 . . . v1,639 


=  ..

.
.
..
.
.
 .

.
.
.
v479,0 v479,1 . . . v479,639
(4.2)
La utilización de un microcomputador corriendo a 0.9Ghz e imágenes con resolución
640x480 para el algoritmo de reconocimiento de rostros, determina tiempos de procesamiento excesivos (cada ciclo toma alrededor de 3.5seg.) para un sistema que trabaje
en tiempo real. Por lo tanto, es obligatorio reducir la imagen a un tamaño que permita
realizar la detección de rostros en menos tiempo.
La función
cv2.resize() de OpenCV, redimensiona la imagen para obtener un arreglo
de menor resolución (320x240) conservando en buena medida su calidad:

I (i,j)

v0,0
v0,1 . . . v0,319
 v1,0
v1,1 . . . v1,319 


=  ..

.
.
..
.
.
 .

.
.
.
v239,0 v239,1 . . . v239,319
(4.3)
De esta manera se logran tiempos de ciclo del bucle principal de 0.9seg. en promedio.
Como la escena capturada por la cámara presenta bastante espacio libre a lado y
lado del usuario (para el cual se ha denido un rango óptimo de distancia a la cámara
entre 0.5m y 1.0m), para evitar que el algoritmo pierda tiempo buscando rostros en
las zonas periféricas de la imagen, se realiza un recorte centrado utilizando la función
cv2.getRectSubPix()
para obtener un arreglo correspondiente a resolución de 120x200
pixeles:
55
4. DESARROLLO

I (i,j)

v0,0
v0,1 . . . v0,119
 v1,0
v1,1 . . . v1,119 


=  ..

.
.
..
.
.
 .

.
.
.
v199,0 v199,1 . . . v199,119
(4.4)
Este tamaño de arreglo disminuye el tiempo de ciclo a 0.25seg. en promedio. Una
disminución adicional en el tamaño, genera también disminución de la tasa de reconocimiento del algoritmo y excesiva perdida de detalle en los objetos pequeños (ojos).
DETECCIÓN DE ROSTRO. La detección del rostro se realiza utilizando la función
cv2.CascadeClassier.detectMultiScale() y el clasicador 'haarcascade_frontalface_alt2.xml '
disponible en OpenCV, el cual está entrenado para detectar caras en posición frontal.
Presenta parámetros (factor de escalado, número de detecciones en la vecindad, tamaño
mínimo y máximo de rostros candidatos), que hemos anado mediante un proceso heurístico, los cuales permiten aumentar su eciencia en cuanto a tasa de reconocimiento,
velocidad o conabilidad. Con los parámetros
minSize
scaleFactor
= 1:2,
minNeighbors
= 1 y
= (70, 70), se logró establecer un tiempo total del ciclo de reconocimiento del
rostro en 0.05seg., manteniendo una tasa de reconocimiento cercana al 95 %.
La función entrega las coordenadas (x,y) de la esquina superior izquierda y el tamaño (w,h) del cuadrado que encierra el rostro detectado (estos valores presentan una
desviación estándar s = 2 pixeles con un rostro en posición estática), de forma que el
centro del rostro detectado tendrá coordenadas:
CoordCentro = ((x + w/2) , (y + h/2))
(4.5)
Este clasicador presenta una alta tasa de reconocimiento empleando un tiempo
relativamente corto (ideal para seguimiento o
tracking ), sin embargo, la variabilidad de
los resultados asociada a la naturaleza del método, genera la necesidad de promediar
los valores obtenidos para disminuir la variabilidad en la posición nal del cursor:
a
1 X
CentroRostro = ·
CoordCentroi
a i=1
(4.6)
Para mantener un equilibrio entre estabilidad de las coordenadas y el retardo en la
a
numpy.roll()
respuesta total del sistema, se estableció
= 5. La subrutina que se encarga de estos
cálculos, emplea las funciones
y
numpy.mean()
para obtener el promedio
de las últimas cinco coordenadas calculadas para el centro del rostro. Coordenadas que
56
4.2 Dispositivo Apuntador
representan el punto de referencia para delimitar el área donde se ubican los ojos, la
boca y deducir el movimiento del rostro.
DETECCIÓN BOCA ABIERTA. Aunque OpenCV posee clasicadores entrenados
para la detección de ojos abiertos, ojos cerrados y boca; estos clasicadores no presentaron patrones de comportamiento estables para la aplicación requerida en este trabajo
de grado. En general, se presentan falsos negativos y falsos positivos en patrones aleatorios que dicultan su tratamiento mediante retardos temporales o mediante cálculos
algebraicos, además, el uso de cada clasicador adiciona cerca de 0.04 seg. al tiempo de
ciclo total. Teniendo en cuenta que se requiere un clasicador para detectar ojos abiertos, uno para ojo derecho cerrado, uno para ojo izquierdo cerrado, uno para detectar la
boca cerrada y otro para la boca abierta, el tiempo adicional sería de 0.2seg.
El tener ubicado espacialmente el rostro, permite aprovechar otras técnicas menos
ecientes para búsqueda y seguimiento, pero mas económicas en cuanto a carga computacional en la tarea de reconocimiento de gestos faciales. Las Integrales Proyectivas
(IP), permiten tener una buena aproximación al estado y ubicación de características
faciales, utilizando cálculos sobre arreglos unidimensionales [31]. Permitiendo, además,
un proceso sencillo de entrenamiento para obtener modelos personalizados o adaptados
a condiciones particulares de condiciones ambientales.
Figura 4.3: Regiones De Interés (ROI) denidas para la boca y los ojos.
Fuente: Autores
El proceso de detección de la boca abierta se realiza utilizando
yectivas
Integrales Pro-
(IPr) y transcurre a través de dos fases principales, el entrenamiento y la
detección en tiempo de ejecución. La aplicación de las IPr comienza deniendo una
Región De Interés (ROI por sus siglas en inglés) concentrada en la región de la boca,
tal y como se aprecia en la gura 4.3, cuya ubicación y dimensiones son totalmente
dependientes de las coordenadas del centro del rostro:
57
4. DESARROLLO

vA,C
vA,(C+1)
v(A+1),C v(A+1),(C+1)

ROI− Boca(i,j) =  ..
.
.
 .
.
vB,C
vB,(C+1)
Donde:
w/4),

...
vA,D
. . . v(A+1),D 


.
..
.

.
.
...
vB,D
(4.7)
A=(CentroRostro[1]+w/4), B =(CentroRostro[1]+w*7/8), C =(CentroRostro[0]-
D =(CentroRostro[0]+w/4).
Este arreglo de tamaño variable se redimensiona a un tamaño jo de 40x30 pixeles,
de forma que facilite los posteriores procesos de proyección y comparación:

v0,0 v0,1 . . . v0,39
 v1,0 v1,1 . . . v1,39 


=  ..
.
. 
..
.
.
 .
.
.
. 
v29,0 v29,1 . . . v29,39

ROI− BocaActual(i,j)
(4.8)
De una imagen es posible extraer IPr en cualquier ángulo, pero las mas económicas
en términos de carga computacional son las que se forman al proyectar las las, Integral
Proyectiva Vertical (IPV), o al proyectar las columnas, Integral Proyectiva Horizontal
(IPH). Cada dato en la IPV es igual a la media de los datos almacenados en cada la
de la ROI y cada dato en la IPH es igual a la media de los datos almacenados en cada
columna [31], por lo tanto:

IP V− BocaActual(j)



v0,0 + v0,1 + . . . + v0,39
vh0
 vh1 
 v1,0 + v1,1 + . . . + v1,39 




=  ..

.
.
.
.
.  ÷ 39 = 
.
..
.
.
.
.
.
.
 .
 . 
.
.
.
.
.
. 
v29,0 + v29,1 + . . . + v29,39
vh29

IP H− BocaActual(i)
v0,0 v0,1
 +
+

 v1,0 v1,1


+
= +
 ..
.
.
 .
.

 +
+
v29,0 v29,1

v0,39
+ 

v1,39 

+ 
÷29 = vv0 vv1 . . . vv39
. 
..
. 
.
.

...
+ 
. . . v29,39
...
...
...
...
(4.9)
(4.10)
Estas proyecciones constituyen señales con alta inmunidad al ruido, que contienen
información relevante de las imágenes de las que proceden, sobre todo cuando las imágenes presentan grandes zonas diferenciadas de luz y sombra [31], como es el caso de
58
4.2 Dispositivo Apuntador
imágenes de la boca abierta y la boca cerrada, lo cual queda claro al observar la gura
4.4.
Figura 4.4: Integrales Proyectivas horizontales y verticales normalizadas para imágenes
de la boca abierta y la boca cerrada. Ambas imágenes obtenidas con luz cenital.
Fuente: Autores
La fase de entrenamiento comienza con la obtención de las IPV e IPH y termina con
la obtención de los Modelos de Proyección Media (ModeloPM), vertical y horizontal, los
cuales se generan con el valor medio de las señales de entrenamiento. Esta técnica para
obtener modelos de proyección genera resultados comparables con otras técnicas mas
complejas, con la ventaja de ser mas sencilla, mas fácil de implementar y mas eciente
en cuanto a carga computacional requerida[31]. Las señales previamente se normalizan
con media/varianza para hacerlas más robustas a los cambios del entorno (iluminación,
color de fondo) y facilitar los posteriores procesos de comparación y clasicación.
IP H− Bocanorm =
IP H− Boca − IP H− Bocapromedio
√
IP H− Bocavarianza
(4.11)
IP V− Bocanorm =
IP V− Boca − IP V− Bocapromedio
√
IP V− Bocavarianza
(4.12)
p
1 X
M odeloP M H− Boca = ·
IP H− Bocanormi
p i=1
(4.13)
p
1 X
M odeloP M V− Boca = ·
IP V− Bocanormi
p i=1
(4.14)
ModeloPMH_Boca
ModeloBocaAbiertaHorz.txt y Mo-
Los datos que forman las IPV y las IPH utilizadas para generar los
ModeloPMV_Boca, se almacenan en los archivos
deloBocaAbiertaVert.txt respectivamente. Lo anterior permite que estos modelos se car-
y
guen al iniciar el dispositivo y que no se alteren cuando se encuentre apagado, al igual
que facilita su importación a hojas de cálculo para su tratamiento estadístico. Cada modelo se ha entrenado con diecinieve personas (
p= 19)
de diferente edad, género y tono
59
4. DESARROLLO
de piel para aumentar la condición de generalidad. En la gura 4.5 se muestra el gráco
obtenido en una hoja de cálculo, importando los datos de las IPV de entrenamiento
para la boca abierta. En negro se puede apreciar la forma del Modelo de Proyección
Media hayado con las funciones de la hoja de cálculo.
Figura 4.5: Modelo para IPV (en negro), construido en hoja de cálculo con las IPr de
19 personas
Fuente: Autores
El entrenamiento de estos modelos solamente es posible mediante la conexión de
un teclado USB al dispositivo, para evitar modicaciones accidentales, oprimiendo la
barra espaciadora cuando se tenga la boca abierta bajo las condiciones habituales de
trabajo respecto a iluminación y posición frente al dispositivo.
La fase de detección se lleva a cabo con cada ciclo de ejecución, aproximadamente 14
veces cada segundo, obteniendo las IPr normalizadas de la región de la boca. Compara
las IPVnorm e IPHnorm recién obtenidos, con su respectivo modelo para determinar
el grado de similitud (segmentación) y el ujo de ejecución posterior o decisiones correspondientes (interpretación). La comparación se realiza obteniendo la medida de
distancia entre el modelo (M) y la proyección (Pr), ambos de longitud (L) en este caso,
utilizando
Suma de Diferencias al Cuadrado, expresada como:
L−1
1 X
Distancia(M − P r) = ·
(M i − P ri )2
L i=0
(4.15)
Esta medida de distancia resulta ser mas apropiada, para el caso de comparar IPr,
que el uso de la correlación o la distancia de mahalanobis[31]. El umbral de distancia
60
4.2 Dispositivo Apuntador
está establecido experimentalmente en cinco (5), para discriminar IPr correspodientes
a bocas abiertas o bocas cerradas, expresado en pseudocódigo como:
Distancia(M − P r) ≤ 5 ⇒ IP rsimilares ⇒ EntrenarM odelosOjos
(4.16)
Distancia(M − P r) > 5 ⇒ IP rdif erentes ⇒ ContinuarEjecuciónN ormal
(4.17)
Cuando se detecta una boca abierta por mas de un segundo, el software ingresa al
algoritmo de entrenamiento de los modelos para los ojos.
Entrenamiento ojos.
Para la región de los ojos se denieron dos ROI indepen-
dientes para el ojo izquierdo y para el ojo derecho, las cuales se pueden apreciar en la
gura 4.4, cuya ubicación y dimensiones son totalmente dependientes de las coordenadas del centro del rostro, posteriormente redimensionadas a un tamaño jo de 35x30
pixeles. Para realizar la clasicación entre ojos abiertos y cerrados (generar los modelos
y realizar las comparaciones) también se utilizan IPr. A continuación se muestra la
estructura de las IPV e IPH para el ojo izquierdo (para el ojo derecho presentan la
misma estructura):

IP V− OjoIzquierdo(j)
IP H− OjoIzquierdo(i) =

vh0
 vh1 


=  .. 
 . 
vh29
vv0 vv1 . . . vv34
(4.18)
(4.19)
Los modelos se entrenan para cada ojo cerrado, cada vez que se inicia el dispositivo o
cada vez que se detecta la boca abierta durante mas de 1 segundo. Esto permite generar
modelos personalizados a cada usuario y entorno ambiental, lo cual es necesario en este
caso, ya que la zona de los ojos resulta no ser tan discriminante como la zona de la
boca, dicultando la creación de modelos generalizados. Cada modelo para los ojos se
construye a partir de cinco fotogramas obtenidos durante la fase de entrenamiento, con
lo cual, cada ModeloPM resulta del valor medio de cinco señales de entrenamiento,
normalizadas con media/varianza:
5
1 X
M odeloP M H− Ojo = ·
IP H− Ojonormi
5 i=1
(4.20)
61
4. DESARROLLO
M odeloP M V− Ojo =
5
1 X
·
IP V− Ojonormi
5 i=1
(4.21)
A diferencia de los modelos para la boca, los modelos para los ojos no se almacenan en archivos externos sino en posiciones de memoria, de manera que se pierden al
desconectar el dispositivo o al realizar un nuevo entrenamiento.
El proceso de detección de ojos cerrados se realiza mientras el rostro se encuentre
en la zona de reposo, lo que ahorra recursos computacionales y genera una restricción
conveniente a la hora realizar acciones de selección (clic). En esta zona de reposo, el
dispositivo toma fotogramas de los ojos, extrae las IPV e IPH, las normaliza y las
compara con los ModeloPM para cada ojo mediante
Suma de Diferencias al Cuadrado,
de manera similar al proceso para la boca (4.15). Sin embargo, en este caso el umbral se
ha establecido experimentalmente en cuatro (4) para discriminar IPr correspondientes
a ojos abiertos u ojos cerrados. Este proceso de segmentación y clasicación toma 0.01
seg., lo cual representa apenas un 20 % del tiempo total para el ciclo de ejecución. La
detección del estado abierto o cerrado para el ojo izquierdo o el derecho, genera acciones
correspondientes para el estado de los botones izquierdo y derecho del ratón, de acuerdo
a lo expresado como:
DistOjoIzq(M − P r) ≤ 4 ⇒ IP rsimilares ⇒ BotonIzquierdoP ulsado
(4.22)
DistOjoIzq(M − P r) > 4 ⇒ IP rdif erentes ⇒ BotonIzquierdoLiberado
(4.23)
DistOjoDer(M − P r) ≤ 4 ⇒ IP rsimilares ⇒ BotonDerechoP ulsado
(4.24)
DistOjoDer(M − P r) > 4 ⇒ IP rdif erentes ⇒ BotonDerechoLiberado
(4.25)
Calculo del desplazamiento del rostro.
Al nal de la rutina de entrena-
miento de los ojos, también se ejecuta el algoritmo que dene el
y las
62
Zonas de Velocidad.
Centro de Referencia
4.2 Dispositivo Apuntador
El
Centro de Referencia
se reere a un punto invariable en el espacio 2D de los fo-
togramas del rostro (equivalente a un punto invariable en el espacio 3D de movimientos
de la cabeza), el cual corresponde a la posición neutra del centro del rostro, esto es, la
posición en la cual no queremos que se genere movimiento del cursor y, en general, debe
coincidir con el rostro mirando en dirección del centro de la pantalla del computador.
Este
Centro de Referencia
tiene las coordenadas del centro del rostro, detectado in-
mediatamente después del entrenamiento de los ojos, las cuales permanecen constantes
(referencia) hasta el siguiente proceso de entrenamiento, el cual ocurre normalmente
cuando se inicia el dispositivo, cuando hay cambio de usuario o cuando el dispositivo
no responde adecuadamente a la apertura y cierre de los ojos. En la gura 4.6-a se
muestra claramente el punto central del rostro, el
círculos concéntricos de las
Centro de Referencia
(dentro de los
Zonas de Velocidad ) y su desplazamiento relativo.
La dirección del movimiento de la cabeza, guarda una relación directa con la dirección en la que se mueve el cursor por la pantalla del computador. Esto es, si la cabeza se
gira hacia arriba, el cursor se movera hacia la parte superior de la pantalla; si la cabeza
se gira a la derecha, el cursor se moverá hacia la parte derecha de la pantalla; en los
casos en que la cabeza se gire en una diagonal entre las direcciones derecha y arriba, el
cursor se desplazará sobre una diagonal de 45º buscando la región superior derecha de
la pantalla. Este ángulo será de 45º sin importar el ángulo de inclinación de la cabeza.
Para calcular el valor del desplazamiento de la cabeza y la dirección en que se realiza
este desplazamiento, se realiza una suma algebraica entre las coordenadas del
Actual
del rostro y el
Centro
Centro de Referencia:
DesplazamientoRostro(x,y) = CentroRef erencia(x1 , y1 ) − CentroActual(x2 , y2 )
(4.26)
De esta manera obtenemos un desplazamiento a lo largo del eje
miento a lo largo del eje
del cursor
.
X
y un desplaza-
Y, cuyas componentes denen las componentes del movimiento
Esta operación se realiza en cada ciclo de ejecución, para denir en todo
momento la posición del rostro con respecto a la posición de referencia. La distancia
entre los dos centros se obtiene de manera tradicional como:
DistanciaCentros =
p
DesplazamientoRostroX 2 + DesplazamientoRostroY 2
(4.27)
63
4. DESARROLLO
Figura 4.6: Detección del desplazamiento. a) Rostro con marca central, b) Rostro en
Centro Actual con
desplazado con respecto al Centro de Referencia.
posición de coincidencia de su
el
Centro de Referencia,
c) Rostro
Fuente: Autores
La velocidad de desplazamiento del cursor, la determina el valor del desplazamiento
del rostro (distancia entre centros). Por esto, están denidas tres velocidades para el
cursor:
Si se encuentra en la zona central o de reposo, no se genera movimiento en el
cursor, con lo cual, ingresar a esta zona constituye la acción de frenado del cursor
y la posibilidad de realizar una acción de selección (clic), posición que está ejemplicada en la gura 4.6-b. Mientras el cursor se encuentre en movimiento, no se
podrán generar acciones de selección. La tarjeta que implementa la comunicación
USB con el computador (Teensy 3.1), recibe dos parámetros para denir la velocidad del cursor (Rango o multiplicador y Retardo), los cuales en este caso tienen
los valores que se aprecian a continuación. Nótese que el multiplicador igual a
cero anula cualquier movimiento del cursor:
Rango = 0
(4.28)
Retardo = 10
(4.29)
Si el centro del rostro se encuentra dentro de la zona de velocidad lenta, el cursor
se moverá con una velocidad que permita su aproximación con precisión al punto
deseado de la pantalla.
64
4.2 Dispositivo Apuntador
Rango = 1
(4.30)
Retardo = 30
(4.31)
La zona de velocidad rápida, generará una velocidad de desplazamiento del cursor que facilite recorrer la pantalla. En este caso, el punto central del rostro se
encuentra fuera de la zona de reposo y fuera de la zona de velocidad lenta, tal y
como se aprecia en la gura 4.6-c.
Rango = 2
(4.32)
Retardo = 15
(4.33)
Estos valores han sido obtenidos experimentalmente, buscando compromiso entre
velocidad y capacidad de control del cursor. Velocidades bajas permiten mayor precisión
en la ubicación nal del cursor, mientras que velocidades altas hacen mas rápida la tarea
de desplazarse. Estas zonas de velocidad están esquematizadas en la gura 4.7.
Figura 4.7: Zonas de velocidad denidas para el cursor
Fuente: Autores
Una vez se ha denido la velocidad y la cantidad de desplazamiento en las componentes
X
e
Y
del cursor, estos parámetros se envían a la tarjeta auxiliar mediante
protocolo I2C utilizando librerías nativas de Python.
65
4. DESARROLLO
4.2.3. Software para tarjeta auxiliar
Figura 4.8: Diagrama de ujo del algoritmo desarrollado para la tarjeta auxiliar (Teensy)
Fuente: Autores
La tarjeta auxiliar del sistema, tiene el propósito de establecer la comunicación con el
computador, emulando un ratón como dispositivo HID. Para esto, se comunica mediante
protocolo I2C con la tarjeta principal, obteniendo los datos de velocidad y distancias
que se desplazará el cursor sobre los ejes
X e Y. El algoritmo, cuyo ujo está diagramado
en la gura 4.8, calcula la cantidad de pixeles que deberá moverse (DesplazamientoX
Rango, DesplazamientoY * Rango ) y la dirección del desplazamiento, enviando estos
datos por el puerto USB al computador. El parámetro Retardo agrega tiempo a la
*
ejecución general de cada ciclo del bucle principal.
4.3. Metodología para pruebas funcionales
4.3.1. Método
Tomando como base la norma ISO 9241-411, se planteó el siguiente método para
medir los parámetros velocidad, precisión y rendimiento para tres dispositivos apuntadores (ratón óptico, touchpad y el dispositivo desarrollado en este proyecto). Se debe
realizar la prueba con 5 personas de distinto género, edad y experiencia con el entorno
66
4.4 Ejecución Financiera
informático. Utilizar un computador portátil con procesador Pentium(R) Dual-Core
T4300 a 2.10 GHz, 3.00 GB de memoria RAM y Windows 7 Ultimate a 32 bits. Utilizar
software de uso libre para desarrollar la prueba, en este caso FittsTaskTwo. [35]
Procedimiento
Llevar a cabo tareas simples de movimiento multidireccional del cur-
sor y selección de objetos, mencionadas en la norma ISO 9241-411 y basada en los
conceptos propuestos por Fitts . Cada participante debe realizar la tarea con todos los
dispositivos en orden aleatorio. Antes de la prueba se debe informar a todos los participantes del propósito del experimento, se debe llevar a cabo una demostración inicial
de la tarea a desarrollar y permitir que los participantes se familiaricen con el manejo
de cada dispositivo.
Para cada sesión el software genera cuatro pruebas, cada prueba presenta 3 círculos
de igual diámetro dispuestos en un arreglo circular. En cada prueba varía el diámetro
de los círculos (entre 30 y 60 pixeles) y el diámetro del arreglo circular (entre 300 y
500 pixeles), lo que genera condiciones de trabajo que presentan dicultades nominales
variables (ID ). La secuencia se inicia seleccionando el círculo superior, a continuación
se selecciona el círculo en el lado opuesto, continuando la selección en el sentido de las
agujas del reloj para el siguiente círculo del lado opuesto hasta seleccionarlos todos. El
círculo a seleccionar se distingue por estar resaltado hasta cuando se detecta un clic
del dispositivo. Es necesario informar que los círculos se deben seleccionar de la forma
más rápida y precisa posible, cometiendo máximo un error por secuencia (cada error
genera una alarma sonora). Para cada dispositivo, un participante debe realizar cuatro
secuencias de selección. Finalmente, se obtiene el rendimiento (throughput) de cada
persona con cada dispositivo en particular, permitiendo análisis comparativo con los
dispositivos apuntadores de uso mas común.
4.4. Ejecución Financiera
En el cuadro 4.1 se detalla la ejecución de los recursos asignados a este proyecto.
En el rubro
Bibliografía
no se presentó ninguna ejecución ya que se tuvo acceso a libros
especializados en OpenCV, Python y Visión Articial, en formato digital y de acceso
libre por internet. Los recursos asignados a
Servicios Técnicos
no se ejecutaron porque
no se requirió fabricación externa de la carcaza.
67
4. DESARROLLO
Cuadro 4.1: Ejecución nanciera. Fuente: Autores
Fuente: Autores
68
Capitulo 5
Resultados, Conclusiones y Trabajo
Futuro
5.1. Resultados
Inicialmente, se realizaron pruebas con 4 personas de distinto género, edad y experiencia con el entorno informático. El software FittsTaskTwo [35], arroja, entre otros
datos, el valor del rendimiento o throughput (TP) para cada dispositivo utilizado en las
pruebas. Este parámetro permite conocer cuanto se demora el usuario en realizar una
tarea con un grado especíco de complejidad, utilizando una dispositivo apuntador. Los
resultados para las pruebas realizadas con el ratón óptico, el
touchpad
y el dispositivo
apuntador desarrollado, se presentan en la gura 5.1.
Figura 5.1: Gráco del rendimiento del dispositivo apuntador en comparación con dos
dispositivos de uso común
Fuente: Autores
Este gráco comparativo, permite observar que el rendimiento del dispositivo apun-
69
5. RESULTADOS, CONCLUSIONES Y TRABAJO FUTURO
touchpad,
el touchpad
tador desarrollado es inferior al que se obtiene utilizando el ratón óptico o el
mas especícamente, el ratón óptico tiene casi el doble de rendimiento y
tiene un rendimiento 2.5 veces mayor. Sin embargo, es importante hacer notar que,
a pesar de tomar el doble del tiempo, el dispositivo apuntador desarrollado permite
realizar las mismas tareas de desplazamiento y selección que se realizan con los dispositivos apuntadores comunes. Además, el uso habitual permitiría mejorar el parámetro
de rendimiento.
Consultando los resultados de otros estudios mas detallados para diferentes dispositivos apuntadores, se evidencia que el rendimiento del dispositivo desarrollado durante
este proyecto (TP=1.7) es similar al rendimiento de una palanca de mando o
Joystick
(TP=1.8). [36]
5.2. Conclusiones
Como resultado de todo el proceso de aprendizaje que genera un trabajo de grado,
queda la sensibilidad de identicar una necesidad en un grupo poblacional con discapacidad en miembros superiores, la adquisición de conocimientos durante la consulta
de bibliografía y la vigilancia tecnológica, la satisfacción de aplicar los conocimientos
adquiridos durante el desarrollo de nuestra carrera para satisfacer la necesidad identicada y la templanza que brinda culminar un proyecto, salvando todas las dicultades
encontradas durante su desarrollo.
En cuanto a los objetivos y actividades planteadas inicialmente, podemos concluir
que:
Se logró obtener un dispositivo apuntador, que permite controlar el cursor del
computador mediante movimientos de la cabeza utilizando clasicadores de uso
Filtros Haar en Cascada ) y algoritmos clasicadores adaptados a las necesidades de este proyecto (Integrales Proyectivas ).
libre (
Se seleccionó una plataforma óptima de desarrollo, compuesta por un microcomputador Raspberry Pi 2, una tarjeta Teensy 3.1, una cámara Raspberry Pi
NoIR, el lenguaje de programación Python, las librerías OpenCV para visión articial y la cual se comunica con el computador como dispositivo HID a través de
interface USB.
70
5.3 Trabajo futuro
Se desarrolló una aplicación software para la tarjeta principal y un algoritmo de
funcionamiento para la tarjeta auxiliar.
Se realizó la integración del hardware y el software en un solo dispositivo que
emula un ratón con interface USB-HID. Se realizó la validación del dispositivo
obtenido mediante un protocolo de pruebas estandarizado.
Se elaboró el manual de usuario.
5.3. Trabajo futuro
En la fase nal de este proyecto, se generó la espectativa de realizar mejoras al dispositivo, las cuales se encuentran fuera del alcance planteado inicialmente, pero constituyen propuestas que permiten ampliar y mejorar la funcionalidad del sistema. Estas
propuestas son:
Implementar el funcionamiento alternativo como teclado.
Generar la posibilidad de reconocimiento de otros gestos faciales, los cuales permitan generar acciones externas pero relacionadas con el funcionamiento de un
computador (encendido de estabilizador, iluminación, modem, centro de sonido).
Realizar el desarrollo sobre un sistema operativo que aproveche la característica
multi-procesador de la Raspberry Pi 2 (actualmente en versiones beta).
71
5. RESULTADOS, CONCLUSIONES Y TRABAJO FUTURO
72
Anexo A
Código Python para Raspberry Pi 2
-
73
DISPOSITIVO APUNTADOR MEDIANTE VISIÓN ARTIFICIAL, ADECUADO PARA USUARIOS DE
COMPUTADOR CON DISCAPACIDAD MOTORA EN MIEMBROS SUPERIORES
Trabajo de grado para optar al título de Ingeniero (a) en Control
UNIVERSIDAD DISTRITAL “FRANCISCO JOSÉ DE CALDAS” - FACULTAD TECNOLÓGICA
Bogotá D.C. , 2015
CÓDIGO DESARROLLADO EN PYTHON PARA TARJETA RASPBERRY PI 2
#python code
# -*- coding: UTF-8 -*#La línea anterior permite usar tildes y la ñ
#===========================================================
#===========================================================
__author__ = "Yesid Rodríguez Lozano"
__email__ = "[email protected]"
__credits__ = ["Yesid Rodríguez Lozano ", "Leidy Marcela Peña Bueno"]
__copyright__ = "Copyright 2015"
__version__ = "1.0"
#===========================================================
#===========================================================
#
DESCRIPCIÓN
#----------------------------------------------------------# Realiza detección facial, calcula coordenadas de movimiento
# y las comunica a una tarjeta Teensy 3.1 para generar
# movimiento del cursor del ratón.
# Detecta cuando se abre la boca e inicia rutina de
# reconocimiento de ojos. Cada vez que se cierra un ojo,
# genera un clic de ratón.
#----------------------------------------------------------#===========================================================
#
LIBRERÍAS
#----------------------------------------------------------import numpy as np
#import matplotlib.pyplot as plt
#import pylab as pl
import cv2
#Librería para el uso de I2C
import smbus
#Librería para usar puertos I/O
import RPi.GPIO as GPIO
#La librería siguiente permite calcular tiempos de ejecucion
import time
#La librería siguiente permite usar funciones matemáticas
import math
#-----------------------------------------------------------
#===========================================================
#
FUNCIONES
#-----------------------------------------------------------
def ObtenerFotograma(Cam):
#----------------------------------------------------------#Esta función obtiene fotograma de la cámara (cam), lo convierte
#a escala de grises, lo reduce, lo recorta, lo ecualiza
#para mejorar el contraste y retorna la imágen resultante
#en tamaño 120x200.
#----------------------------------------------------------_, FotogColor = Cam.read(0) # Captura fotograma de la cámara. Se guarda en 'FotogColor'
FotogGris_Grande = cv2.cvtColor(FotogColor, cv2.COLOR_BGR2GRAY) # Convierte a gris
FotogGris_Med = cv2.resize(FotogGris_Grande, (320, 240), interpolation=cv2.INTER_LINEAR) # Redimensiona
FotogGris_Peque = cv2.getRectSubPix(FotogGris_Med, (120, 200), (160, 120)) # Recorta rectángulo de 120x200
FotogGris = cv2.equalizeHist(FotogGris_Peque) # Normaliza
#return FotogGris_Peque
return FotogGris
#----------------------------------------------------------#-----------------------------------------------------------
def CalculaCentroRostro(iX, iY, iW, iH, vCoordX, vCoordY):
#----------------------------------------------------------#Esta función obtiene el valor promedio de las últimas cinco
#lecturas de las coordenadas del centro del rostro.
#Lo anterior brinda un punto de referencia (centro) estable.
#Recibe las coordenadas X y Y de la esquina superior
#izquierda del cuadrado que encierra el rostro detectado,
#el ancho W y la altura H de dicho cuadrado y los vectores
#con las últimas lecturas.
#Retorna coordenadas X,Y del centro del rostro.
#----------------------------------------------------------iCoordX = int(iX + (iW / 2))
iCoordY = int(iY + (iH / 2))
vCoordX = np.roll(vCoordX, 1)
vCoordX[0] = iCoordX
iCoordX = int(np.mean(vCoordX))
vCoordY = np.roll(vCoordY, 1)
vCoordY[0] = iCoordY
iCoordY = int(np.mean(vCoordY))
lCentro = iCoordX, iCoordY
return vCoordX, vCoordY, lCentro
#----------------------------------------------------------#-----------------------------------------------------------
def ObtenerProyeccionesHV(arrRegion):
#----------------------------------------------------------#Esta función toma un array, obtiene las integrales
#proyectivas horizontal e integral, las normaliza y las
#visualiza.
#Devuelve los vectores normalizados de dichas proyecciones.
#----------------------------------------------------------#Crea integrales proyectivas horizontal y vertical, con valores promedio
vProyHorz = arrRegion.mean(axis=0)
vProyVert = arrRegion.mean(axis=1)
#Se realiza normalización por media y varianza (xi-mediaX)/sqrt(varianzaX)
if vProyHorz.var() == 0: # Obtiene proyección normalizada (media/varianza), teniendo en cuenta división por cero
vProyHorz_norm = (vProyHorz - vProyHorz.mean())
else:
vProyHorz_norm = (vProyHorz - vProyHorz.mean()) / math.sqrt(vProyHorz.var())
if vProyVert.var() == 0: # Obtiene proyección normalizada (media/varianza), teniendo en cuenta división por cero
vProyVert_norm = (vProyVert - vProyVert.mean())
else:
vProyVert_norm = (vProyVert - vProyVert.mean()) / math.sqrt(vProyVert.var())
return vProyHorz_norm, vProyVert_norm
#----------------------------------------------------------#-----------------------------------------------------------
def GrabaModeloBocaAbierta(VectorHorizontal, VectorVertical):
#----------------------------------------------------------#Esta función recibe dos vectores de datos y los guarda
#en los archivos 'ModeloBocaAbiertaHor.txt' y
#No verifica la coherencia de los datos, por lo que se
#require estar seguro que los datos de entrada correspondan
#a las proyecciones de una boca abierta.
#No devuelve ninguna información.
#----------------------------------------------------------#Proceso para grabar el vector con la proyección horizontal actual en el archivo.
#Como es un archivo de texto, se requiere convertir los datos numéricos del
#vector a cadenas de texto.
aArchivo = open('ModeloBocaAbiertaHorz.txt', 'a') # Abre archivo para escritura
for iDato in VectorHorizontal: # Cada número de tipo 'float' del vector...
aArchivo.write(repr(iDato)) # es convertido a 'string' y escrito en el archivo..
aArchivo.write(' ') # y separado por un espacio en blanco
aArchivo.write('\n') # cuando se ha escrito todo el vector, se agrega un salto de línea
aArchivo.close()
#Proceso para grabar el vector con la proyección vertical actual en el archivo.
aArchivo = open('ModeloBocaAbiertaVert.txt', 'a') # Abre archivo para escritura
for iDato in VectorVertical: # Cada número de tipo 'float' del vector...
aArchivo.write(repr(iDato)) # es convertido a 'string' y escrito en el archivo..
aArchivo.write(' ') # y separado por un espacio en blanco
aArchivo.write('\n') # cuando se ha escrito todo el vector, se agrega un salto de línea
aArchivo.close()
#----------------------------------------------------------#-----------------------------------------------------------
def LeeModelo(cNombreArchivo, iTamVector):
#----------------------------------------------------------#Esta función obtiene vector con el promedio de los datos
#de las proyecciones. Estos datos se encuentran guardados en
#un archivo de texto. Cada línea del archivo corresponde a
#una proyección. Cada cadena de texto corresponde a un valor.
#Las cadenas de texto están separadas por un espacio.
#El vector obtenido es devuelto como el modelo de la
#integral proyectiva.
#----------------------------------------------------------iCuentaProyecciones = 0 # Inicializa conteo del número de proyecciones (líneas) guardadas en el archivo
vVectorPromedio = np.zeros(iTamVector, dtype='float16') # Vector de trabajo
aArchivo = open(cNombreArchivo, 'r') # Abre archivo para lectura
linea = aArchivo.readline() # Lee la primer línea...
while linea != "": # y realiza proceso hasta el final del archivo
iCuentaProyecciones += 1
lista = linea.split() # Crea lista con cadenas de texto definidos por los espacios entre conjunto de caracteres de la línea
lista = [float(i) for i in lista] # Convierte lista de cadenas de texto a lista de números tipo 'float'.
vVectorPromedio = vVectorPromedio + lista # Realiza suma uno a uno de los datos en los dos 'array'
linea = aArchivo.readline() # Contínúa con la línea siguiente del archivo
vVectorPromedio = vVectorPromedio / iCuentaProyecciones # Calcula la media de cada conjunto de datos
aArchivo.close()
return vVectorPromedio
#----------------------------------------------------------#-----------------------------------------------------------
def CapturaModelosOjos(lCentro):
#----------------------------------------------------------#Esta función obtiene los modelos para las integrales
#proyectivas de los ojos cerrados.
#Recibe las coordenadas del centro del rostro, delimita
#la región de los ojos, toma cinco fotografías para cada
#ojo (derecho e izquierdo), calcula las proyecciones
#verticales y finalmente calcula los modelos con los
#promedios de los datos obtenidos.
#Retorna los modelos de integral proyectiva vertical para el ojo derecho y el izquierdo.
#----------------------------------------------------------#Enciende led de la cámara y luego lo apaga para indicar lectura de datos para el modelo
ControlarLEDs(1, 1, 1, 1)
ControlarLEDs(1, 1, 0, 1)
ControlarLEDs(0, 1, 0, 0.5)
ControlarLEDs(0, 1, 1, 0)
vProyVert = np.zeros(30) # Vector de trabajo
for iCont in range(0, 10): # Toma 9 fotogramas consecutivos. El ojo izquierdo debe estar cerrado
arrFotograma = ObtenerFotograma(cap)
RoiOjoIzq = arrFotograma[lCentro[1] - 15:lCentro[1] + 15, lCentro[0]:lCentro[0] + 35] # Encuadra zona del ojo izquierdo
#_, RoiOjoIzq = cv2.threshold(RoiOjoIzq, 80, 255, cv2.THRESH_TOZERO) # XXXXXXXXXXXXXXXXXXX
#cv2.imshow('Captura Ojos' + str(iCont), RoiOjoIzq) # Muestra las cinco capturas de los ojos
if 5 <= iCont <= 9:
vProyVert = vProyVert + RoiOjoIzq.mean(axis=1) # Suma 5 integrales proyectivas horizontales para ojo izquierdo cerrado
vProyVert = vProyVert / 5 # Obtiene integral proyectiva promedio
if vProyVert.var() == 0: # Obtiene modelo normalizado (media/varianza), teniendo en cuenta división por cero
vOjoIzq_Modelo = (vProyVert - vProyVert.mean())
else:
vOjoIzq_Modelo = (vProyVert - vProyVert.mean()) / math.sqrt(vProyVert.var())
#Enciende led de la cámara y luego lo apaga para indicar lectura de datos para el modelo
ControlarLEDs(0, 1, 0, 0.5)
ControlarLEDs(1, 1, 0, 2)
ControlarLEDs(1, 0, 0, 0.5)
ControlarLEDs(1, 0, 1, 0)
vProyVert = np.zeros(30) # Vector de trabajo
for iCont in range(0, 8): # Toma 9 fotogramas consecutivos. El ojo izquierdo debe estar cerrado
arrFotograma = ObtenerFotograma(cap)
RoiOjoDer = arrFotograma[lCentro[1] - 15:lCentro[1] + 15, lCentro[0] - 35:lCentro[0]] # Encuadra zona del ojo derecho
#_, RoiOjoDer = cv2.threshold(RoiOjoDer, 40, 255, cv2.THRESH_BINARY_INV)
if 2 <= iCont <= 6:
vProyVert = vProyVert + RoiOjoDer.mean(axis=1) # Suma 5 integrales proyectivas horizontales para ojo derecho cerrado
vProyVert = vProyVert / 5 # Obtiene integral proyectiva promedio
if vProyVert.var() == 0: # Obtiene modelo normalizado (media/varianza), teniendo en cuenta división por cero
vOjoDer_Modelo = (vProyVert - vProyVert.mean())
else:
vOjoDer_Modelo = (vProyVert - vProyVert.mean()) / math.sqrt(vProyVert.var())
ControlarLEDs(1, 0, 0, 0.5)
ControlarLEDs(1, 1, 0, 1)
ControlarLEDs(0, 0, 0, 0)
return vOjoIzq_Modelo, vOjoDer_Modelo
#----------------------------------------------------------#-----------------------------------------------------------
def ComparaConModelo(vMod, vProy, iRango):
#----------------------------------------------------------#Esta función compara un vector de proyección con el modelo
#aplicando la distancia definida por la suma de diferencias
#al cuadrado.
#Desplaza la proyección adelante y atrás para tomar la
#distancia mínima.
#Retorna indicación de similitud.
#----------------------------------------------------------vDistancia = np.zeros((3), dtype=np.int) # Vector de trabajo
#Desplaza la proyección dos lugares atrás y dos lugares adelante...
#y compara con el modelo
for i in range(-1, 2):
b = np.roll(vProy, i * 2)
if i > 0:
b[:i * 2] = b[i * 2]
if i < 0:
b[i * 2:] = b[i * 2]
vDistancia[i + 1] = np.sum((vMod - b) ** 2)
iDistancia = min(vDistancia) # Toma la distancia mínima
#De acuerdo al rango establecido decide similitud
if iDistancia <= iRango:
bSimilitud = 1 # Si los vectores son similares retorna 1
else:
bSimilitud = 0
return bSimilitud
#----------------------------------------------------------#-----------------------------------------------------------
def GraficaProyeccion(vProy, bHV, sTitulo):
#----------------------------------------------------------#Esta función grafica el vector vProy.
#bHV indica si es horizontal(0) o vertical(1).
#sTitulo debe ser cadena de caracteres para el título
#No retorna variables.
#----------------------------------------------------------if bHV == 0:
#Crea imágen (FxC) negra para representar proyección horizontal. x4 para visualizar mejor
imgPH = np.zeros((100, len(vProy) * 4), dtype='uint8')
for iCol in range(0, len(vProy) - 1): # Dibuja curva a partir de la proyección horizontal. x4 para visualizar mejor
cv2.line(imgPH, (iCol * 4, 25 - (int(vProy[iCol] * 10))), ((iCol + 1) * 4, 25 - (int(vProy[iCol + 1] * 10))), (255, 0, 0), 1)
#Dibuja líneas limítrofes y guías
cv2.line(imgPH, (0, 25), (len(vProy) * 4, 25), (255, 0, 0), 1)
cv2.line(imgPH, (0, 50), (len(vProy) * 4, 50), (255, 0, 0), 1)
#Coloca texto informativo
#cv2.putText(imgProyHorz, 'IP Horizontal', (0, 60), cv2.FONT_ITALIC, 0.3, (255, 0, 0), 1)
cv2.imshow('IP Horizontal ' + sTitulo, imgPH)
if bHV == 1:
#Crea imágen (FxC) negra para representar proyección vertical. x4 para visualizar mejor
imgPV = np.zeros(((len(vProy) * 4) + 50, 100), dtype='uint8')
for iFila in range(0, len(vProy) - 1): # Dibuja curva a partir de la proyección vertical
cv2.line(imgPV, (50 - (int(vProy[iFila] * 10)), iFila * 4), (50 - (int(vProy[iFila + 1] * 10)), ((iFila + 1) * 4)), (255, 0, 0), 1)
#Dibuja líneas limítrofes y guías
cv2.line(imgPV, (50, 0), (50, len(vProy) * 4), (255, 0, 0), 1)
cv2.line(imgPV, (0, len(vProy) * 4), (100, len(vProy) * 4), (255, 0, 0), 1)
#Coloca texto informativo
#cv2.putText(imgProyVert, 'IP Vertical', (0, (len(vProy) * 4) + 20), cv2.FONT_ITALIC, 0.3, (255, 0, 0), 1)
cv2.imshow('IP Vertical ' + sTitulo, imgPV)
#----------------------------------------------------------#-----------------------------------------------------------
def AnguloDesplazamiento(iVectorX, iVectorY):
#----------------------------------------------------------#Esta función recibe las componentes X,Y del desplazamiento
#de la cabeza y retorna el ángulo del vector (en grados)
#----------------------------------------------------------iDimension = math.hypot(iVectorX, iVectorY) # Calcula hipotenusa
if iDimension == 0:
iDimension = 0.1
iAnguloGrados = math.degrees(math.acos(iVectorX / iDimension))
if iVectorY < 0:
iAnguloGrados = 360 - iAnguloGrados
return iAnguloGrados
#----------------------------------------------------------#-----------------------------------------------------------
def RatonVelocidad(iVectorX, iVectorY, iLento, iRapido):
#----------------------------------------------------------#Esta función recibe las componentes del desplazamiento en X,Y y
#los porcentajes equivalentes al inicio de las zonas de
#velocidad lenta y rápida del ratón.
#calcula la dimensión del vector de movimiento y de acuerdo
#a la zona de velocidad a que corresponda, devuelve el rango y
#el retardo con el cual se debe mover el ratón.
#----------------------------------------------------------iDimension = math.hypot(iVectorX, iVectorY) # Calcula hipotenusa
if iDimension <= iLento:
Rango = 0
Retardo = 10
elif iLento < iDimension < iRapido:
Rango = 1
Retardo = 30
elif iRapido <= iDimension:
Rango = 2
Retardo = 15
return Rango, Retardo
#----------------------------------------------------------#-----------------------------------------------------------
def RatonMovimientoXY(iAnguloGrados):
#----------------------------------------------------------#Esta función recibe el ángulo (en grados) del vector
#desplazamiento de la cabeza y define la dirección en que
#se hará el movimiento del ratón.
#Si el vector de movimiento de la cabeza está entre 330º y 30º
#el ratón se mueve hacia X=1,Y=0
#Si el vector de movimiento de la cabeza está entre 30º y 60º
#el ratón se mueve hacia X=1,Y=1
#Si el vector de movimiento de la cabeza está entre 60º y 120º
#el ratón se mueve hacia X=0,Y=1
#Si el vector de movimiento de la cabeza está entre 120º y 150º
#el ratón se mueve hacia X=-1,Y=1 y así sucesivamente
#Devuelve los vectores unitarios X,Y del movimiento del ratón.
#----------------------------------------------------------if iAnguloGrados <= 30 or iAnguloGrados >= 330: # Si está entre -30º y 30º
iRatonX = 1 # El ratón se mueve en el eje X
iRatonY = 0
elif 30 < iAnguloGrados < 60: # Entre 30º y 60º
iRatonX = 1 # El ratón se mueve en la diagonal X,Y
iRatonY = 1
elif 60 <= iAnguloGrados <= 120: # Entre 60º y 120º
iRatonX = 0 # El ratón se mueve en el eje Y
iRatonY = 1
elif 120 < iAnguloGrados < 150: # Entre 120º y 150º
iRatonX = -1 # El ratón se mueve en la diagonal -X,Y
iRatonY = 1
elif 150 <= iAnguloGrados <= 210:
iRatonX = -1
iRatonY = 0
elif 210 < iAnguloGrados < 240:
iRatonX = -1
iRatonY = -1
elif 240 <= iAnguloGrados <= 300:
iRatonX = 0
iRatonY = -1
elif 300 < iAnguloGrados < 330:
iRatonX = 1
iRatonY = -1
return iRatonX, iRatonY
#----------------------------------------------------------#-----------------------------------------------------------
def ControlarLEDs(bLedIzq, bLedDer, bLedCam, iTiempo):
#----------------------------------------------------------#Esta función enciende o apaga cada Led durante el tiempo
#especificado.
#No devuelve variables.
#----------------------------------------------------------# Configura número para el Led de la cámara. Usar 5 para modelos A/B y 32 para modelos B+ y 2
LED_Izq = 13
LED_Der = 21
CAMLED = 32
# Establece estado de cada Led
GPIO.output(LED_Izq, bLedIzq)
GPIO.output(LED_Der, bLedDer)
GPIO.output(CAMLED, bLedCam)
# Genera retardo en la ejecución
if iTiempo != 0:
time.sleep(iTiempo)
#----------------------------------------------------------#----------------------------------------------------------#===========================================================
#
PRINCIPAL
#----------------------------------------------------------#Carga algoritmo de reconocimiento del rostro
Rostro_Haar = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
#Configura puertos I/O
#-----------------------cap = cv2.VideoCapture(0) # Asigna variable asociada a la RasPiCam
bus = smbus.SMBus(1) # Define identificador del bus I2C en Raspberry Pi 2
address = 0x04 # Define dirección de la tarjeta Teensy 3.1
GPIO.setmode(GPIO.BCM) # GPIO numerado en modo Broadcom SOC channel (BCM)
GPIO.setwarnings(False) # Desabilita "warnings"
# Configura como salidas y apaga los LED
GPIO.setup(32, GPIO.OUT, initial=False) # Led de la cámara
GPIO.setup(21, GPIO.OUT, initial=False) # Led derecho
GPIO.setup(13, GPIO.OUT, initial=False) # Led izquierdo
#-----------------------#Carga valores iniciales
#-----------------------ZonaCero = 0
Rostro_OK = 0
BocaAbierta_Entrenamiento = 0
CentroRostro = (0, 0)
CentroRef = (0, 0)
ZonasDeVelocidad = 0
ZonaLenta = 0
ZonaRapida = 0
QuincePorCiento = 0
PrimerCiclo = 1
iCiclos = 0
#Crea vectores para promediar coordenadas del centro del rostro
vCoordCentroX = np.zeros((5), dtype=np.int)
vCoordCentroY = np.zeros((5), dtype=np.int)
#Crea vectores para modelos de los ojos
vOjoIzq_Modelo = np.zeros(30)
vOjoDer_Modelo = np.zeros(30)
#Obtiene modelos entrenados para la boca abierta
vBocaProyHorz_Modelo = LeeModelo('ModeloBocaAbiertaHorz.txt', 40)
vBocaProyVert_Modelo = LeeModelo('ModeloBocaAbiertaVert.txt', 30)
#-----------------------#Enciende y apaga LEDs indicando inicio
ControlarLEDs(1, 0, 0, 1) # (Led izquierdo, Led Derecho, Led Cámara, Retardo)
ControlarLEDs(0, 1, 0, 1)
ControlarLEDs(0, 0, 1, 1)
ControlarLEDs(0, 0, 0, 0)
while(1):
TiempoInicial = time.time() # Comienza cronómetro
#Llama función que toma fotograma, realiza pre-procesado y devuelve imágen en escala de grises, tamaño 120x200
FotogRostro = ObtenerFotograma(cap)
#Detecta rostro (imagen, factor de escala, rostros vecinos, tamaño mínimo de rostro detectado)
RostroCoordenadas = Rostro_Haar.detectMultiScale(FotogRostro, 1.2, 1, minSize=(70, 70))
if len(RostroCoordenadas) != 0: # Si se detecta un rostro
ControlarLEDs(0, 0, 1, 0) # Enciende LED de la cámara indicando que se ha reconocido un rostro
Rostro_OK = 1
#x,y son coodenadas de esquina superior izquierda del cuadrado que encierra el rostro detectado
#w,h son longitudes en x,y (respectivamente) del cuadrado
x = RostroCoordenadas[0, 0]
y = RostroCoordenadas[0, 1]
w = RostroCoordenadas[0, 2]
h = RostroCoordenadas[0, 3]
#Si es el primer ciclo de detección, habilita zonas de velocidad con parámetros del
#primer rostro que detecta, para evitar comportamiento errático del puntero del ratón al
#iniciar la aplicación.
if PrimerCiclo == 1:
vCoordCentroX[:] = int(x + (w / 2)) # Durante el primer ciclo establece referencia en...
vCoordCentroY[:] = int(y + (h / 2)) # la posición actual del rostro
ZonasDeVelocidad = 1 # Activa captura de modelos de ojos y definición de zonas de velocidad
PrimerCiclo = 0
#Llama función que calcula centro del rostro.
vCoordCentroX, vCoordCentroY, CentroRostro = CalculaCentroRostro(x, y, w, h, vCoordCentroX, vCoordCentroY)
if ZonasDeVelocidad == 1: # Si está habilitada bandera de definición de zonas
#Llama función que captura modelos de ojo derecho cerrado e izquierdo cerrado
vOjoIzq_Modelo, vOjoDer_Modelo = CapturaModelosOjos(CentroRostro)
#Define tamaño (en porcentajes) de cada zona de velocidad
ZonaLenta = (w * 5 / 100) # % del ancho del rostro
ZonaRapida = (w * 11 / 100)
CentroRef = CentroRostro
ZonasDeVelocidad = 0
cv2.circle(FotogRostro, CentroRostro, 1, (255, 0, 0)) # Dibuja punto central sobre la imágen
#cv2.circle(FotogRostro, CentroRostro, w / 2, (255, 0, 0)) # Dibuja circulo encerrando el rostro
#Crea Region Of Interest (ROI) enfocada en cada ojo.
RoiOjo_Izquierdo = FotogRostro[CentroRostro[1] - 15:CentroRostro[1] + 15, CentroRostro[0]:CentroRostro[0] + 35]
RoiOjo_Derecho = FotogRostro[CentroRostro[1] - 15:CentroRostro[1] + 15, CentroRostro[0] - 35:CentroRostro[0]]
#Llama función que obtiene las integrales proyectivas horizontal y vertical (normalizadas). Interesa la vertical.
vOjoIzq_Hor, vOjoIzq_norm = ObtenerProyeccionesHV(RoiOjo_Izquierdo)
_, vOjoDer_norm = ObtenerProyeccionesHV(RoiOjo_Derecho)
#RoiOjos_Actual = cv2.adaptiveThreshold(RoiOjos_Actual, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 1)
#Crea Region Of Interest (ROI) enfocada en área de la boca
RoiBoca_Actual = FotogRostro[CentroRostro[1] + (w / 4):CentroRostro[1] + ((w / 8 * 7)), CentroRostro[0] - (w / 4):CentroRostro[0] +
(w / 4)]
RoiBoca_Actual = cv2.resize(RoiBoca_Actual, (40, 30), interpolation=cv2.INTER_LINEAR) # Redimensiona
#Llama función que obtiene las integrales proyectivas horizontal y vertical (normalizadas) de la boca
vBocaProyHorz_norm, vBocaProyVert_norm = ObtenerProyeccionesHV(RoiBoca_Actual)
#GraficaProyeccion(vBocaProyVert_norm, 1, 'Boca Norm')
#Llama función que compara integral proyectiva normalizada con el modelo
bBocaAbierta = ComparaConModelo(vBocaProyVert_Modelo, vBocaProyVert_norm, 6)
if bBocaAbierta == 1: # Si se confirma apertura de la boca (similar a la gesticulación de la letra 'a')...
iCiclos += 1 # se inicia conteo para detectar apertura de la boca por mas de 10 ciclos (aprox. 1 segundo)
else:
iCiclos = 0 # En caso contrario se mantiene contador en cero...
ControlarLEDs(0, 0, 0, 0) # y se apaga led de la cámara.
if iCiclos >= 10: # Si se confirma apertura prolongada de la boca...
print 'Boca abierta'
#Activa cálculo de centro de referencia, captura de modelos de ojos y definición de zonas de velocidad
PrimerCiclo = 1
iCiclos = 0
if BocaAbierta_Entrenamiento == 1:
#Si se oprime la tecla del número 1, llama función que toma proyecciones normalizadas H y V actuales...
#para la boca abierta y las almacena en archivos de texto
GrabaModeloBocaAbierta(vBocaProyHorz_norm, vBocaProyVert_norm)
#Llama a función para obtener modelos de las proyecciones H y V para la boca abierta...
#de acuerdo a datos de entrenamiento almacenados en archivo de texto.
vBocaProyHorz_Modelo = LeeModelo('ModeloBocaAbiertaHorz.txt', 40) # Esta integral proyectiva tiene 40 pixeles de tamaño
vBocaProyVert_Modelo = LeeModelo('ModeloBocaAbiertaVert.txt', 30) # Esta integral proyectiva tiene 30 pixeles de tamaño
BocaAbierta_Entrenamiento = 0
if Rostro_OK == 1:
#Si se ha detectado algún rostro
#Calcula desplazamiento X,Y
iDesplazamientoX = CentroRef[0] - CentroRostro[0]
iDesplazamientoY = CentroRef[1] - CentroRostro[1]
#Calcula el ángulo del desplazamiento de la cabeza (en grados) #print ("Ángulo (º)="), iAngulo
iAngulo = AnguloDesplazamiento(iDesplazamientoX, iDesplazamientoY)
#Calcula la velocidad a la que se moverá el ratón
iVelocidad = RatonVelocidad(iDesplazamientoX, iDesplazamientoY, ZonaLenta, ZonaRapida)
if iVelocidad[0] == 0:
bOjoIzq = ComparaConModelo(vOjoIzq_Modelo, vOjoIzq_norm, 4) # Compara proyecciones estableciendo rango de similitud en
4
bOjoDer = ComparaConModelo(vOjoDer_Modelo, vOjoDer_norm, 4)
if bOjoIzq == 1:
print "Ojo Izquierdo cerrado"
ControlarLEDs(1, 0, 0, 0)
if bOjoDer == 1:
print "Ojo Derecho cerrado"
ControlarLEDs(0, 1, 0, 0)
#Calcula componentes X,Y del movimiento del ratón
iEnviaXY = RatonMovimientoXY(iAngulo)
#Envía comando de velocidad a la tarjeta Teensy
bus.write_i2c_block_data(address, 0, [iVelocidad[0], iVelocidad[1]])
#Envía comando de movimiento a la tarjeta Teensy
bus.write_i2c_block_data(address, 1, [iEnviaXY[0], - iEnviaXY[1]])
#Envía comando de clic del ratón a la tarjeta Teensy
bus.write_i2c_block_data(address, 2, [bOjoIzq, bOjoDer])
ControlarLEDs(0, 0, 0, 0)
#Dibuja zonas de velocidad
cv2.circle(FotogRostro, CentroRef, ZonaLenta, (255, 0, 0))
cv2.circle(FotogRostro, CentroRef, ZonaRapida, (255, 0, 0))
Rostro_OK = 0 # Reinicia bandera testigo de rostro detectado
#Visualiza imagen. No requerido en modo consola.
#cv2.imshow('Rostro normalizado', FotogRostro)
#cv2.imshow('Zona de la boca', RoiBoca_Actual)
#cv2.imshow('Zona de los ojos', RoiOjo_Izquierdo)
#GraficaProyeccion(vOjoIzq_norm, 1, 'Ojo Mod')
#GraficaProyeccion(vOjoIzq_Hor, 0, 'Ojo Norm')
TiempoTotal = time.time() - TiempoInicial # Detiene cronómetro
print ("Tiempo transcurrido: %0.10f seg." % TiempoTotal)
k = cv2.waitKey(5) & 0xFF
if k == 32: # Si se oprime barra espaciadora cambia estado de la bandera para iniciar entrenamiento ojos y definición zonas de
velocidad
PrimerCiclo = 1
elif k == 48: # Si se oprime el cero cambia estado de la bandera de entrenamiento del modelo para boca abierta
BocaAbierta_Entrenamiento = 1
elif k == 27: # Detiene ejecución con tecla ESC
break
cap.release()
cv2.destroyAllWindows()
#-----------------------------------------------------------
Anexo B
Manual de Usuario
-
85
Dispositivo
Apuntador Mediante Visión
Artificial
Manual del Usuario
MD-001
2015 Versión 1
ADVERTENCIA
Para evitar incendios o el riesgo de
electrocución, no exponga la unidad a la lluvia
ni a la humedad.
Para reducir el riesgo de descarga eléctrica, no
quite la cubierta. El usuario no deberá dar
ningún tipo de servicio a ninguna parte
interna.
Deberá ser realizado solo por personal de
servicio calificado.
No instale el dispositivo cerca a fuentes de
calor.
ESPECIFICACIONES





Tensión de entrada
Corriente de entrada
Retardo
Cámara (integrada)
Velocidades
5 VDC
620 mA
60 ms (máximo)
640x480, 30 fps
0.3 y 1 cm/seg
Condiciones ambientales de funcionamiento
Margen de temperatura
Humedad relativa
5 °C a 40 °C
Máx. 80% (hasta 31°C)
Características mecánicas
Dimensiones
Peso
100 x 80 x 70 mm
(Soporte 120 mm de altura)
200 gr
MEDIDAS DE SEGURIDAD
1. Opere únicamente con una fuente de energía
de 5 Voltios DC a 1 Amp. Si no está seguro
sobre el suministro de energía, pregunte a su
compañía local de luz o electricidad.
2. Proteja y dirija los cordones de alimentación
de tal forma que no los pisen ni sean
oprimidos por algún mueble o artículo. Tenga
especial cuidado en los enchufes, receptáculos
convenientes o con los puntos de salida del
cordón del Dispositivo Apuntador. Los
cordones de energía deshilachados o dañados
son peligrosos. Haga que los reemplace un
técnico de servicio calificado.
Los tomacorrientes murales demasiado
cargados son peligrosos. Haga que los
reemplace un técnico de servicio calificado.
3. No cubra ni bloquee los orificios de
ventilación de la carcasa del Dispositivo
Apuntador. si lo hace puede ocasionar daño en
el Dispositivo Apuntador. u ocasionar un
incendio.
4. Evite el exceso de humedad, los cambios
repentinos de temperatura o temperaturas
extremosas. Se puede formar humedad en el
interior de su Dispositivo Apuntador.
5. Para evitar un daño o lesión costosa coloque
su Dispositivo Apuntador en el soporte
indicado para su uso; no coloque nada pesado
sobre la parte superior de ésta. Siga todas las
instrucciones con respecto a su uso.
OPERACIÓN /LIMPIEZA
1. Mantenga alejado su Dispositivo Apuntador
de lugares húmedos, como lavados,
fregadores, tubería de lavadoras y albercas.
2. Utilice
únicamente
los
accesorios
recomendados por el fabricante para evitar
incendio, electrochoque u otros peligros.
3. Si se ha expuesto su Dispositivo Apuntador. a
la lluvia, humedad o fuerte impacto,
desenchúfela y haga que la inspeccione un
técnico de servicio calificado antes de
reanudar su uso.
4. Desenchufe su Dispositivo Apuntador. antes
de limpiarla. Utilice un trapo húmedo para
limpiar. No utilice líquidos ni aerosoles de
limpieza que pudieran entrar a la unidad y
ocasionar daño., incendio
o
electrochoque.
Estas substancias podrían
dañar el acabado de su Dispositivo Apuntador.
5. Nunca abra ni quite las cubiertas ni haga los
ajustes no descritos en este manual. Si trata de
hacerlo, lo puede exponer a electrochoques
peligrosos o a otros peligros.
Podría ocasionar también un serio daño a su
Dispositivo Apuntador
6. Mantenga alejados los líquidos y objetos de su
Dispositivo Apuntador. Nunca opere su
Dispositivo Apuntador si le ha entrado líquido
o algún objeto extraño. Los cortos circuitos
eléctricos pueden presentarse y posiblemente
ocasionar
incendio
o
electrochoque.
Desconecte su Dispositivo Apuntador y haga
que la inspecciones un técnico calificado de
servicio.
COMPONENTES PRINCIPALES
Figura 1. Vista frontal.
Figura 2. Vista lateral.
Figura 3. Vista posterior.
Figura 4. Vista superior.
INICIO DISPOSITIVO
APUNTADOR
1. Ubique su dispositivo apuntador en la parte
superior de su pantalla preferiblemente
procure dejar el dispositivo en el centro de la
pantalla.
2. Conecte el cable USB al conector Micro USBA en el costado de su dispositivo apuntador
(Fig. 4) y el otro extremo a su equipo PC
(computador de escritorio o portátil).
3. Conecte
fuente
de
alimentación
al
tomacorriente de 110VAC y el plug de
alimentación de 5VDC al Dispositivo
Apuntador (Fig. 3).
4. Espere a que su dispositivo inicie
aproximadamente 1 min. Cuando esto suceda
se encenderán los 3 LEDs de las parte frontal
de su dispositivo por 1 segundo.
5. Automáticamente se inicia una rutina de
entrenamiento para los ojos. Esta rutina
generará los modelos de comparación para los
ojos.
6. Cuando el dispositivo detecte su rostro el LED
rojo (central) comenzara a parpadear repetidas
veces.
7. El dispositivo apuntador comenzará a mover
el cursor en la misma dirección que se mueve
el rostro, de la misma manera que funciona un
Joystick, esto es, en la zona central (de reposo)
no se genera movimiento. En esta zona
exclusivamente, es posible generar acciones
de selección cerrando el ojo izquierdo o el
derecho.
8. Pequeños movimientos alrededor de la zona
de reposo, generan movimientos lentos del
cursor. Así mismo, grandes desplazamientos,
generan una velocidad más alta en el cursor.
9. Cuando se mantiene la boca abierta por más
de 1 seg., el dispositivo inicia la rutina de
entrenamiento para los ojos.
CONFIGURACIÓN DISPOSITIVO
APUNTADOR
Para la configuración de las funciones de
selección de clic derecho e izquierdo siga los
siguientes pasos.
1. Abra la boca por un segundo, cuando la boca
sea detectada el LED rojo quedará encendido
por un tiempo de 1 segundos indicándole que
entro en el modo de configuración del
Dispositivo apuntador.
2. El Dispositivo apuntador encenderá los dos
led’s verdes de la parte superior del apuntador
esto representa los dos ojos abiertos.
3. Cuando el led verde derecho se apague y el
izquierdo siga encendido usted deberá cerrar
el ojo derecho.
4. Cuando el led verde izquierdo se apague y el
derecho siga encendido usted deberá cerrar el
ojo izquierdo
Nota: Para la configuración de los ojos
trate de hacer gestos exagerados.
SERVICIO
1. No intente dar servios Ud. Mismo a su
Dispositivo Apuntador desconéctelo. Y
póngase en contacto con un técnico
calificado de servicio.
2. Asegúrese de que el técnico de servicio
utilice
las partes autorizadas de
reemplazo o sus equivalentes. Las
partes
no
autorizadas
podrían
ocasionar electrochoque, incendio u
otros peligros.
3. Después de cualquier servicio o
reparación, asegúrese de que el técnico
de servicio lleve a cabo las
verificaciones de seguridad para
certificar
que
su
Dispositivo
Apuntador está en buen estado de
operación.
OTROS
1. El material audiovisual puede consistir
en trabajos protegidos por derechos de
autor que no deben ser copiados sin la
autorización del propietario de tales
derechos.
Consulte
las
leyes
pertinentes de su país.
2. Después de cualquier servicio o
reparación, asegúrese de que el técnico
de servicio lleve a cabo las
verificaciones de seguridad para
certificar
que
su
Dispositivo
Apuntador está en buen estado de
operación.
Anexo C
Poster para Sustentación
-
97
Anexo D
Presentación para Sustentación
-
99
Uso de la
Tecnología
Mejorar
Calidad De
vida
Personas con
discapacidad
en miembros
superiores
Acceso fácil
Internet
Redes
sociales
Trabajo
Objetivos Generales
• Obtener un dispositivo apuntador
que permita controlar el cursor del
computador
mediante
movimientos
de
la
cabeza,
utilizando técnicas de visión
artificial.
Objetivos Específicos
• Seleccionar la configuración de la plataforma
hardware/software más apropiada para
desarrollar el proyecto (tipo de tarjeta
principal, sistema operativo, tipo de cámara,
fuente de alimentación, interface de
comunicación, lenguaje de programación,
display).
• Desarrollar el software para la tarjeta principal,
el cual permita controlar el cursor del
computador y generar las acciones de selección
(clic).
• Integrar el software y todo el hardware que
compone el dispositivo apuntador.
• Generar un manual de usuario, donde se
expliquen las características del sistema y su
funcionamiento.
“The Camera Mouse: Visual Tracking of Body Features to Provide Computer
Access for People With Severe Disabilities..”
• Autor: Lupu, R.G. Bozomitu, R.G. ; Ungureanu, F. ; Cehan, V., Fac. of Autom.
• Control & Comput. Eng., Gh. Asachi Tech. Univ. of Iasi, Iasi, Romani; Año:
2011
Control de mouse para computador mediante potenciales eléctricos oculares
• Carolina Arboleda Clavijo; Eliana García Cossio; Marcela Palacio
• Ochoa. Programa de Ingeniería Biomédica, Líneas de Bioinstrumentación,
Señales e Imágenes; Ingeniería en Rehabilitación, Escuela de Ingeniera de
Antioquia; Año: 2007
Ratón USB para personas tetrapléjicas controlado con el movimiento de la
cabeza
• Autor: Danny Alexander Riaño Gómez; Omar Salazar Morales y José Jairo
• Soriano Méndez; Universidad Distrital Francisco Jose de Caldas; Año: 2014
Productos de apoyo
Plataformas disponible
• Se refiere a todo
producto,
instrumento, equipo o
tecnología adaptada o
diseñada
específicamente para
mejorar el
funcionamiento de
una persona con
discapacidad,
apoyando su inclusión
y respondiendo a sus
necesidades
particulares.
• Se compararon las
características
relevantes de cinco
tecnologías de
desarrollo que
fueron seleccionadas
como candidatas
para este proyecto,
gracias a sus
posibilidades de
desarrollo en visión
artificial.
• La Visión Artificial es
una disciplina
científica y
tecnológica que
modela e implementa
procesos propios de la
visión y constituye
una herramienta para
establecer la relación
entre el mundo
tridimensional y sus
vistas
bidimensionales.
Cuadro
Comparativo
Diagrama
Productos de
Apoyo
Visión Artificial
Arquitectura Hardware
Arquitectura Software
Fitts’ Law Software
Se llevaron a cabo tareas simples de
movimiento multidireccional del
cursor y selección de objetos.
Se realizaron
pruebas
iniciales con 4
personas (sin
condición de
discapacidad)
Tomando como base la norma ISO
9241-411 se planteó el método para
medir el rendimiento o Throughput
(TP) a tres dispositivos apuntadores
•
Se logró obtener un dispositivo apuntador, que permite controlar el cursor del computador
mediante movimientos de la cabeza utilizando clasificadores de uso libre (Filtros Haar en
Cascada) y algoritmos clasificadores adaptados a las necesidades de este proyecto (Integrales
Proyectivas ).
•
Se seleccionó una plataforma óptima de desarrollo compuesta por el microcomputador
Raspberry Pi 2, la tarjeta Teensy 3.1, una cámara Raspberry Pi NoIR, el lenguaje de
programación Python, las librerías OpenCV para visión artificial y se estableció el bus USB
como medio de comunicación con el computador (como dispositivo HID).
•
Se desarrolló una aplicación software para la tarjeta principal y un algoritmo de
funcionamiento para la tarjeta auxiliar.
•
Se realizó la integración del hardware y el software en un solo dispositivo que emula un ratón
con interface USB-HID.
•
Se realizó la validación del dispositivo obtenido, mediante un protocolo de pruebas
estandarizado.
Implementar el funcionamiento
alternativo, como teclado.
Generar la posibilidad de reconocimiento
de otros gestos faciales, los cuales
permitan generar acciones externas pero
relacionadas con el funcionamiento de un
computador.
Realizar el desarrollo sobre un sistema
operativo
que
aproveche
la
característica multi-procesador de la
Raspberry Pi 2 (actualmente en
versiones beta).
[1] M. Rafael Sánchez, Tic y discapacidad en américa latina y el caribe.
[2] I. A. Muñoz, M. A. L. Vicente, and P. R. Pollo, Datus: cómo obtener productos con alta
usabilidad?. g... (sid).
[3] T. Surdilovic, Fuzzy mouse cursor control system for computer users with spinal cord
injuries, Computer Science Theses, Aug 2006.
[4] G. G. Mateos, Procesamiento de caras humanas mediante integrales proyectivas .PhD
thesis, Universidad de Murcia, 2007.
[5] M. L. Guevara, J. D. Echeverry Correa, W. Ardila Urueña, et al., Detección de rostros en
imágenes digitales usando clasificadores en cascada, Scientia, 2008.
[6] J. F. V. Serrano, Visión por computador / j.f. Vélez serrano... [et al.].
[7]Parra Romero, M. A., y otros. (s. f.). Comparación de dispositivos de entrada no
convencionales en entornos virtuales. Universidad Nacional de Colombia.
Referencias
[1] M. Rafael Sanchez, Tic y discapacidad en américa latina y el caribe,
[2] I. A. Muï¾÷oz, M. A. L. Vicente, and P. R. Pollo, Datus:cómo obtener productos
con alta usabilidad?. g... (sid).
[3] D. A. N. de Estadistica(DANE), Departamento administrativo nacional de estadística (dane).
[4] Asociación Probienestar de la familia colombiana and Macro international,
bia Encuesta nacional de demografía y salud, 2010.
Colom-
[Bogotá] : Calverton (Md.),
US: Asociaciï¾÷n Probienestar de la Familia Colombiana, Profamilia ; ORC Macro
International, 2011.
Clasicacion Internacional del
Funcionamiento de la Discapacidad y de la Salud: Versión para la Infancia y Adolescencia. CIF-IA. World Health Organization, 2012.
[5] Organizaciï¾÷n Mundial de la Salud (ï¾÷ltimo),
[6] M. Betke, J. Gips, and P. Fleming, The Camera Mouse: visual tracking of body
features to provide computer access for people with severe disabilities,
IEEE Tran-
sactions on Neural Systems and Rehabilitation Engineering, vol. 10, pp. 110, Mar.
2002.
[7] R. Oï¾÷Grady, C. Cohen, G. Beach, and G. Moody,
NaviGaze: enabling access to
digital media for the profoundly disabled, p. 211ï¾÷216.
Oct 2004.
[8] T. Surdilovic, Fuzzy mouse cursor control system for computer users with spinal
cord injuries,
Computer Science Theses, Aug 2006.
Eye tracking based communication system for patient with major neoro-locomotor disabilites, p. 1ï¾÷5. Oct
[9] R. Lupu, R. Bozomitu, F. Ungureanu, and V. Cehan,
2011.
113
REFERENCIAS
[10] C. A. Clavijo, E. G. Cossio, and M. P. Ochoa, Control de mouse para computador
mediante potenciales elÉctricos oculares,
Revista Ingeniería Biomédica,
vol. 1,
p. 47ï¾÷51, Nov 2011.
[11] D. Gutiï¾÷rrez MuNoz, Diseño y construcción de un periferico indicador de posiciï¾÷n x-y, controlado por movimientos de la cabeza, Sep 2013.
[12] J. J. S. Mï¾÷ndez, D. A. R. Gï¾÷mez, and O. S. Morales, Ratón usb para personas
tetrapléjicas controlado con el movimiento de la cabeza,
Ingenierï¾÷a, vol. 19, Jul
2014.
Tetraplejia traumática tras fractura vertebral cervical: estudio comparativo de tratamiento conservador y quirúrgico. info:eu-
[13] n. Forner Cordero and n. Forner Cordero,
repo/semantics/doctoralThesis, Universidad Complutense de Madrid, Servicio de
Publicaciones, Madrid, Apr. 2011.
[14] Karla Strassburguer Lona, Yolanda Hernï¾÷ndez Porras, and Eva Barquï¾÷n Santos, Lesión medular: Guía para el manejo integral del paciente con LM crï¾÷nica.
[15] C. P. Henao-Lema and J. E. Pï¾÷rez-Parra, Lesiones medulares y discapacidad:
revisión bibliográca,
Aquichan, vol. 10, no. 2, pp. 157172, 2010.
[16] S. C. Kirshblum, S. P. Burns, F. Biering-Sorensen, W. Donovan, D. E. Graves,
A. Jha, M. Johansen, L. Jones, A. Krassioukov, M. Mulcahey, M. Schmidt-Read,
and W. Waring, International standards for neurological classication of spinal
cord injury (revised 2011),
The Journal of Spinal Cord Medicine, vol. 34, pp. 535
546, Nov. 2011.
[17] F. M. Maynard, M. B. Bracken, G. Creasey, J. Ditunno, W. H. Donovan, T. B.
et al., International
standards for neurological and functional classication of spinal cord injury, Spinal
cord, vol. 35, no. 5, pp. 266274, 1997.
Ducker, S. L. Garber, R. J. Marino, S. L. Stover, C. H. Tator,
[18] Z. M. d. F. Carvalho,
La lesiï¾÷n medular: manual de cuidados.
Valencia: Consejo
de Enfermerï¾÷a de la Comunidad Valenciana, 2010.
[19] Gabriel Carrasquilla Gutiï¾÷rrez, Solangel Garcï¾÷a, Marï¾÷a Luisa Latorre Castro, Sandra Martï¾÷nez Cabezas, Carlos Rincï¾÷n, Fundaciï¾÷n Sladarriaga Concha, and Fundaciï¾÷n Santa Fï¾÷ de Bogotï¾÷,
114
La discapacidad en el contexto del
REFERENCIAS
Sistema General de Seguridad Social en salud en Colombia: lineamientos, epidemiología e impacto económico. 2009.
[20] M. Archajo Jose and R. de Deus Lopes, Human-computer interface controlled by
the lip,
IEEE Journal of Biomedical and Health Informatics, vol. 19, pp. 302308,
Jan. 2015.
[21] Miguel Alejandro Parra Romero,
vencionales en entornos virtuales.
Comparación de dispositivos de entrada no conPhD thesis, Universidad Nacional de Colombia,
Bogotï¾÷, Colombia, 2012.
[22] A. G. Marcos and F. J. M. de Pisï¾÷n Ascacibar, TÉcnicas y algoritmos bÁsicos
de visiÓn articial.
[23] J. F. V. Serrano, Visión por computador / j.f. vélez serrano... [et al.].,
[24] D. Mery, Visiï¾÷n por computador, Aug 2004.
[25] L. Álvarez León, Matemáticas y visión por ordenador,
Proceedings of SCTM2003,
vol. 3, 2003.
[26] M. J. A. Triana, Detección de caras y análisis de expresiones faciales,
et al., Detección
rostros en imágenes digitales usando clasicadores en cascada, Scientia, 2008.
[27] M. L. Guevara, J. D. Echeverry Correa, W. Ardila Urueña,
de
[28] S. Brahmbhatt, Embedded Computer Vision: Running OpenCV Programs on the
Raspberry Pi, in
Practical OpenCV, pp. 201218, Apress, 2013.
Detección de partes de la cara para su aplicaciï¾÷n en problemas de
reconocimiento de personas. PhD thesis, Universitat Jaume I, Sep 2009.
[29] J. D. Vea,
[30] J. Howse,
OpenCV Computer Vision with Python.
[31] G. G. Mateos,
PACKT open Source, 2013.
Procesamiento de caras humanas mediante integrales proyectivas.
PhD thesis, Universidad de Murcia, 2007.
[32] Raspbian:https://www.raspbian.org/.
[33] Python: https://docs.python.org/2/faq/general.html.
[34] Numpy: http://www.numpy.org/.
115
REFERENCIAS
[35] Software de pruebas ttstasktwo.
[36] M. S. I. Scott MacKenzie, Tatu Kauppinen, Accuracy measures for evaluating
computer pointing devices,
116
Proceedings of CHI 2001, pp. 916, 2001.
Descargar