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