115

DISPOSITIVO APUNTADOR MEDIANTE VISIÓN …repository.udistrital.edu.co/bitstream/11349/7360/1... · Lista de Tablas 3.1. Comparación de ... El dispositivo se acopla al monitor del

  • Upload
    vunga

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

DISPOSITIVO APUNTADOR MEDIANTE VISIÓNARTIFICIAL, ADECUADO PARA USUARIOS DE

COMPUTADOR CON DISCAPACIDAD MOTORA ENMIEMBROS 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ÓNARTIFICIAL, ADECUADO PARA USUARIOS DE

COMPUTADOR CON DISCAPACIDAD MOTORA ENMIEMBROS 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

di�ciles.

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 in�nitamente 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 di�ciles 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 17

1.1. Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.2.0.1. Objetivo General . . . . . . . . . . . . . . . . . . . . . 17

1.2.0.2. Objetivos Especí�cos . . . . . . . . . . . . . . . . . . . 18

1.3. 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 25

3.1. 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. De�nición . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.1.3.2. Causas de la Tetraplejía . . . . . . . . . . . . . . . . . 28

3.1.3.3. Tipos de Tetraplejia . . . . . . . . . . . . . . . . . . . 29

3.2. Productos de Apoyo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2.1. Protocolos de Prueba . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2.2. ISO 9241-411:2012 . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.3. Plataformas Disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.4. Procesamiento de Imágenes . . . . . . . . . . . . . . . . . . . . . . . . 33

3.4.1. Relaciones Básicas Entre Píxeles . . . . . . . . . . . . . . . . . . 33

3.4.1.1. Vecinos de un Píxel . . . . . . . . . . . . . . . . . . . . 34

9

CONTENIDO

3.4.1.2. Medida de Distancia entre Pixels . . . . . . . . . . . . 34

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

3.4.3. Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.4.3.1. Ecualización del Histograma . . . . . . . . . . . . . . . 36

3.5. Visión Arti�cial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.5.1. Etapas En Un Proceso De Visión Arti�cial . . . . . . . . . . . . 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

3.6. Filtros y Clasi�cadores 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. De�niciones . . . . . . . . . . . . . . . . . . . . . . . 45

3.6.2.2. Normalización de Una Imagen Proyectiva . . . . . . . 46

3.7. 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 51

4.1. Selección de Tecnologías . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4.2. Dispositivo Apuntador . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.2.1. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.2.2. Software para Tarjeta Principal (Raspberry Pi2) . . . . . . . . . 54

4.2.3. Software para tarjeta auxiliar . . . . . . . . . . . . . . . . . . . 66

4.3. Metodología para pruebas funcionales . . . . . . . . . . . . . . . . . . . 66

4.3.1. Método . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

4.4. Ejecución Financiera . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

10

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

3.2. Estructura de la columna vertebral. Fuente: http://www.fondosmil.com/4-

safe/La-columna-vertebral.jpg . . . . . . . . . . . . . . . . . . . . . . . 28

3.3. Tipos de Iluminación a) Frontal b) Retroiluminación . . . . . . . . . . 35

3.4. imagen y su histograma donde se puede observar la gran cantidad de

puntos obscuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.5. Imagen y su histograma donde se puede observar un amplio rango de grises 37

3.6. Diagramas de Bloques de las etapas de un sistema de visión arti�cial . 39

3.7. Diagrama de bloques Clasi�cador Haar Cascade . . . . . . . . . . . . . 43

3.8. Imagen integral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.9. Filtros Haar rotados, trasladado y con cambios de escala. . . . . . . . . 44

3.10. Ejemplo de integral proyectiva horizontal y vertical de una imagen. Arri-

ba a la izquierda, la imagen de entrada, hormiga. A la derecha, la pro-

yección vertical, PV hormiga. Abajo, la proyección horizontal,PHhormiga. 46

3.11. Imágenes proyectivas de un rostro . . . . . . . . . . . . . . . . . . . . . 47

3.12. Normalización de señales en el valor. a) Integrales proyectivas de la �-

gura 3.12, normalizadas con la operación normalminmax. b) Las mismas

proyecciones normalizadas con normalmedvar. . . . . . . . . . . . . . . . 48

4.1. Arquitectura hardware del sistema apuntador . . . . . . . . . . . . . . 53

4.2. Diagrama de �ujo del algoritmo desarrollado para la tarjeta principal

(Raspberry) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.3. Regiones De Interés (ROI) de�nidas 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

4.6. Detección del desplazamiento. a) Rostro con marca central, b) Rostro en

posición de coincidencia de su Centro Actual con el Centro de Referencia,

c) Rostro desplazado con respecto al Centro de Referencia. . . . . . . . 64

4.7. Zonas de velocidad de�nidas para el cursor . . . . . . . . . . . . . . . . 65

4.8. Diagrama de �ujo del algoritmo desarrollado para la tarjeta auxiliar

(Teensy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

5.1. Grá�co del rendimiento del dispositivo apuntador en comparación con

dos dispositivos de uso común . . . . . . . . . . . . . . . . . . . . . . . 69

14

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 Arti�cial. 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 con�guració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 per-

mita controlar el cursor del computador mediante movimientos de la cabeza, utilizando

técnicas de visión arti�cial.

17

1. INTRODUCCIÓN

1.2.0.2. Objetivos Especí�cos

Seleccionar la con�guració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 progra-

mació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 Infor-

mació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 mani�esto 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 habi-

tantes) tienen di�cultades 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 modi�car uno o más de los otros elementos, siendo responsabili-

dad de la sociedad realizar las modi�caciones 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 pro-

ductos 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 con�guración del hardware y que el desempeño no se vea afectado por la velo-

cidad 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 Arti�cial, 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, desa-

rrollos 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 Compu-

ter 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 pro-

porcionar 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 pun-

tero 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 signi�cativo 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 reconocimien-

to 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 arti�cial, 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 Au-

tom. Control & Comput. Eng., Gh. Asachi Tech. Univ. of Iasi, Iasi, Romania

� Año: 2011

22

2.2 Proyectos académicos a nivel Nacional

� Descripción: desarrolla un sistema de comunicación inalámbrica para pacien-

tes con di�cultad 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 dibu-

jo alusivo; una cámara sujeta a unas gafas, capta la dirección de la mirada

del paciente para identi�car 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 cap-

tados por ampli�cadores 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, con-

trolado 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 micro-

controlador 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 dis-

pone 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 microcontro-

lador 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 miem-

bros. 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 recupe-

ració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, sen-

sitiva 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 clasi�car 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), clasi�cá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), co-

mo consecuencia de otra enfermedad (mielitis, poliomielitis, esclerosis en placas, hemo-

rragia 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, rami�cándose me-

diante 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 infor-

mació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/4-safe/La-columna-vertebral.jpg

3.1.3. Tetraplejia

3.1.3.1. De�nición

La American Spinal Injury Association (ASIA), de�ne 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, de�ne 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 clasi�cació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 in�amatorias 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 re�ere 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 disca-

pacidad [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, educa-

dores, profesionales de la salud y empleadores entre otros [19]. Por otra parte, la norma

UNE-EN ISO 9999 clasi�ca 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 o�ce work with visual display terminals (VDTs)�.

3.2.2. ISO 9241-411:2012

En 1954 el psicólogo Paul Fitts propuso un modelo (Ley de Fitts) para el tiempo que

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:

MT = a + b ∗ IDdonde MT es el tiempo que tarda el movimiento

ID es el índice de di�cultad

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 Di�cultad de la tarea (ID) se determina mediante la ecuación:

ID = log2(2DW

)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 di�cultad) se determina aplicando una

ligera variación a la propuesta de Fitts:

IDe = log2(DeWe

+ 1)

donde De es el promedio de la distancia entre puntos del movimiento

We es el ancho efectivo del punto �nal y se de�ne como:

We = 4,133 ∗ SDdonde SD es la desviación estándar de la distancia entre puntos del movimiento

El rendimiento del dispositivo o Throughput (TP) relaciona la di�cultad de la tarea

con el tiempo que toma realizarla [20]:

TP = IDMT

Esta ley resulta apropiada para evaluar y comparar cuantitativamente los dispo-

sitivos 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 arti�cial. 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 fun-

cionar 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 contro-

ladores 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 obtie-

ne 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 microcompu-

tadores 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 de�niciones de relaciones simples, pero muy importantes entre

los pixels de una imagen digital, que permiten comprender de mejor forma los métodos

de clasi�cació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) (3.1)

Este conjunto de pixels, que recibe el nombre de 4-vecinos de p se nota N4(p). Cada

píxel está a distancia unitaria de (x,y), y algunos de los vecinos de p caen fuera de la

imagen digital si (x,y) 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) (3.2)

y se notan ND(p) estos puntos, junto con los cuatro vecinos. se llaman 8 - vecinos

de p y se notan N8(p). Al igual que antes, algunos puntos de ND(p) y N8(p) caen fuera

de la imagen si (x,y) esta en el borde de la misma.[22]

3.4.1.2. Medida de Distancia entre Pixels

Para los pixels p,q y z de�nimos 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 p y q se de�ne como:

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 Arti�cial)

se pasa a estudiar los elementos correspondientes al entorno y la forma de situarlos. Un

entorno debidamente controlado es imprescindible para obtener unas buenas condiciones

34

3.4 Procesamiento de Imágenes

de partida, que aseguren una óptima adquisición. Dentro del entorno aparecen como

partes fundamentales que in�uyen 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 impor-

tancia 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 simpli�cando 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 re�ejos.

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 Arti�cial

La visión arti�cial es una disciplina cientí�ca y tecnológica que engloba todos los

procesos y elementos que proporciona �ojos� a una máquina mediante el modelado e

36

3.5 Visión Arti�cial

Figura 3.4: imagen y su histograma donde se puede observar la gran cantidad de puntosobscuros

[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 arti�cial incluyen no solo sus propiedades geométricas, sino también sus propie-

dades materiales. Ejemplos de propiedades geométricas son la forma, tamaño y loca-

lizació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 arti�cial está guiada precisamente a

simpli�car 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 Arti�cial

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 arti�cial.

38

3.5 Visión Arti�cial

Figura 3.6: Diagramas de Bloques de las etapas de un sistema de visión arti�cial[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 (clasi�cación).

La interpretación lleva a asignar signi�cado 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 arti�cial

(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 mani�esta en forma de ruido,

pérdida de de�nició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 pro-

pagació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

modi�car 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 signi�ca dividirla en zonas distinguibles e individua-

lizadas. 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 obje-

tos 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 de�na, de forma que simplemente

40

3.6 Filtros y Clasi�cadores 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 individuali-

zadas 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

simpli�car 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 obte-

ner parámetros que de�nan 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 de�nan 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 su�cientes. Tienen que delimitar de forma su�ciente la pertenencia de un

objeto a una clase determinada.

Dentro de los descriptores se de�nen tres categorías básicas: descriptores de frontera,

descriptores de región y de estructuras tridimensionales.[22]

3.6. Filtros y Clasi�cadores para Detección de Ros-

tros.

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 clasi�cadores 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

cual de ellas pertenecen [? ]. El conjunto de características discriminantes de un objeto

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 clasi�cador. 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 clasi�cador en cascada. Las características Haar están formadas por rectángulos

adyacentes de colores claro y oscuro en diferentes posiciones y con�guraciones, las cuales

son buscadas en toda la imagen y a diferentes escalas, para determinar la presencia de

características particulares (de�nidas 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 clasi�cadores AdaBoost, se genera un clasi�cador mas robusto y e�ciente [28] [29]

[30].

La metodología basada en el clasi�cador 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 Clasi�cadores para Detección de Rostros.

detección del rostro.

Figura 3.7: Diagrama de bloques Clasi�cador Haar Cascade[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 intensi-

dad 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′≤x,y≤y′Im(x',y') (3.4)

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 e�cientemente sobre la imagen integral,

son selectivos en la orientación espacial y frecuencia, y permiten ser modi�cados

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 codi�cació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]

Clasi�cació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 clasi�cación Boosting, el cual combina varios clasi�cadores

básicos para formar un único clasi�cador más complejo y preciso. Se basa en la idea

de que varios clasi�cadores sencillos, con una precisión ligeramente superior a una

clasi�cación aleatoria, pueden combinarse para formar un clasi�cador de mayor

precisión, siempre y cuando se disponga de un número su�ciente 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 Clasi�cadores 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. De�niciones

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 xi ∈ {0, ..., xmax} ,yi ∈{0, ..., ymax} ,∨i ∈{1, ...k} .Además, 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 i∈I1es unaseñal unidimensional, PVR :

PVR:dominioY (R)→ R

de�nida por:

PV 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 ∈ I1, denotada por PHR(X) :=i(x, y),∨(x, y) ∈ R[31]

45

3. MARCO TEÓRICO

de�nida por:

PHR(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. Arribaa la izquierda, la imagen de entrada, hormiga. A la derecha, la proyección vertical,PV hormiga. Abajo, la proyección horizontal,PHhormiga.

[31]

3.6.2.2. Normalización de Una Imagen Proyectiva

La normalización constituye un proceso de transformaciones en el conjunto de valo-

res 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 �gu-

ra 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 Clasi�cadores 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 diferen-

tes, 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ınOiεdominio(s)

{s(i)} (3.11)

max (s) := maxOiεdomini(s)

{s(i)} (3.12)

En la �gura 3.12.a) se muestran las mismas proyecciones de la �gura 3.11 normali-

zadas 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 normalminmax. b) Las mismas proyeccionesnormalizadas con 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)√

vas(s)(3.13)

La �gura 3.12.b) muestra un ejemplo de esta normalización en el valor, para las mis-

mas 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 hard-

ware 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 Arti�cial. 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 e�ciencia 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. Pre-

senta entre otras características:

Una poderosa capacidad de manipular objetos de matrices N-dimensional.

So�sticadas 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 e�ciente de datos genéricos o para de�nir 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

de�nieron 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 arti�cial, 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 implemen-

tació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 de�nidas

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

puesta 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 dis-

tribució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.

Plataforma hardware, basada en un microcomputador Raspberry Pi 21, disponible

comercialmente y compatible con versiones de sistemas operativos Linux y Win-

dows. 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 Rasp-

berry 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 desa-

rrollo 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 apuntadorFuente: Autores

La �gura 4.1 presenta la estructura hardware del dispositivo desarrollado. El proceso

de captura de la imágen, con una de�nició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, clasi�cació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 con�gura 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 super�cie 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 (Rasp-berry)

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,Rv1,0,R v1,1,R . . . v1,m,R...

.... . .

...vn,0,R vn,1,R . . . vn,m,R

v0,0,G v0,1,G . . . v0,m,Gv1,0,G v1,1,G . . . v1,m,G...

.... . .

...vn,0,G vn,1,G . . . vn,m,G

v0,0,B v0,1,B . . . v0,m,Bv1,0,B v1,1,B . . . v1,m,B...

.... . .

...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,639v1,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 proce-

samiento 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,319v1,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 de�nido 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,119v1,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 recono-

cimiento 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.CascadeClassi�er.detectMultiScale() y el clasi�cador '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 a�nado mediante un proceso heu-

rístico, los cuales permiten aumentar su e�ciencia en cuanto a tasa de reconocimiento,

velocidad o con�abilidad. Con los parámetros scaleFactor = 1:2, minNeighbors = 1 y

minSize = (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 ta-

mañ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 clasi�cador 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:

CentroRostro =1

a∑i=1

CoordCentroi (4.6)

Para mantener un equilibrio entre estabilidad de las coordenadas y el retardo en la

respuesta total del sistema, se estableció a = 5. La subrutina que se encarga de estos

cálculos, emplea las funciones numpy.roll() 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 clasi�cadores entrenados

para la detección de ojos abiertos, ojos cerrados y boca; estos clasi�cadores no presen-

taron 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 alea-

torios que di�cultan su tratamiento mediante retardos temporales o mediante cálculos

algebraicos, además, el uso de cada clasi�cador adiciona cerca de 0.04 seg. al tiempo de

ciclo total. Teniendo en cuenta que se requiere un clasi�cador para detectar ojos abier-

tos, 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

e�cientes para búsqueda y seguimiento, pero mas económicas en cuanto a carga compu-

tacional 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) de�nidas para la boca y los ojos.Fuente: Autores

El proceso de detección de la boca abierta se realiza utilizando Integrales Pro-

yectivas (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 de�niendo 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

ROI−Boca(i,j) =

vA,C vA,(C+1) . . . vA,D

v(A+1),C v(A+1),(C+1) . . . v(A+1),D...

.... . .

...vB,C vB,(C+1) . . . vB,D

(4.7)

Donde:A=(CentroRostro[1]+w/4), B=(CentroRostro[1]+w*7/8), C=(CentroRostro[0]-

w/4), 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:

ROI−BocaActual(i,j) =

v0,0 v0,1 . . . v0,39v1,0 v1,1 . . . v1,39...

.... . .

...v29,0 v29,1 . . . v29,39

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

IPV−BocaActual(j) =

v0,0 + v0,1 + . . . + v0,39v1,0 + v1,1 + . . . + v1,39...

......

.... . .

......

v29,0 + v29,1 + . . . + v29,39

÷ 39 =

vh0

vh1...

vh29

(4.9)

IPH−BocaActual(i) =

v0,0 v0,1 . . . v0,39+ + . . . +v1,0 v1,1 . . . v1,39+ + . . . +...

.... . .

...+ + . . . +

v29,0 v29,1 . . . v29,39

÷29 =

[vv0 vv1 . . . vv39

](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ágenesde 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 e�ciente

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 clasi�cación.

IPH−Bocanorm =IPH−Boca− IPH−Bocapromedio√

IPH−Bocavarianza(4.11)

IPV−Bocanorm =IPV−Boca− IPV−Bocapromedio√

IPV−Bocavarianza(4.12)

ModeloPMH−Boca =1

p∑i=1

IPH−Bocanormi(4.13)

ModeloPMV−Boca =1

p∑i=1

IPV−Bocanormi(4.14)

Los datos que forman las IPV y las IPH utilizadas para generar losModeloPMH_Boca

y ModeloPMV_Boca, se almacenan en los archivos ModeloBocaAbiertaHorz.txt y Mo-

deloBocaAbiertaVert.txt respectivamente. Lo anterior permite que estos modelos se car-

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

delo 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 de19 personas

Fuente: Autores

El entrenamiento de estos modelos solamente es posible mediante la conexión de

un teclado USB al dispositivo, para evitar modi�caciones 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 co-

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

Distancia(M − Pr) =1

L·L−1∑i=0

(M i − Pri)2 (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 − Pr) ≤ 5⇒ IPrsimilares ⇒ EntrenarModelosOjos (4.16)

Distancia(M − Pr) > 5⇒ IPrdiferentes ⇒ ContinuarEjecucionNormal (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 de�nieron 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 coordena-

das del centro del rostro, posteriormente redimensionadas a un tamaño �jo de 35x30

pixeles. Para realizar la clasi�cació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):

IPV−OjoIzquierdo(j) =

vh0

vh1...

vh29

(4.18)

IPH−OjoIzquierdo(i) =[vv0 vv1 . . . vv34

](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, di�cultando 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:

ModeloPMH−Ojo =1

5∑i=1

IPH−Ojonormi(4.20)

61

4. DESARROLLO

ModeloPMV−Ojo =1

5∑i=1

IPV−Ojonormi(4.21)

A diferencia de los modelos para la boca, los modelos para los ojos no se almace-

nan 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 clasi�cació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 − Pr) ≤ 4⇒ IPrsimilares ⇒ BotonIzquierdoPulsado (4.22)

DistOjoIzq(M − Pr) > 4⇒ IPrdiferentes ⇒ BotonIzquierdoLiberado (4.23)

DistOjoDer(M − Pr) ≤ 4⇒ IPrsimilares ⇒ BotonDerechoPulsado (4.24)

DistOjoDer(M − Pr) > 4⇒ IPrdiferentes ⇒ 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 de�ne el Centro de Referencia

y las Zonas de Velocidad.

62

4.2 Dispositivo Apuntador

El Centro de Referencia se re�ere 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 Centro de Referencia (dentro de los

círculos concéntricos de las Zonas de Velocidad) y su desplazamiento relativo.

La dirección del movimiento de la cabeza, guarda una relación directa con la direc-

ció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 Centro

Actual del rostro y el Centro de Referencia:

DesplazamientoRostro(x,y) = CentroReferencia(x1, y1)− CentroActual(x2, y2)

(4.26)

De esta manera obtenemos un desplazamiento a lo largo del eje X y un desplaza-

miento a lo largo del eje Y, cuyas componentes de�nen las componentes del movimiento

del cursor. Esta operación se realiza en cada ciclo de ejecución, para de�nir 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 =√

DesplazamientoRostroX2 + DesplazamientoRostroY 2

(4.27)

63

4. DESARROLLO

Figura 4.6: Detección del desplazamiento. a) Rostro con marca central, b) Rostro enposición de coincidencia de su Centro Actual con el Centro de Referencia, c) Rostrodesplazado con respecto al Centro de Referencia.

Fuente: Autores

La velocidad de desplazamiento del cursor, la determina el valor del desplazamiento

del rostro (distancia entre centros). Por esto, están de�nidas 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á ejem-

pli�cada 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 de�nir la velo-

cidad 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 cur-

sor 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 de�nidas para el cursorFuente: Autores

Una vez se ha de�nido la velocidad y la cantidad de desplazamiento en las com-

ponentes 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 apunta-

dores (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 parti-

cipantes 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 di�cultades 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 Arti�cial, 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: AutoresFuente: 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 expe-

riencia 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 dosdispositivos 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

tador desarrollado es inferior al que se obtiene utilizando el ratón óptico o el touchpad,

mas especí�camente, el ratón óptico tiene casi el doble de rendimiento y el touchpad

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

sitivos 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 disposi-

tivos 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 identi�car una necesidad en un grupo poblacional con disca-

pacidad 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 identi-

�cada y la templanza que brinda culminar un proyecto, salvando todas las di�cultades

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 clasi�cadores de uso

libre (Filtros Haar en Cascada) y algoritmos clasi�cadores adaptados a las nece-

sidades de este proyecto (Integrales Proyectivas).

Se seleccionó una plataforma óptima de desarrollo, compuesta por un micro-

computador 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 ar-

ti�cial 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 dis-

positivo, las cuales se encuentran fuera del alcance planteado inicialmente, pero cons-

tituyen 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 per-

mitan 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

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.

ADVERTENCIA

No instale el dispositivo cerca a fuentes de

calor.

ESPECIFICACIONES

Tensión de entrada 5 VDC

Corriente de entrada 620 mA

Retardo 60 ms (máximo)

Cámara (integrada) 640x480, 30 fps

Velocidades 0.3 y 1 cm/seg

Condiciones ambientales de funcionamiento

Margen de temperatura 5 °C a 40 °C

Humedad relativa Máx. 80% (hasta 31°C)

Características mecánicas

Dimensiones 100 x 80 x 70 mm

(Soporte 120 mm de altura)

Peso 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 USB-

A 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

Personas con discapacidad en miembros superiores

Uso de la Tecnología

Internet

Redes sociales

Trabajo

Acceso fácil

Mejorar Calidad De

vida

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

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

Plataformas disponible

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

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

Arquitectura Hardware

Arquitectura Software

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

Fitts’ Law Software

Se llevaron a cabo tareas simples de movimiento multidireccional del cursor y selección de objetos.

• 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 esta-

dística (dane).�

[4] Asociación Probienestar de la familia colombiana and Macro international, Colom-

bia Encuesta nacional de demografía y salud, 2010. [Bogotá] : Calverton (Md.),

US: Asociaciï¾÷n Probienestar de la Familia Colombiana, Profamilia ; ORC Macro

International, 2011.

[5] Organizaciï¾÷n Mundial de la Salud (ï¾÷ltimo), Clasi�cacion Internacional del

Funcionamiento de la Discapacidad y de la Salud: Versión para la Infancia y Ado-

lescencia. CIF-IA. World Health Organization, 2012.

[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. 1�10, 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.

[9] R. Lupu, R. Bozomitu, F. Ungureanu, and V. Cehan, Eye tracking based commu-

nication system for patient with major neoro-locomotor disabilites, p. 1ï¾÷5. Oct

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

ciï¾÷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.

[13] n. Forner Cordero and n. Forner Cordero, Tetraplejia traumática tras fractura verte-

bral cervical: estudio comparativo de tratamiento conservador y quirúrgico. info:eu-

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

tos, �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. 157�172, 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 classi�cation 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.

Ducker, S. L. Garber, R. J. Marino, S. L. Stover, C. H. Tator, et al., �International

standards for neurological and functional classi�cation of spinal cord injury,� Spinal

cord, vol. 35, no. 5, pp. 266�274, 1997.

[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 Cas-

tro, Sandra Martï¾÷nez Cabezas, Carlos Rincï¾÷n, Fundaciï¾÷n Sladarriaga Con-

cha, and Fundaciï¾÷n Santa Fï¾÷ de Bogotï¾÷, La discapacidad en el contexto del

114

REFERENCIAS

Sistema General de Seguridad Social en salud en Colombia: lineamientos, epide-

miologí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. 302�308,

Jan. 2015.

[21] Miguel Alejandro Parra Romero, Comparación de dispositivos de entrada no con-

vencionales en entornos virtuales. PhD 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 arti�cial.�

[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,�

[27] M. L. Guevara, J. D. Echeverry Correa, W. Ardila Urueña, et al., �Detección de

rostros en imágenes digitales usando clasi�cadores en cascada,� Scientia, 2008.

[28] S. Brahmbhatt, �Embedded Computer Vision: Running OpenCV Programs on the

Raspberry Pi,� in Practical OpenCV, pp. 201�218, Apress, 2013.

[29] J. D. Vea, Detección de partes de la cara para su aplicaciï¾÷n en problemas de

reconocimiento de personas. PhD thesis, Universitat Jaume I, Sep 2009.

[30] J. Howse, OpenCV Computer Vision with Python. PACKT open Source, 2013.

[31] G. G. Mateos, 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,� Proceedings of CHI 2001, pp. 9�16, 2001.

116