UNIVERSIDAD TECNOLÓGICA EQUINOCCIAL FACULTAD DE CIENCIAS DE LA INGENIERÍA CARRERA DE INGENIERÍA MECATRÓNICA RECONOCIMIENTO DE MOVIMIENTOS DEL CUERPO HUMANO BASADO EN TECNOLOGÍA KINECT TRABAJO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERA MECATRÓNICA EVELIN ESTEFANÍA PÉREZ MONTENEGRO DIRECTOR: ING. MARCELA PARRA MGT. Quito, Marzo 2014 © Universidad Tecnológica Equinoccial. 2013 Reservados todos los derechos de reproducción DECLARACIÓN Yo, Evelin Estefanía Pérez Montenegro, declaro que el trabajo aquí descrito es de mi autoría; que no ha sido previamente presentado para ningún grado o calificación profesional; y, que he consultado las referencias bibliográficas que se incluyen en este documento. La Universidad Tecnológica Equinoccial puede hacer uso de los derechos correspondientes a este trabajo, según lo establecido por la Ley de Propiedad Intelectual, por su Reglamento y por la normativa institucional vigente. _____________________ Evelin Pérez 1723059349 CERTIFICACIÓN Certifico que el presente trabajo que lleva por título “Reconstrucción tridimensional de movimientos de personas basada en tecnología Kinect.”, que, para aspirar al título de Ingeniera Mecatrónica fue desarrollado por Evelin Pérez, bajo mi dirección y supervisión, en la Facultad de Ciencias de la Ingeniería; y cumple con las condiciones requeridas por el reglamento de Trabajos de Titulación artículos 18 y 25. ___________________ Ing. Marcela Parra, Mgt DIRECTOR DEL TRABAJO C.I. 1803107596 DEDICATORIA A mi familia por creer en mí, y apoyarme de diferentes maneras a que logre uno de los objetivos de mi vida. Mami te mereces todas las dedicatorias de este trabajo. Mis enanas por ser mi fuerza todos los días. Nanu por darme la manito. Andrés para ti por no dejarme desistir y apoyarme, ahora formas parte de mi familia. Si no fuera por ustedes no habría motivación… ÍNDICE DE CONTENIDOS RESUMEN .................................................................................................... vii ABSTRACT .................................................................................................. viii OBJETIVOS ........................................................................................................ 8 1.1. OBJETIVO GENERAL........................................................................... 8 1.1.1. 2.1. OBJETIVOS ESPECÍFICOS. ............................................................. 8 ANTECEDENTES INVESTIGATIVOS ......................................................10 2.1.1. LA HISTORIA DE LA CREACIÓN DEL KINECT ..............................10 2.1.2. THE MINORITY REPORT .................................................................11 2.1.3. EL PROYECTO SECRETO DE MICROSOFT ...................................11 2.2. FUNDAMENTACIÓN LEGAL ..................................................................14 2.3. VISIÓN ARTIFICIAL.................................................................................14 2.3.1. GENERALIDADES ...........................................................................14 2.3.2. FORMACIÓN Y PROCESAMIENTO .................................................15 2.3.3. ILUMINACIÓN...................................................................................17 2.3.4. DISPOSITIVOS COMERCIALES QUE SE USAN PARA LA ILUMINACIÓN. ................................................................................................17 2.4. KINECT ....................................................................................................20 2.4.1. CÁMARA DE COLOR .......................................................................22 2.4.2. SENSORES DE PROFUNDIDAD......................................................23 2.4.3. MOTOR DE INCLINACIÓN ...............................................................23 2.4.4. MATRIZ DE MICRÓFONO ................................................................24 2.4.5. LED (DIODO EMISOR DE LUZ) .......................................................25 2.5. SDK PARA KINECT.................................................................................25 2.5.1. 2.6. ARQUITECTURA ..............................................................................25 DATA STREAMS .....................................................................................26 2.6.1. COLOR STREAMS ...........................................................................26 2.6.2. AUDIO STREAMS ............................................................................27 2.7. DATOS DE PROFUNDIDAD ....................................................................27 2.8. LENGUAJE DE PROGRAMACIÓN .........................................................27 3.1. ENFOQUE................................................................................................28 i 3.2. MODALIDAD BÁSICA DE INVESTIGACIÓN ..........................................30 3.3. OPERACIONALIZACIÓN DE LAS VARIABLES .....................................30 3.3.1. SELECCIÓN DEL SENSOR ÓPTICO ...............................................30 3.3.2. SELECCIÓN DEL LENGUAJE DE PROGRAMACIÓN .....................31 4.1. RED KINECT............................................................................................36 4.2. CONOCIENDO PROCESSING ................................................................37 4.3. INSTALANDO PROCESSING .................................................................37 4.3.1. DESCRIPCIÓN DE LA VENTANA ....................................................39 4.3.2. PRIMER PROGRAMA DE FAMILIARIZACIÓN ................................40 4.3.2.1. 4.3.3. VARIABLES ..................................................................................40 ESTRUCTURA DE UN SKETCH DE PROCESSING ........................41 4.3.3.1. SETUP () FUNCIÓN ......................................................................41 4.3.3.2. DRAW () FUNCIÓN .......................................................................42 4.3.4. LIBRERÍAS DE PROCESSING .........................................................42 4.3.5. ACCESANDO AL MAPA DE PROFUNDIDAD E IMAGEN RGB ......44 4.4. CONSTRUCCIÓN DEL ESQUELETO......................................................46 4.5. ANÁLISIS DEL TIEMPO DE RESPUESTA..............................................58 5.1. CONCLUSIONES .....................................................................................60 5.2. RECOMENDACIONES ............................................................................61 Bibliografía ................................................................................................... 63 ANEXOS……………………………………………………………………………… 1. KINECT PARA WINDOWS SDK, Y EL TRABAJO EN CONJUNTO TOOLKIT ............................................................................................................66 2. KINECT PARA WINDOWS DEVELOPER TOOLKIT ..................................66 3. LO QUE KINECT PARA WINDOWS VE......................................................67 4. LO QUE KINECT PARA WINDOWS OYE ...................................................69 ii ÍNDICE DE FIGURAS Figura 1.1 Esqueleto generado por el Kinect. ......................................... 1 Figura 1.2 Posiciones del brazo ............................................................. 2 Figura 1.3 Posiciones que modifican la puntuación del brazo ................ 3 Figura 1.4 Diagrama de Causa y Efecto, basada en la entrevista al Gerente de Ocupamed ............................................................................ 5 Figura 1.5 Terapia de rehabilitación con el Kinect.................................. 7 Figura 1.6 Rehabilitación para esclerosis con Kinect. ............................ 7 Figura 2.1 Escena de Minory Report ..................................................... 10 Figura 2.2 Visión Artificial ..................................................................... 14 Figura 2.3 Componentes de un sistema de visión artificial.................... 16 Figura 2.4 Tipos de iluminación............................................................. 17 Figura 2.5 Iluminación por fibra óptica .................................................. 18 Figura 2.6 Tubos fluorescentes ............................................................. 19 Figura 2.7 Iluminación Led .................................................................... 19 Figura 2.8 Iluminación láser .................................................................. 20 Figura 2.9 Componentes del Kinect. ..................................................... 21 Figura 2.10 Ángulos de limitación. ........................................................ 22 Figura 2.11 Cómo se ve la profundidad total de detección ................... 23 Figura 2.12 Engranajes que permiten la inclinación ............................. 24 Figura 2.13 Matriz de micrófono. ........................................................... 24 Figura 2.14 Arquitectura SDK................................................................ 26 Figura 3.1 Proceso para realizar el proyecto. ........................................ 28 Figura 3.2 Adquisición del Kinect entre febrero y marzo del 2013 alrededor del mundo ............................................................................. 29 Figura 4.1 Red Kinect ............................................................................ 36 Figura 4.2 Página de descarga del Processing ..................................... 37 Figura 4.3 Opciones para la descarga .................................................. 38 Figura 4.4 Ventana del Processing. ...................................................... 38 Figura 4.5 Descripción de la ventana .................................................... 39 Figura 4.6 Pasos para importar librería ................................................. 43 Figura 4.7 Selección de librerías ........................................................... 43 iii Figura 4.8 Toma de imagen verificando flujo de datos entre el Kinect y Processing usuario 1. ............................................................................ 45 Figura 4.9 Toma de imagen verificando flujo de datos entre el Kinect y Processing usuario 2. ............................................................................ 45 Figura 4.10 Esqueleto usuario 1............................................................ 51 Figura 4.11 Usuario 1 y 2, a 0.50 m ...................................................... 52 Figura 4.12 Usuario 1 y 2, a 1m de distancia. ....................................... 52 Figura 4.13 Usuario 1 y 2, a 2m de distancia. ....................................... 53 Figura 4.14 Usuario levantando ambas manos. .................................... 54 Figura 4.15 Usuario levantando mano derecha..................................... 55 Figura 4.16 Usuario levantando mano izquierda ................................... 55 Figura 4.17 Usuario levantando pierna derecha.................................... 56 Figura 4.18 Usuario levantando pierna izquierda .................................. 56 Figura 4.19 Interfaz ............................................................................... 57 Figura 4.20 Diagrama de flujo del programa ......................................... 57 Figura 4.21 Tiempos de respuesta ........................................................ 58 Figura 4.22 Tiempos de respuesta ........................................................ 58 Figura 4.23 Tiempos de respuesta ........................................................ 59 iv ÍNDICE DE TABLAS Tabla 3.1 Kinect vs Otros sensores, ángulo de visión. .......................... 30 Tabla 3.2 Comparación de profundidad. ............................................... 31 Tabla 3.3 Ventajas y desventajas de los sensores. ............................... 31 Tabla 3.4 Comparación de comandos de color entre Processing y Java. .............................................................................................................. 32 Tabla 3.5 Comparación de comandas de forma entre Processing y Java .............................................................................................................. 32 Tabla 3.6 Comparación de comandos de datos entre Processing y Java .............................................................................................................. 32 Tabla 3.7 Comparación de comandos de control entre Processing y Java .............................................................................................................. 33 Tabla 3.8 Comparación de estructura entre Processing y Java ............ 33 Tabla 3.9 Comparación de comados de salida entre Processing y Java .............................................................................................................. 34 Tabla 4.1 Librerías para Kinect ............................................................. 42 Tabla 4.2 Comparación de movimientos entre usuario y esqueleto. ..... 54 v ÍNDICE DE ANEXOS ANEXOS .......................................................................................................... 1. KINECT PARA WINDOWS SDK, Y EL TRABAJO EN CONJUNTO TOOLKIT .................................................................................................. 66 2. KINECT PARA WINDOWS DEVELOPER TOOLKIT ........................ 66 3. LO QUE KINECT PARA WINDOWS VE ........................................... 67 Figura A1 Rangos de profundidad en modo cerca ................................ 67 Figura A2 Rangos de profundidad en modo predeterminado. ............... 67 Figura A3 Ángulo de visión (profundidad y RGB) .................................. 68 Figura A4 Reconocimiento de esqueletos ............................................. 68 Figura A5 Esqueleto completo .............................................................. 68 Figura A6 Esqueleto en modo cercano ................................................. 69 4. LO QUE KINECT PARA WINDOWS OYE ........................................ 69 Figura A7 Detección de audio ............................................................... 69 Figura A8 Grados de sonido.................................................................. 70 Figura A9 Decibeles ............................................................................. 70 Figura A10 Profundidad......................................................................... 71 Figura A11 Kinect Fusion Explorer ........................................................ 71 Figura A12 Infrarrojo ............................................................................. 72 Figura A13 Escáner Tridimensional ...................................................... 72 Figura A14 Seguimiento del esqueleto .................................................. 73 Figura A15 Seguimiento del esqueleto .................................................. 73 Figura A16 Imitación de movimientos faciales. ..................................... 74 Figura A17 Cara en 3D.......................................................................... 74 CÓDIGO ................................................................................................ 75 vi RESUMEN El presente trabajo “Reconocimiento de Movimientos del Cuerpo Humano Basada en Tecnología Kinect” mostró el desarrollo de un software utilizando el accesorio Kinect del Xbox, que en un principio estaba enfocado al entretenimiento y a la nueva generación de los videojuegos, pero gracias a que Microsoft liberó la programación del mismo; a nivel mundial el uso del Kinect está desarrollando aplicaciones en casi todos los ámbitos, como en videojuegos educativos y culturales de simulación, multimedia mediante realidad aumentada, cine en 3D, últimamente en aplicaciones móviles (celulares, tablets) y médicas (plataformas de rehabilitación, herramientas de diagnóstico, de tratamiento, de comunicación médico-paciente).Lo que se quiere lograr es abrir una línea de investigación en una tecnología de fácil acceso e implementarla en el campo de la salud, el uso del Kinect está teniendo grandes impactos. Mediante esta primera fase de la investigación se obtuvo la representación de un esqueleto que se realiza movimientos en tiempo real del usuario, se utilizó el lenguaje de programación del Processing, porque es fácil su concatenación con el Arduino para trabajos futuros, además de que las librerías que posee están enfocadas al escáner en 3D, que era lo que se necesitaba para este proyecto. vii ABSTRACT This project "Recognition of Movements of the Human Body Based Technology Kinect " showed the development of software using the accessory Kinect Xbox, which at first was focused on entertainment and the new generation of video games, but thanks to Microsoft released programming thereof; worldwide use of Kinect is developing applications in almost all areas, and cultural and educational simulation video games , multimedia by augmented reality 3D cinema , mobile applications lately ( phones, tablets) and medical ( rehabilitation platforms , diagnostic tools, treatment , doctor-patient communication .) what you want to do is to open a line of research in an easily accessible technology and deploy to the field of health, the use of Kinect is having major impacts . Through this first phase of research representing a skeleton movements in real time user , the programming language Processing was used was obtained , because it is easier to concatenation with Arduino for future work , in addition to the libraries having are focused on 3D scanner , which was what was needed for this project . viii 1. INTRODUCCIÓN La tecnología siempre ha luchado para poder igualar lo increíblemente sofisticado que es el cuerpo humano. Se quiere llegar a la representación de un esqueleto que haga los movimientos en tiempo real, mediante el uso del Kinect y el uso de software libre, la plataforma SDK de Microsoft. Kinect tiene la capacidad de detectar automáticamente los esqueletos, con solo quedándose con todo el cuerpo en frente del sensor. Figura 1.1 Esqueleto generado por el Kinect. (Jana, 2012) 1 Se partirá desde el análisis de la ergonomía, que es el conjunto de conocimientos que adapta las situaciones, herramientas y el ambiente en el que se trabaja de una manera armónica, para evitar lesiones de trabajo. En conjunto con la medicina ocupacional, que es el conjunto de actividades asociado a disciplinas variadas, cuyo objetivo es la promoción y mantenimiento del más alto grado posible de bienestar físico, mental y social de los trabajadores de todas las profesiones promoviendo la adaptación del trabajo al hombre y del hombre a su trabajo (Coppée, 1998) En la medicina ocupacional específicamente en la ergonomía, se utilizan diferentes métodos de análisis para poder establecer el riesgo ergonómico en el momento que está desarrollando una actividad laboral, pero que no envían los resultados de manera tridimensional; se trabaja con fotos y videos lo que deriva en una medición empírica, por ejemplo si el trabajador hace un movimiento en un ángulo no adecuado, se lo toma de forma aproximada. A continuación las gráficas de medidas tentativas usadas para determinar grados de peligro en los miembros superiores del cuerpo Figuras 1.2 y 1.3; posturas repetitividad de movimiento, fuerzas aplicadas en el método RULA (Rapid Upper Limb Assessment) a los que los empleos se exponen: Figura 1.2 Posiciones del brazo. (Diego-Más & Cuesta) 2 Figura 1.3 Posiciones que modifican la puntuación del brazo.(Diego-Más & Cuesta) A nivel de Latinoamérica el uso del Kinect se está enfocando a la reconstrucción del movimiento debido a su bajo costo, hay trabajos en los que se ha obtenido incluso medidas en desplazamiento en tiempo real. En el artículo publicado por R. Mogollán-Toral, O. R. Díaz-Márquez, A. Aceves-López, “Imitación de movimientos humanos en un robot humanoide Bioloid mediante Kinect”, presenta una forma alternativa de programar movimientos en un robot humanoide mediante la imitación en tiempo real de los movimientos de un humano utilizando el sensor Kinect de Microsoft. (R. Mogollán-Toral, 2013) Otro publicado “Cómo el Kinect inspiró una era de innovaciones científicas” se denota que el Kinect ha sido un catalizador de ideas en diversas aplicaciones incluyendo un sable de luz y un basurero en el cual nunca se fallará, y por supuesto la aplicación médica Un grupo de investigadores de la 3 Universidad de Southampton en el Reino Unido, por ejemplo, están utilizando esta tecnología para ayudar a los pacientes a recuperarse después de un accidente cerebrovascular. (Knight, 2012) En nuestro país la reconstrucción del cuerpo humano así como del movimiento, con tecnología Kinect apenas está empezando; son pocos los trabajos de los que se tiene registro. En el diagrama de causa y efecto Figura 1.4, basado en la entrevista con el Dr. Alfredo Rojas Gerente de Ocupamed, se llegó a determinar algunos de los problemas que se podrían presentar durante la elaboración del proyecto. - Recursos, en cuanto a textos, artículos o libros que hablen de la reconstrucción del movimiento del cuerpo en 3D. - Captura de movimiento en tiempo real, existen programas que realizan captura de movimiento con retardo, por lo tanto existe una brecha entre el tiempo real y lo captado. - Técnicas, la programación que se utiliza en la actualidad es un tanto complicada. - Observación, se realiza mediante fotos y videos, lo que la hace ser manual, mediante horas determinadas. - Adaptación de métodos, los existentes son empíricos se basan en la observación y sus resultados son tomados empíricamente. Es necesario llegar a la reconstrucción del cuerpo humano en 3D porque significa un ahorro de tiempo y esfuerzo, solo el hecho de imaginar que tan solo con pararse frente a una cámara refleje en cuestión de segundos y en tiempo real las diferentes partes del cuerpo, por tal motivo la presente se enfoca en realizar una línea que permita seguir con el estudio avance de este tipo de tecnología de fácil acceso y con posibles grandes logros, el no utilizar este tipo de tecnología es un retraso además de que se dejaría de lado la oportunidad de ser un desarrollador de nuevas tecnologías. 4 RECURSOS CAPTURA DE MOVIMIENTO EN TÉCNICAS TIEMPO REAL Poca cantidad de Brecha entre el textos, artículos tiempo Real y lo captado por la Uso de materiales costosos Programación, complicada cámara RECONSTRUCCIÓN DE MOVIMIENTOS DEL CUERPO, ENFOCADO A LA ERGONOMÍA La cual tiene que realizarse por un Repetitivos y que se lapso determinado realizan de tiempo, muchas manualmente, por veces mediante ejemplo RULA video (Rapid OBSERVACIÓN ADAPTACIÓN DE UpperLimbAssessme MÉTODOS Figura 1.4 Diagrama de Causa y Efecto, basada en la entrevista al Gerente de Ocupamed. (Pérez, 2013) 5 5 Los sistemas de análisis de movimiento permiten la recolección de información para ilustrar y analizar la dinámica del movimiento, al estudiar las características de los miembros del cuerpo y las articulaciones. Los resultados obtenidos de estos análisis, ofrecen al personal del área de la salud una herramienta de apoyo diagnóstico, para contar con información que les permite realizar una evaluación objetiva por ejemplo de patologías ortopédicas, recomendar un tratamiento específico, evaluar la evolución de una terapia, así como también aplicarlo en otros ámbitos como el análisis de diferentes gestos deportivos, entre otras múltiples aplicaciones. (Christian Andrés Diaz, 2009) El proyecto se basa en el uso del dispositivo Kinect como interfaz para la interacción entre el usuario y la pc. Kinect es un dispositivo, inicialmente pensado como un simple controlador de juego, que gracias a los componentes que lo integran: sensor de profundidad, cámara RGB, array de micrófonos y sensor de infrarrojos (emisor y receptor), permite a los usuarios controlar e interactuar con la consola sin necesidad de tener contacto físico con un controlador de videojuegos; es capaz de capturar el esqueleto humano, reconocerlo y posicionarlo en el plano. Gracias a toda la información que captura este dispositivo, los desarrolladores de software pueden hacer uso de él para programar toda una serie de aplicativos cuyo activo principal es la interacción con los elementos virtuales a través de los distintos movimientos del cuerpo humano. En el campo de la salud las aplicaciones son múltiples como: En niños con autismo y síndrome de Down se está usando para realizar enfoques educativos y terapéuticos, el objetivo de este proyecto es contribuir al aprendizaje y restauración de habilidades básicas para los niños. En USA se está vinculando el Kinect con el Pentágono mediante un software que puede ser utilizado por soldados heridos y veteranos para realizar terapia física en casa sin la necesidad de visitar un centro médico; con esto se brida el anonimato a los usuarios. En personas con Alzheimer se está implementando para mejorar su calidad de vida, responden con más 6 facilidad a las actividades propuestas por el terapeuta y se mantienen totalmente activos durante la sesión. La terapia basada en Kinect ofrecería varias ventajas una de ellas sería la comodidad del tratamiento en el hogar y por tanto reducir costos de mantenimiento de las instalaciones médicas Figura 1.5 Terapia de rehabilitación con el Kinect. (Taringa, 2010) Figura 1.6 Rehabilitación para esclerosis con Kinect. (Taringa, 2010) 7 Ya que el software de este dispositivo es libre las aplicaciones son infinitas. Lo que se quiere lograr es abrir un campo de investigación de una tecnología de fácil acceso e implementar en el campo de la salud, el uso del Kinect está teniendo grandes impactos como en la rehabilitación motora. El sistema está basado en el uso de interfaces naturales y de técnicas de realidad virtual para facilitar la monitorización del paciente durante el transcurso de una sesión de rehabilitación; otra aplicación es para su uso en quirófanos. (Ana, 2011) Esta herramienta permitirá a los cirujanos acceder a través de movimientos con la mano a la historia clínica informatizada del paciente o pruebas complementarias que se le hayan realizado al paciente y hayan sido trasladadas a la historia clínica computarizada, sin necesidad de tocar ningún objeto no aséptico, con lo que se disminuye el riesgo de infección. Si se lleva a cabo el desarrollo de este proyecto, los resultados serían de suma ayuda al campo de la salud, enfocado a la ergonomía en medicina ocupacional significaría competitividad con softwares que existen pero sus costos de compra son realmente elevados. Además que el tiempo de adquisición de datos sería reducido considerablemente, los datos obtenidos serían exactos y no empíricos. Las posiciones de los empleados se obtenidos serían en tiempo real y se obtendría inmediatamente el riesgo al que se someten durante sus actividades. Actualmente se toman los datos en un promedio de ocho horas, sin duda en una aplicación para medicina ocupacional se disminuirán los tiempos de obtención de los mismos. OBJETIVOS 1.1. OBJETIVO GENERAL. - Reproducir movimientos de una persona a través de tecnología Kinect 1.1.1. OBJETIVOS ESPECÍFICOS. - Diseñar una red Kinect para el desarrollo del escáner. 8 - Implementar la interfaz de comunicación entre el Kinect y el PC. - Realizar el protocolo de pruebas y validación 9 2. MARCO REFERENCIAL El presente capítulo comprende la base teórica que será la guía, ya que permite reunir, depurar y explicar los diferentes conceptos y teorías sobre el tema a desarrollar. Aquí se da a la investigación un sistema coordinado de conceptos y proposiciones que permiten abordar el problema. De éste dependerá el resultado. Se parte desde una puesta de ciencia ficción en la que se basa prácticamente el desarrollo del Kinect. 2.1. ANTECEDENTES INVESTIGATIVOS 2.1.1. LA HISTORIA DE LA CREACIÓN DEL KINECT Comienza mucho antes de que el dispositivo en sí fuera concebido. Kinect tiene sus raíces en décadas de pensar y soñar acerca de las interfaces de usuario basadas en el gesto y la voz. La película de 2002 golpeó “The Minority Report” añadió leña al fuego con su pintura futurista de una interfaz de usuario espacial. La rivalidad entre las consolas de juegos que compiten trajo la tecnología de Kinect en nuestras salas de estar. Figura 2.1. Figura 2.1 Escena de Minory Report. (Robinson, 2009) 10 2.1.2. THE MINORITY REPORT Mucho se ha escrito acerca de la influencia evidente de la Minority Report en el desarrollo de Kinect. Una de las respuestas más peculiares de la película era la opinión del crítico de cine Roger Ebert de que ofreció una "vista previa optimista" sobre el futuro. The Minority Report , basada libremente en un cuento de Philip K. Dick , describe un futuro en el que la vigilancia policial es generalizado hasta el punto de predecir los crímenes antes de que ocurran y encarcelar a aquellos que aún no lo hayan cometido los delitos. Se incluye la comercialización masiva generalizada en la que las exploraciones de retina se utilizan en lugares públicos para orientar anuncios a los peatones basados en datos demográficos recogidos en ellos y se almacena en la nube. Resultados de la experimentación genética en plantas carnívoras monstruosamente, arañas robots que deambulan por las calles, un mercado negro floreciente en las partes del cuerpo que permite a la gente a cambiar sus identidades. Tal vez lo que Ebert formuló era un futuro creíble, extrapolado de nuestro mundo, en el que mediante la tecnología cambiaría la realidad del mismo. 2.1.3. EL PROYECTO SECRETO DE MICROSOFT En el mundo de los video juegos, Nintendo lanzó en conferencia la consola Wii y el guante, en el Tokyo Game Show 2005. La consola fue acompañada por un nuevo dispositivo de juego llamado el mando de Wii. El mando de Wii puede detectar el movimiento en tres ejes. Además, contiene un sensor óptico que detecta dónde se está apuntando. También es alimentado por batería, eliminando los cables largos para la consola común a otras plataformas. Después del lanzamiento de la Wii en 2006, Peter Moore, el entonces jefe de la división Xbox de Microsoft, exigió que comenzara la creación de un asesino competitivo para la consola Wii. 11 Fue también en esta época que Alex Kipman, jefe de un equipo de incubación dentro de la división de Xbox, se reunió con los fundadores de PrimeSense en la Electronic Entertainment Expo 2006. Microsoft ha creado dos equipos que compiten para llegar al deseado asesino de la consola Wii: uno que trabaja con la tecnología PrimeSense y la otra que trabajan con tecnología desarrollada por una compañía llamada 3DV. A pesar de la idea principal de los equipos era lanzar una muestra de lo que tenían en la Electronic Entertainment Expo 2007 no había nada concreto hasta ese entonces. Peter Moore anuncia que iba trabajar para Electronic Arts en el mismo año, lo que retrasa aún más. Tras la salida de Moore, Don Matrick tomó las riendas, dirigiendo el equipo de Xbox. En 2008, revivió el proyecto de reconocimiento de vídeo secreto en torno a la tecnología de PrimeSense. Si bien la tecnología de 3DV parecer nunca llegó a la final de Kinect, Microsoft compró la compañía en 2009 por $ 35 millones. Al parecer, esto se hizo con el fin de defenderse de posibles disputas de patentes alrededor de Kinect. Alex Kipman, gerente de Microsoft desde el año 2001, se hizo director general de Incubación y puesto a cargo de la creación del nuevo dispositivo de Project Natal para incluir el reconocimiento de la profundidad, el seguimiento de movimiento, reconocimiento facial y reconocimiento de voz. NOTA: ¿Qué hay del nombre? El nombre en clave «Proyecto Natal» responde a la tradición de Microsoft de utilizar ciudades como nombres a sus grandes proyectos. Alex Kipman, director de Microsoft, quien incubó el proyecto, decidió ponerle el nombre en honor a su ciudad natal en Brasil.(Miller, 2010) El dispositivo de referencia creado por PrimeSense incluye una cámara RGB (red, green, blue), un sensor de infrarrojos, y una fuente de luz infrarroja. La licencia PrimeSense diseña el chip PS1080 el cual procesa datos de profundidad a 30 fotogramas por segundo. Es importante destacar, que procesa los datos de profundidad de una manera innovadora lo que redujo 12 drásticamente el precio del reconocimiento de la profundidad en comparación con el método predominante en la época llamado "Tiempo de vuelo ", una técnica que controla el tiempo que tarda un rayo de luz para salir y luego regresar al sensor. La solución fue de PrimeSense para proyectar un patrón de puntos de infrarrojos a través de la habitación y utilizar el tamaño y el espaciamiento entre los puntos para formar un mapa de profundidad de 320X240pixeles analizado por el chip PS1080.El chip también alinea automáticamente la información para la cámara RGB y la cámara de infrarrojos. Microsoft añadió un conjunto de micrófonos de cuatro piezas de esta estructura básica, proporcionando efectivamente un micrófono de dirección para el reconocimiento de voz que sería eficaz en una gran sala. Microsoft ya ha tenido años de experiencia con el reconocimiento de voz, que ha estado disponible en los sistemas operativos desde Windows XP. KudoTsunade, recientemente contratado fuera de Electronic Arts, también se ha presentado en el proyecto, llevando su propio equipo de incubación, para crear prototipos de juegos para el nuevo dispositivo. Él y Kipman tenía una fecha límite, el 18 de agosto de 2008, para mostrar a un grupo de ejecutivos de Microsoft, lo que podría hacer Project Natal. El equipo de Tsunade llegó con 70 prototipos, algunos de los cuales fueron mostrados a los ejecutivos. El proyecto recibió luz verde y empezó el verdadero trabajo. Se les dio una fecha de lanzamiento de Project Natal: Navidad de 2010. (Jarrett Webb, 2012) Desde su lanzamiento el potencial del Kinect fue comprendido por ingenieros, músicos, médicos, investigadores, por lo que se está trabajando en diversas aplicaciones. 13 2.2. FUNDAMENTACIÓN LEGAL En nuestro país no existe ninguna norma o reglamento que indique como realizar el desarrollo de proyectos utilizando tecnología Kinect. Las licencias usadas en el proyecto son libres, es decir que no tienen ningún costo adicional y lo único que se hizo es descargarse el link de las páginas necesarias; para el Kinect de la página oficial de Microsoft y para el lenguaje de programación de la página del Processing. 2.3. VISIÓN ARTIFICIAL 2.3.1. GENERALIDADES La Visión Artificial es una gran herramienta para establecer la relación entre el mundo tridimensional y sus vistas bidimensionales tomadas de él. Por medio de esta teoría se puede hacer, por una parte, una reconstrucción del espacio tridimensional a partir de sus vistas y, por otra parte, llevar a cabo una simulación de una proyección de una escena tridimensional en la posición deseada a un plano bidimensional. (Mery, 2002) Figura 2.2 Visión Artificial (Mery, 2002) 14 La visión artificial la componen un conjunto de procesos destinados a realizar el análisis de imágenes. Estos procesos son: captación de imágenes, memorización de la información, procesado e interpretación de los resultados. (Etitudela, 2010) Con la visión artificial se pueden: - Automatizar tareas repetitivas de inspección realizadas por operadores. - Realizar controles de calidad de productos que no era posible verificar por métodos tradicionales. - Realizar inspecciones de objetos sin contacto físico. - Realizar la inspección del 100% de la producción (calidad total) a gran velocidad. - Reducir el tiempo de ciclo en procesos automatizados. - Realizar inspecciones en procesos donde existe diversidad de piezas con cambios frecuentes de producción. (Etitudela, 2010) 2.3.2. FORMACIÓN Y PROCESAMIENTO Los dos pilares del sistema físico de visión artificial son: el sistema de formación de las imágenes y el sistema de procesamiento de éstas. En el primer apartado estaría constituido por el subsistema de iluminación, de captación de la imagen y de adquisición de la señal en el computador. Una vez introducida la señal en el computador, ésta es procesada mediante los algoritmos para transformarla en información de alto nivel. La cual puede ser utilizada para su representación visual, para actuar en el planificador de un robot o ser fuente de datos para un autómata programable. En definitiva, múltiples periféricos pueden ser receptores de esta información y vincularse con el sistema de procesamiento de las imágenes.(Dueñas, 2009) - Subsistema de iluminación: conjunto de artefactos que producen radiación electromagnética para que incidan sobre los objetos a visualizar. Se puede citar algunos elementos como lámparas, pantallas fotográficas, filtros de luz, láseres. 15 - Subsistema de captación: son los transductores que convierten la radiación reflejada luminosa en señales eléctricas. Fundamentalmente se habla de las cámaras CCD, no sólo en el espectro visible, sino que van desde la radiación gamma hasta la radiofrecuencia o microondas, dando paso a sensores de ultrasonidos, sonar, radar, telescopía. - Subsistema de adquisición: la señal eléctrica procedente de las cámaras forman la señal de vídeo. Hay una tendencia creciente a que su naturaleza sea de tipo digital, pero todavía existen muchas señales de vídeo de carácter analógico (CCIR, PAL, RS170, NTSC). Para ser tratadas hay que muestrearlas y cuantificarlas. Ambas tareas son realizadas por las tarjetas de adquisición. También se las llama frame grabbers. Se depositan en el bus de expansión del computador. Hay para buses desde PCI hasta VMP. Recientemente, también se están empleando las tecnologías de USB o Fire Wire. - Subsistema de procesamiento: Suele ser un computador o un cluster de computadores, dependiendo de las necesidades de los algoritmos de Visión Artificial. Parten de una representación digital de las imágenes y procesan esta información hasta alcanzar otro tipo de información de más alto nivel. La transformación dependerá de la algoritmia. - Subsistemas de periféricos: conjunto de elementos receptores de la información de alto nivel. Puede ser un monitor de altas prestaciones gráficas, un automatismo, una impresora sacando las características. (Dueñas, 2009) Figura 2.3 Componentes de un sistema de visión artificial (dspace.ups.edu.ec) 16 2.3.3. ILUMINACIÓN La iluminación es una parte fundamental en la visión artificial, las condiciones de la misma, sean estables o inestables repercutirán directamente en la imagen. Se usan los siguientes tipos de iluminación: - Frontal (difusa o direccional), que es la que enfatiza características en superficies planas. - Retroiluminación, es la que obtiene directamente una imagen en blanco y negro, apropiada para obtener siluetas. - Estructurada, apropiada para medir distorsiones en patrones y obtener las características superficiales de un objeto en 3D. (dspace.ups.edu.ec) Figura 2.4 Tipos de iluminación(dspace.ups.edu.ec) 2.3.4. DISPOSITIVOS COMERCIALES QUE SE USAN PARA LA ILUMINACIÓN. Fibra óptica, Fluorescentes, LED y Láser. Cada uno de ellos tiene sus ventajas y desventajas con respecto a los otros. Y dependiendo del tipo de aplicación deberá utilizarse uno u otro. Hay cuatro factores que condiciona el tipo de iluminación, que son: Intensidad lumínica, duración, flexibilidad de diseños y precio. Los sistemas de iluminación para aplicaciones industriales pueden emitir luz de forma continua o de forma pulsada (estroboscópica). (iaci.unq.edu.ar, 2010) 17 - Fibra Óptica, es actualmente, la que puede proporcionar la luz más intensa de todos los tipos de iluminación que se utilizan en visión artificial. La idea básica es conducir la luz procedente de una bombilla halógena, o de xenón, que se encuentra en un fuente de iluminación, a través de un haz de fibras ópticas que termina en un adaptador específico para cada tipo de aplicación. Estos adaptadores pueden tener forma circular, lineal, puntual o de panel, y puede ser de distintos tamaños y dimensiones. (iaci.unq.edu.ar, 2010) Figura 2.5 Iluminación por fibra óptica (all-reefs.com, 2007) - Fluorescente, los tubos fluorescentes se usan en muchas ocasiones en aplicaciones de visión artificial, aunque debido a su limitada variedad de formas, también es limitada su utilización. Las fuentes de alimentación que proporcionan electricidad a los fluorescentes pueden venir equipados con fotodiodos, que permiten controlar y regular automáticamente la estabilidad de la luz en todo momento, de forma que cuando la intensidad de la luz del fluorescente disminuye la fuente hace que aumente la potencia hasta devolver la intensidad anterior. La vida media de los tubos fluorescentes es algo superior a las 10000 horas. Figura 2.6. (iaci.unq.edu.ar, 2010) 18 Figura 2.6 Tubos fluorescentes(haciendofotos.com, 2008) - LED, Para aplicaciones donde no se requiera una gran intensidad de iluminación se puede utilizar la iluminación por LED (Light Emiting Diodes). Los LED proporcionan una intensidad de iluminación relativa a un coste muy interesante, y además tienen una larga vida, aproximadamente 100.000 horas. Otra consideración a tener en cuenta es que sólo requieren un cable de alimentación y no un haz de fibra óptica que en ocasiones es muy delicado. (iaci.unq.edu.ar, 2010) Figura 2.7 Iluminación Led (laoficina20.com, 2012) - Láser, La iluminación mediante láser o luz estructurada se utiliza normalmente para resaltar o determinar la tercera dimensión de un objeto. El método utilizado es colocar la fuente de luz láser en un ángulo conocido con respecto al objeto a iluminar y con respecto a la cámara. Viendo la distorsión de la luz puede interpretarse la profundidad de los 19 objetos a medir. La luz estructurada se utiliza en muchas aplicaciones para obtener la percepción de profundidad y para inspecciones en 3D. Para hacerse una idea, se genera una línea de luz y se visualiza de forma oblicua. Las distorsiones en la línea se traducen en variaciones de altura. Y de aquí se puede desprender los cambios de profundidad o altura de un objeto. Por tanto se puede también determinar la falta o exceso de material, o bien se puede llegar a hacer una reconstrucción en tres dimensiones del objeto. (iaci.unq.edu.ar, 2010) Figura 2.8 Iluminación láser (es.madeinasia.com, 2011) 2.4. KINECT El sensor de Kinect es una barra horizontal de aproximadamente 23 cm (9 pulgadas) conectada a una pequeña base circular con un eje de articulación de rótula, y está diseñado para ser colocado longitudinalmente por encima o por debajo de la pantalla de vídeo.El dispositivo cuenta con una cámara RGB, un sensor de profundidad, un micrófono de múltiples matrices y un procesador personalizado que ejecuta el software patentado, que proporciona captura de movimiento de todo el cuerpoen 3D, reconocimiento facial y capacidades de reconocimiento de voz. El micrófono de matrices del sensor de Kinect permite a la Xbox 360 llevar a cabo la localización de la fuente acústica y la supresión del ruido ambiente, permitiendo participar en el chat de Xbox Live sin utilizar auriculares. 20 El sensor contiene un mecanismo de inclinación motorizado, el sensor de profundidad es un proyector de infrarrojos combinado con un sensor CMOS monocromo que permite a Kinect ver la habitación en 3D en cualquier condición de luz ambiental. El rango de detección de la profundidad del sensor es ajustable gracias al software de Kinect capaz de calibrar automáticamente el sensor. (GD, 2010) El sensor Kinect incluye los siguientes componentes clave: - Cámara de color. - Infrarrojos (IR) emisor. - Sensores de profundidad IR. - Motor de Inclinación. - Matriz de micrófono. - LED. Además de los componentes mencionados anteriormente, el dispositivo Kinect también cuenta con un adaptador de corriente para la fuente de alimentación externa y un adaptador USB para conectar con un ordenador. La siguiente figura muestra los diferentes componentes de un sensor Kinect: Figura 2.9 Componentes del Kinect. (Pérez, 2013) 21 2.4.1. CÁMARA DE COLOR Esta cámara de color es responsable de la captura y transmisión de los datos de vídeo de color. Su función es detectar los colores rojo, azul, y verde de la fuente. La corriente de datos devueltos por la cámara es una sucesión de cuadros de imágenes fijas. La corriente de color Kinect es compatible con una velocidad de 30 fotogramas por segundo (fps) a una resolución de 640 x 480 píxeles y una resolución máxima de 1280 x 960 píxeles. El valor de fotogramas por segundo puede variar dependiendo de la resolución utilizada para el cuadro de imagen. (Jana, 2012) Figura 2.10 Ángulos de limitación. (Pérez, 2013) Tiene algunas limitaciones, pero funciona bien bajo los siguientes rangos (todos a partir del centro de la Kinect): - Ángulo de visión horizontal: 57 ° - Ángulo de visión vertical: 43 ° - Distancia del usuario para obtener mejores resultados: 1,2 m (hasta 0,4 m en modo cercano) a 4m (hasta 3 m en el modo cercano) - Rango de profundidad: 400 mm (en el modo de cerca) a 8000 mm (en modo estándar) 22 - Temperatura: 5 a 35 grados centígrados (41 a 95 grados Fahrenheit) 2.4.2. SENSORES DE PROFUNDIDAD Los sensores de profundidad consisten en un emisor de infrarrojos y un sensor de profundidad. Ambos trabajan juntos para hacer que las cosas sucedan. El emisor de infrarrojos puede parecer una cámara desde el exterior, pero es un proyector de infrarrojos que emite constantemente la luz infrarroja en un patrón "pseudo-aleatorios" delante de él. Estos puntos son normalmente invisibles para nosotros, pero es posible capturar su información utilizando un sensor de profundidad. Figura 2.11. Figura 2.11 Cómo se ve la profundidad total de detección (Jana, 2012) 2.4.3. MOTOR DE INCLINACIÓN La base y la parte del cuerpo del sensor están conectadas por un pequeño motor. Se utiliza para cambiar los ángulos de la cámara y del sensor, para obtener la posición correcta del esqueleto humano dentro de la habitación. 23 La figura 2.12 muestra el motor junto con tres engranajes que permiten que el sensor se incline en un determinado rango de ángulos: Figura 2.12 Engranajes que permiten la inclinación (Jana, 2012) El motor se puede inclinar verticalmente hasta 27 grados, lo que significa que los ángulos del sensor Kinect se pueden desplazar hacia arriba o hacia abajo por 27 grados. 2.4.4. MATRIZ DE MICRÓFONO El dispositivo Kinect exhibe un gran apoyo para el audio con la ayuda de un conjunto de micrófonos. Consta de cuatro micrófonos diferentes que se colocan en un orden lineal (tres de ellas se extienden en el lado derecho y la otra se coloca en el lado izquierdo). (Jana, 2012) Figura 2.13 Matriz de micrófono. (Jana, 2012) El propósito de la matriz de micrófono no es sólo dejar que el dispositivo Kinect capture el sonido, también sirve para localizar la dirección de la onda 24 de audio. Las principales ventajas de tener una matriz de micrófonos sobre un solo micrófono son que la captura y el reconocimiento de la voz se hacen de manera más eficaz con la supresión mejorada de ruido, cancelación de eco, y la tecnología de formación de haz. Esto permite al Kinect ser un micrófono altamente bidireccional que puede identificar la fuente del sonido y reconocer la voz independientemente del ruido y el eco presente en el entorno 2.4.5. LED (DIODO EMISOR DE LUZ) Un LED se coloca entre la cámara y el proyector de infrarrojos. Se utiliza para indicar el estado del dispositivo Kinect. El color verde del LED indica que los controladores de dispositivo Kinect han cargado correctamente. Si usted está conectando Kinect en una computadora, el LED comenzará con una luz verde una vez que su sistema detecta el dispositivo. (Jana, 2012) 2.5. SDK PARA KINECT Microsoft Windows como propietarios y en respuesta a la necesidad de la nueva tecnología del Kinect libera el software de funcionamiento para PC llamado SDK, que es el conjunto de librerías que permite programar en una variedad de aplicaciones. 2.5.1. ARQUITECTURA Interface natural de usuario, NUI API (Natural User Interface), controla propiedades del Kinect ya que es el centro de funcionamiento, como interfaz de programación de las aplicaciones. Figura 2.14. 25 Figura 2.14 Arquitectura SDK. (msdn.microsoft.com, 2011) 2.6. DATA STREAMS El Kinect accede a los flujos de datos de vídeo (de color) y profundidad de las imágenes, así como el seguimiento de esqueleto. Se dividen en: 2.6.1. COLOR STREAMS Está disponible en diferentes resoluciones y formatos. El formato determina si el flujo de datos de imágenes en color se codifica como RGB, YUV, o Bayer. - RGB, 32 bits formato lineal. - YUV, 16 bits formato lineal con corrección de gama, almacena más información pues utiliza menos memoria gracias a sus 16 bits. - BAYER, 32 bits formato lineal es el formato que más se acerca a la visión humana. 26 2.6.2. AUDIO STREAMS Gracias al array de la matriz de audio se elimina el ruido ambiental, y se ubica el objeto. 2.7. DATOS DE PROFUNDIDAD Los datos de profundidad es la distancia, en milímetros, al objeto más cercano en ese particular (x, y) de coordenadas en el campo del sensor de profundidad de vista. (msdn.microsoft.com, 2011) El flujo de datos de profundidad se fusiona dos tipos separados de datos: - Los datos de profundidad, en milímetros. - Datos de segmentación del jugador. Cada valor de la segmentación es un número entero que indica el índice de un jugador único detectado en la escena. (msdn.microsoft.com, 2011) 2.8. LENGUAJE DE PROGRAMACIÓN El lenguaje de programación es el conjunto de reglas sintácticas y semánticas, y símbolos que definen su estructura y el significado de sus elementos; diseñado para expresar procesos que pueden ser realizados por máquinas en específico computadoras. 27 3. METODOLOGÍA El proceso utilizado se describe en el siguiente diagrama: PLANTEAMIENTO DEL PROBLEMA REVISIÓN DE LA BIBLIOGRAFÍA HARDWARE SOFTWARE INTEGRACIÓN DEL HARDWARE Y SOFTWARE IMPLEMENTACIÓN DEL SOFTWARE PRUEBAS DEL SISTEMA Y MODIFICACIÓN Figura 3.1 Proceso para realizar el proyecto. (Pérez, 2013) 3.1. ENFOQUE El enfoque utilizado en este proyecto de investigación es el enfoque predominante cuantitativo. La documentación existente en la universidad relacionada con este tema es inexistente, por lo que las referencias están basadas en estudios fuera de la misma. 28 Figura 3.2 Adquisición del Kinect entre febrero y marzo del 2013 alrededor del mundo. (uk.socialnumbers.com, 2013) Como se ve en las tablas la adquisición del Kinect se dio exponencialmente, ya que el hecho de Microsoft haya liberado el software hizo que los programadores, en todos los niveles entraran al increíble mundo y posibilidades del Kinect. 29 3.2. MODALIDAD BÁSICA DE INVESTIGACIÓN Debido a que la línea de investigación del Kinect es nueva en Ecuador, aún no existe documentación científica sustentable, es por esto que se plantea la modalidad básica de la investigación experimental, mediante la cual se obtendrá datos reales que quedarán sentados para futuros proyectos. 3.3. OPERACIONALIZACIÓN DE LAS VARIABLES 3.3.1. SELECCIÓN DEL SENSOR ÓPTICO Comparación de sensores basada en ángulo de visión, profundidad e imágenes en 3D: Ángulo de visión.- Es el punto de vista desde el que se observa a la acción, permite la sensación de perspectiva, así como la sensación de grandeza o pequeñez de los personajes u objetos. Tabla 3.1 Kinect vs Otros sensores, ángulo de visión. ÁNGULO DE VISION Cámara Simple Stereopair Multiple Camera Rigs Sensor Kinect 70˚-90˚ <180˚ 60˚ HORIZONTAL:57 ° VERTICAL: 43 ° (Pérez, 2013) En la tabla anterior observamos que en ángulo de visión en el Kinect es mucho más versátil y va en sentido horizontal y vertical. Profundidad/ imágenes en 3D.- La profundidad es la distancia de un elemento con respecto a un plano horizontal, cuando dicho elemento se encuentra por debajo de la referencia. Capacidad del sistema visual para apreciar los objetos en relieve y distinguir sus componentes tridimensionales, distancia y ubicación.(Wikipedia, 2014) 30 Tabla 3.2 Comparación de profundidad. Cámara Simple PROFUNDIDAD / IMÁGENES EN 3D NO DISPONIBLE Stereopair DISPONIBLE Multiple Camera Rigs DISPONIBLE Sensor Kinect DISPONIBLE EN RGB (Pérez, 2013) La profundidad en el Kinect es evidentemente superior, por el hecho de estar disponible en RGB. Tabla 3.3 Ventajas y desventajas de los sensores. VENTAJAS / DESVENTAJAS Cámara Simple Stereopair Multiple Camera Rigs Sensor Kinect NO EXISTE PROCESAMIENTO PARA IMÁGENES EN PROFUNDIDAD EXISTE UN COMPLEJO PROCESAMIENTO COMPUTACIONAL PARA OBTENER IMÁGENES EN PROFUNDIDAD EXISTE UN COMPLEJO PROCESAMIENTO COMPUTACIONAL PARA OBTENER IMÁGENES EN PROFUNDIDAD EXISTE UN PROCESAMIENTO SIMPLE PARA OBTENER INFORMACION DE LA PROFUNDIDAD (Pérez, 2013) Kinect tiene todas las cosas que necesitamos la imagen de profundidad 3D, amplio campo de visión similar y ofrece también cálculo simple para la información de la imagen de profundidad. Es por ello que se elige sensor Kinect para este proyecto, además de que es dispositivo de bajo costo y tienen otras características especiales, como el seguimiento de esqueleto, la cara y el reconocimiento de voz. La tabla muestra la comparación del sistema de visión que se ha utilizado. 3.3.2. SELECCIÓN DEL LENGUAJE DE PROGRAMACIÓN Ya que el Kinect es de software libre es necesario definir, cuál es el más conveniente. 31 La comparación es entre Processing y Java. Tabla 3.4 Comparación de comandos de color entre Processing y Java. Color Processing background(0); background(255); background(255, 204, 0); stroke(255); stroke(0); stroke(255, 204, 0); fill(0, 102, 153); Java g.setColor(Color.black) fillRect(0, 0, size.width, size.height); g.setColor(Color.white) fillRect(0, 0, size.width, size.height); g.setColor(new Color(255, 204, 0)); fillRect(0, 0, size.width, size.height); g.setColor(Color.white) g.setColor(Color.black) g.setColor(new Color(255, 204, 0)); g.setColor(new Color(0, 102, 153)); (wiki.processing.org, 2010) Se observa que las líneas de código para determinar el color en Processing son mucho más cortas. Tabla 3.5 Comparación de comandas de forma entre Processing y Java Forma Processing Java point(30, 20); g.drawLine(30, 20, 30, 20); line(0, 20, 80, 20); g.drawLine(30, 20, 80, 20); rect(10, 20, 30, 30); g.fillRect(10, 20, 30, 30); g.drawRect(10, 20, 30, 30); (wiki.processing.org, 2010) Para dibujar una forma como línea, punto o recta son simples en Processing. Tabla 3.6 Comparación de comandos de datos entre Processing y Java Datos Processing int x = 70; // Initialize x = 30; // Change value float x = 70.0; x = 30.0; int[] a = {5, 10, 11}; a[0] = 12; // Reassign Java int x = 70; // Initialize x = 30; // Change value float x = 70.0f; x = 30.0f; int[] a = {5, 10, 11}; a[0] = 12; // Reassign (wiki.processing.org, 2010) 32 En lo que tiene que ver con los datos ya que Processing está basado en Java las líneas de código son similares. Tabla 3.7 Comparación de comandos de control entre Processing y Java Control Processing voiddraw() { // Statements } for (int a=45; a<=55; a++) { // Statements } if (c==1) { // Statements } if (c!=1) { // Statements Java while (true) { // Statements } for (int a=45; a<=55; a++) { // Statements } if (c==1) { // Statements } if (c!=1) { // Statements } if (c < 1) { // Statements } if (c >= 1) { // Statements } if ((c >= 1) && (c < 20)) { // Statements } if (c >= 20) { // Statements 1 } else if (c == 0) { // Statements 2 } else { // Statements 3 } } if (c < 1) { // Statements } if (c >= 1) { // Statements } if ((c >= 1) && (c < 20)) { // Statements } if (c >= 20) { // Statements 1 } else if (c == 0) { // Statements 2 } else { // Statements 3 } (wiki.processing.org, 2010) En los datos de Control las líneas de código son las mismas. Tabla 3.8 Comparación de estructura entre Processing y Java Structure Processing Java // Comment // Comment void doIt(int x) { public void doIt(int x) { // Statements // Statements } } 33 doIt(x); doIt(x); int square(int x) { public int square(int x) { return x*x; return x*x; } } square(X); square(X); (wiki.processing.org, 2010) La estructura es la misma para Processing y Java. Tabla 3.9 Comparación de comados de salida entre Processing y Java Input Processing Java mouseX /* Assuming there are two variables in the program named mouseX and mouseY mouseY, these values must be changed by the programmer in the mouseMoved() and mouseDragged methods. */ public void mouseMoved(MouseEvent e) { mouseX = e.getX(); mouseY = e.getY(); } public void mouseDragged(MouseEvent e) { mouseX = e.getX(); mouseY = e.getY(); } voidmousePressed() public void mousePressed(MouseEvent e) { { // Statements // Statements } } if (key=='a') { public void keyPressed(KeyEvent e) { // Statements char key = e.getKeyChar(); } if(key == 'a') { // Statements } } voidkeyPressed() { public void keyPressed(KeyEvent e) { // Statements // Statements } } (wiki.processing.org, 2010) En este caso se asume que hay dos variables en el programa llamado mouseX y mouseY en Processing, estos valores deben ser cambiados por mouseMoved () y mouseDragged en Java, la sintaxis de la programación es más fácil en Processing. 34 Processing es un Lenguaje de Programación visual, basado en Java. Con comandos simplificados que son fáciles de manejar inclusive sino se tiene conocimientos previos de programación. Ya que este proyecto es investigativo se escogió Processing por la facilidad de manejo y porque es compatible con Arduino, que se utilizará en proyectos futuros. 35 4. ANÁLISIS Y RESULTADOS En este capítulo se muestra los resultados obtenidos de la investigación experimental, derivada de la imitación de movimientos. La instalación del Processing y cómo se desarrolla desde cero un Sketch o boceto simple y sencillo como la creación de una figura que se desliza a través de la pantalla de presentación, hasta el esqueleto. 4.1. RED KINECT SDK: Sotfware Deplovemt Kid, conjunto de herramientas y programas de desarrollo que permite crear aplicaciones USB pantalla COMPUTA DOR SCANER IMAGEN Figura 4.1 Red Kinect. (Pérez, 2013) El Kinect que trabaja bajo el protocolo del SDK recepta los datos de la posición del usuario mediante la conexión USB (Universal Serial Bus), utilizando el software y los transmite al computador, obteniendo así nuestra imagen escaneada 36 4.2. CONOCIENDO PROCESSING Processing es un software libre, basado en Java, pensado para no personas que no tienen bases en programación, artistas y diseñadores que quieran expresarse mediante lenguaje digital, creado por Ben Fry y Case Reas. Por la familiaridad de sintaxis que comparte con Java y C++, es ideal para los primeros pasos en programación, pero que gracias a su flexibilidad se puede realizar proyectos complejos. Las principales ventajas del usar Processing son: - Se puede descargar gratis y es de código abierto. - Se pueden hacer programas interactivos en 2D y 3D. - Más de 100 librerías amplía su núcleo de software. 4.3. INSTALANDO PROCESSING Ingresar a la página oficial de processing, http://processing.org/, seleccionar download y descargar la versión gratuita. Como se muestra en la Figura 4.2. Figura 4.2 Página de descarga del Processing. (Pérez, 2013) 37 Escoger la versión compatible con el sistema operativo. Figura 4.3 Opciones para la descarga. (Pérez, 2013) Se descarga un archivo zip, después hay que descomprimirlo y buscar el archivo ejecutable, una vez instalado se tendrá la siguiente venta llamada skecht, como en de la Figura 4.4. Figura 4.4 Ventana del Processing. (Pérez, 2013) 38 4.3.1. DESCRIPCIÓN DE LA VENTANA | Barra de herramientas del menú Editor de texto Ventana KIN de Área de S mensaje Figura 4.5 Descripción de la ventana. (Pérez, 2013) Botón reproducir (play), ejecuta el código como programa. Botón detener (stop), detiene el programa. Botón nuevo (new), crea un nuevo archivo en Processing se llaman sketchs (bosquejos). Botón abrir (open), abre un sketch preexistente. Guardar. Botón exportar (export), el sketch a la carpeta de sketch de Processing, esta vez como un Applet de java, completo con su propio archivo html. 39 4.3.2. PRIMER PROGRAMA DE FAMILIARIZACIÓN Processing fue diseñado para la simplicidad, y permite crear programas ejecutables con sólo unas pocas líneas de código. 4.3.2.1. VARIABLES Las variables son nombres simbólicos utilizados para almacenar información en un programa. Hay ocho tipos de datos primitivos en Java y todos ellos compatibles con Processing: byte, short, int, long, float, double, boolean, y chart. Los enteros (int) se utilizan para almacenar números enteros positivos y negativos (esto significa números sin el punto decimal, como 42, 0 y -56). Una variable entera puede almacenar valores que van desde 2147483648 a 2147483647 (inclusive). Si necesita almacenar números más grandes, es necesario definir su variable como un long. Cada vez que se necesita más precisión, utilizar los números de punto flotante, o float, que son números con un decimal (23.12, 0.567, -234.63). El tipo de datos double funciona del mismo modo que float, pero es más preciso. En general el uso de floats sobre doubles en Processing es un ahorro en la memoria y tiempo de cálculo. Los datos booleanos son dos valores: verdadero y falso. Es común el uso de booleanos en el control declaraciones para determinar el flujo del programa. El tipo de datos de caracteres o chart, almacena símbolos tipográficos (a, U, $). Se va a utilizar este tipo de datos cuando se desea mostrar o trabajar con texto. - ÁMBITO DE LAS VARIABLES.- Cuando se declara una variable, está estableciendo implícitamente un ámbito o esfera de validez para la variable. Si se declara la variable dentro de una función, se podrá acceder a él sólo desde esa función específica. Si se define la variable fuera de 40 cualquier función, la variable se establecerá como una variable global y cada función en el programa se le permitirá "ver" e interactuar con la nueva variable. 4.3.3. ESTRUCTURA DE UN SKETCH DE PROCESSING Abra el sketch al declarar una variable de tipo entero temporizador fuera de cualquier función. Como se mencionó, las variables definidas como éste son tratados como variables globales en el procesamiento, por lo que puede llamar desde cualquier método y subclase. int timer; 4.3.3.1. SETUP () FUNCIÓN A continuación, incluir una función setup (). Esta función se llama una vez en el curso de la vida de un programa. voidsetup(){ size(800,600); } Se puede incluir comentarios en el código como un medio para recordar o informar a cualquier otra persona, leer sobre los detalles específicos del código. Hay dos tipos principales de comentarios: comentarios de una sola línea, que comienzan con dos caracteres de barra diagonal, y comentarios de varias líneas, utilizados para las grandes descripciones del código. voidsetup(){ // La siguiente función establece el tamaño del sketch size (800,600); /* Este es un comentario de varias líneas, cualquier cosa escrita entre los dos delimitadores de comentarios de varias líneas será ignorado por el compilador.*/ } 41 4.3.3.2. DRAW () FUNCIÓN A continuación, es necesario incluir una función draw () que se ejecutará como un bucle hasta que el programa se termina por el usuario. Se va a dibujar un círculo en la pantalla que se moverá a la derecha de la pantalla a medida que pasa el tiempo. void draw() { background(255); ellipse (timer, height/2, 30, 30); timer = timer + 1; } Para ejecutar su boceto. Pulsar el botón Ejecutar en la parte superior izquierda de su Processing. Figura 4.4. 4.3.4. LIBRERÍAS DE PROCESSING Las librerías de Processing son líneas de código Java que se han empaquetado en un archivo jar. Y se coloca en la carpeta de las librerías en su sistema para que pueda llamar a sus funciones desde cualquier sketch. Estas son creadas y mantenidas por los miembros de la comunidad de Processing, librerías como OpenGL y Serial. En específico se analizará las librerías que son para trabajar con Kinect. La interfaz de comunicación entre el Kinect y el PC se realiza mediante las librerías Simple-openNI. La siguiente tabla muestra las librerías existentes para el Kinect: Tabla 4.1 Librerías para Kinect Librerías Openkinect dLibs simple-openni Autor Daniel Shiffman Mac Thomas Diewald Max Rheiner Basada en OpenKinect/Libfreenect SO SO X OpenKinect/Libfreenect OpenNI/NITE Windows Mac SO X, Windows, Linux (Pérez, 2013) 42 Para la instalación de las librerías se procede a importar desde la opción sckecht→importlibrary→addlibrary como se muestra en la Figura 4.6 y Figura 4.7: Figura 4.6 Pasos para importar librerías. (Pérez, 2013) Figura 4.7 Selección de librerías. (Pérez, 2013) 43 4.3.5. ACCESANDO AL MAPA DE PROFUNDIDAD E IMAGEN RGB Se va a probar un ejemplo muy simple que tendrá acceso al flujo de datos del Kinect desde Processing. Primero importar la librería de Simple-OpenNI, y declarar la variable kinect que contendrá el objeto simple-OpenNI (se establece la interfaz entre el Kinect y el Pc), al igual que: importSimpleOpenNI.*; SimpleOpenNIkinect; Dentro de setup (), inicializar el objeto kinect,el Kinect tiene una cámara RGB estándar y una cámara de infrarrojos, que se utiliza en combinación con un proyector de infrarrojos para generar la imagen de profundidad de escaneo 3D. Habilitar el mapa de profundidad y las imágenes RGB del objeto Kinect y la capacidad de creación de reflejo. A continuación, establecer el tamaño del dibujo con el tamaño total de las imágenes RGB y de profundidad colocados uno junto al otro, para que pueda caber en la pantalla. void setup() { kinect = new SimpleOpenNI(this); // Permite el mapa mapa de profundidad y la imagen RGB kinect.enableDepth(); kinect.enableRGB(); // Permite el reflejo kinect.setMirror(true); size(kinect.depthWidth()+kinect.rgbWidth(), kinect.depthHeight()); } Lo primero que hay que hacer en el bucle drawloop () es para actualizar el objeto Kinect por lo que obtendrá los últimos datos del dispositivo Kinect. A 44 continuación, mostrar la imagen de fondo y las imágenes RGB en la pantalla, como en las Figuras 4.8 y 4.9. voiddraw() { kinect.update(); // dibuja el mapa de profundidad y las imagines rgb image(kinect.depthImage(), 0, 0); image(kinect.rgbImage(),kinect.depthWidth(),0); } Figura 4.8 Toma de imagen verificando flujo de datos entre el Kinect y Processing usuario 1. (Pérez, 2013) Figura 4.9 Toma de imagen verificando flujo de datos entre el Kinect y Processing usuario 2. (Pérez, 2013) 45 4.4. CONSTRUCCIÓN DEL ESQUELETO El esqueleto es probablemente el más impresionante de NITE (Natural Interaction Middleware), y por lo tanto de las capacidades Kinect. Este marco permite a la computadora para entender la posición del cuerpo de una persona en 3D y para tener una idea bastante exacta de donde están las articulaciones de la persona de pie en el espacio en cada punto en el tiempo. Vamos a echar un vistazo a las funciones de devolución de llamada que se necesita para el seguimiento del esqueleto. Se puede agregar cualquier código, se ejecutará cuando las funciones son llamadas por Simple-OpenNI. Importar la librería SimpleOpenNI , como es un envoltorio para Processing del Toolkit OpenNI, lo que nos proporciona las capacidades de OpenNI en Processing, deja escribir el código que permite recoger las ventajas que proporciona PrimeSense en su Framework. Es por lo cual se debe instalar Nite y OpenNI, cuando se accede desde Processing al código de Kinect, lo realmente complicado lo hace el código de OpenNI. En cada una de las funciones, se agrega una función println ( ) para imprimir el ID de usuario y algunos otros mensajes a la consola, para que sepa cuáles son los métodos que se desencadene en tiempo de ejecución. Importar y declarar la librería. El context es el objeto de nivel superior que encapsula toda imagen y funcionalidad de la cámara. El context se declara globalmente y crea instancias dentro de setup (). importSimpleOpenNI.*; SimpleOpenNIcontext; En la computadora los colores se representan mediante dos sistemas en escala de grises y en RGB, la mínima unidad de almacenamiento de información que maneja una computadora es el bit. Si agrupamos 8 bits tenemos el byte. Como un bit puede obtener sólo dos valores (0 y 1), 46 sabemos que la combinación con los 8 bits nos da 256 combinaciones de valores en un byte (Sistema básico), si utilizamos una combinación de 16 bits (2 bytes), se obtendrá un color de alta densidad y si la combinación es de 24 bits se obtiene el color verdadero. (2NAND, 2012) Rojo (255, 0, 0); Verde (0, 255, 0); Azul (0, 0, 255); Negro (0, 0, 0); Blanco (255, 255, 255) El método color() crea un tipo de color que puede ser guardado en el tipo de dato color. Este es el inicio del programa. Color[] userClr = new color[]{ color(150,0,0), color(0,150,0), color(0,0,150), color(150,150,0), color(150,0,150), color(0,150,150) }; Pvector se utiliza para describir una posición, velocidad o aceleración. Este nos servirá para determinar la posición del sujeto que se pare frente al Kinect. Pvector com = new Pvector(); Pvector com2d = new Pvector(); Este bucle detecta si la cámara está o no funcionando. Además de que determina el tamaño de la imagen que viene desde el Kinect (640 píxeles de ancho por 480 de alto, característica propia del Kinect) Void setup() 47 { size(640,480); context = new SimpleOpenNI(this); if(context.isInit() == false) { println(“no se puede iniciar SimpleOpenNI, talvez la cámara está desconectada!”); exit(); return; } Permite la generación del mapa de profundidad. Context.enableDepth(); Permite la generación de esqueleto para todas las articulaciones context.enableUser(); background(200,0,0); stroke(0,0,255); strokeWeight(3); smooth(); } Actualiza la cámara. Voiddraw() { context.update(); Dibuja la imagen del mapa profundidad. Image(context.userImage(),0,0); Dibuja el esqueleto si está disponible. Int[] userList = context.getUsers(); for(inti=0;i<userList.length;i++) { 48 if(context.isTrackingSkeleton(userList[i])) { stroke(userClr[ (userList[i] – 1) % userClr.length ] ); drawSkeleton(userList[i]); } Dibuja el centro de masa. La función vertx () se utiliza para especificar las coordenadas de vértices de puntos, líneas, triángulos, y polígonos. Se utiliza exclusivamente en las funcionesendShape () y beginShape (). (Processing 2, 2014) if(context.getCoM(userList[i],com)) { context.convertRealWorldToProjective(com,com2d); stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com2d.x,com2d.y – 5); vertex(com2d.x,com2d.y + 5); vertex(com2d.x – 5,com2d.y); vertex(com2d.x + 5,com2d.y); endShape(); fill(0,255,100); text(Integer.toString(userList[i]),com2d.x,com2d.y); } } } Dibuja el esqueleto con las articulaciones seleccionadas. VoiddrawSkeleton(intuserId) { Para obtener los datos en las articulaciones en 3D. context.drawLimb(userId,SimpleOpenNI.SKEL_HEAD,SimpleOpenNI.SKEL_NECK); context.drawLimb(userId,SimpleOpenNI.SKEL_NECK,SimpleOpenNI.SKEL_LEFT_SHOULDER); context.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_SHOULDER,SimpleOpenNI.SKEL_LEFT_ELBOW ); 49 context.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_ELBOW,SimpleOpenNI.SKEL_LEFT_HAND); context.drawLimb(userId,SimpleOpenNI.SKEL_NECK,SimpleOpenNI.SKEL_RIGHT_SHOULDER);co ntext.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_SHOULDER,SimpleOpenNI.SKEL_RIGHT_ELBO W); context.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_ELBOW,SimpleOpenNI.SKEL_RIGHT_HAND) ; context.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_SHOULDER,SimpleOpenNI.SKEL_TORSO); context.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_SHOULDER,SimpleOpenNI.SKEL_TORSO); context.drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_LEFT_HIP); context.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_HIP, SimpleOpenNI.SKEL_LEFT_KNEE); context.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_KNEE, SimpleOpenNI.SKEL_LEFT_FOOT); context.drawLimb(userId,SimpleOpenNI.SKEL_TORSO,SimpleOpenNI.SKEL_RIGHT_HIP); context.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_RIGHT_KNEE); context.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_KNEE, SimpleOpenNI.SKEL_RIGHT_FOOT); } Eventos de SimpleOpenNI. Void onNewUser(SimpleOpenNIcurContext, intuserId) { println(“onNewUser – userId: “ + userId); println(“\tstart tracking skeleton”); curContext.startTrackingSkeleton(userId); } voidonLostUser(SimpleOpenNIcurContext, intuserId) { println(“onLostUser – userId: “ + userId); } voidkeyPressed() { switch(key) { case ‘ ‘: context.setMirror(!context.mirror()); break; } } 50 Los resultados del programa visualizados en las siguientes imágenes: Figura 4.10 Esqueleto usuario 1. (Pérez, 2013) La imagen representada tuvo variaciones dependiendo de la distancia en la que los usuarios se encontraran. 51 Figura 4.11 Usuario 1 y 2, a 0.50 m. (Pérez, 2013) Figura 4.12 Usuario 1 y 2, a 1m de distancia. (Pérez, 2013) 52 Figura 4.13 Usuario 1 y 2, a 2m de distancia. (Pérez, 2013) Como resultado del análisis de distancias para la obtención apropiada del esqueleto se tuvo que a los 0.50 m, el esqueleto no interpreta los movimientos del usuario de manera correcta, además que existe distorsión en la imagen. Al metro de distancia se observa con más claridad pero los movimientos aún no son interpretados correctamente. Entre 1.5 y 2 m el esqueleto interpreta los movimientos del usuario en tiempo real. Se analizarán los resultados de los movimientos en tiempo real, con los gráficos respectivos y la siguiente tabla: 53 Tabla 4.2 Comparación de movimientos entre usuario y esqueleto. USUARIO ESQUELETO Levante ambas manos Levanta ambas manos Levante la mano derecha Levanta la mano derecha Levante la mano izquierda Levanta la mano izquierda Levante la pierna derecha Levanta la pierna derecha Levante la pierna izquierda Levanta la pierna izquierda (Pérez, 2013) Figura 4.14 Usuario levantando ambas manos. (Pérez, 2013) 54 Figura 4.15 Usuario levantando mano derecha. (Pérez, 2013) Figura 4.16 Usuario levantando mano izquierda. (Pérez, 2013) 55 Figura 4.17 Usuario levantando pierna derecha. (Pérez, 2013) Figura 4.18 Usuario levantando pierna izquierda.(Pérez, 2013) 56 La interfaz se realiza mediante las librerías propias del Processing, que dan como resultado el software que es una aplicación amigable e intuitiva para el usuario. Figura LIBRERÍAS PROCESSING Simple SOFTWARE Openning Figura 4.19 Interfaz. (Pérez, 2013) INICIO USUARIO FRENTE EL SENSOR KINECT KINECT DETECTA LAS ARTICULACIONES DEL ESQUELETO DEL USUARIO PROCESAMIENTO DE IMÁGENES DE PROFUNDIDAD USUARIO REALIZA MOVIMIENTOS CORPORALES ESQUELETO IMITA MOVIMIENTOS FIN Figura 4.20 Diagrama de flujo del programa. (Pérez, 2013) 57 4.5. ANÁLISIS DEL TIEMPO DE RESPUESTA Con base en el movimiento del esqueleto, se ha determinado las siguientes figuras, modificando los vertex() en el código, que nos dan las posiciones de los vectores, obtenemos: Tiempos de respuesta de movimientos del esqueleto tiempo (s) 8 7 6 5 4 3 2 1 0 tiempo (s) Levanta ambas manos 7,4 Levanta la mano derecha 6,57 Levanta la mano izquierda 6,53 Levanta la pierna derecha 2,7 Levanta la pierna izquierda 2,27 Figura 4.21 Tiempos de respuesta. (Pérez, 2013) Tiempos de respuesta de movimientos del esqueleto tiempo (s) 3,5 3 2,5 2 1,5 1 0,5 0 tiempo (s) Levanta ambas manos 2,67 Levanta la mano derecha 3,17 Levanta la mano izquierda 3,2 Levanta la pierna derecha 1,2 Levanta la pierna izquierda 1,1 Figura 4.22 Tiempos de respuesta. (Pérez, 2013) 58 Tiempos de respuesta de movimientos del esqueleto tiempo (s) 3 2,5 2 1,5 1 0,5 0 tiempo (s) Levanta ambas manos 2,8 Levanta la mano derecha 1,97 Levanta la mano izquierda 2,27 Levanta la pierna derecha 0,9 Levanta la pierna izquierda 0,9 Figura 4.23 Tiempos de respuesta. (Pérez, 2013) En el proceso experimental, el esqueleto necesita unos segundos para ejecutar el movimiento después de que los usuarios envían la señal de corporales gestos corporales del usuario. Técnicamente, todavía se produjo algún error durante el análisis debido a que el sensor Kinect es muy sensible a la luz ambiente. 59 5. CONCLUSIONES Y RECOMENDACIONES El reconocimiento de gestos es una investigación muy popular hoy en día como la tecnología se extendió muy rápido. Hay una variedad de campos que aplican el concepto de reconocimiento de gestos por ejemplo, en robótica, medicina, educación y otros. Además, el desarrollo del sensor Kinect, que es una cámara de profundidad de bajo costo, da la alternativa a los usuarios de explorar el campo relacionado de interés. Por lo tanto, la investigación del reconocimiento de gestos en robótica utilizando el sensor de Kinect se han expandido ampliamente en campo de la tecnología. El presente proyecto es una pequeña muestra de sin fin de aplicaciones y una investigación que está abierta a mejoras futuras. 5.1. CONCLUSIONES Se compró el Kinect y se consiguió reproducir los movimientos de las personas. Se comparó los diferentes lenguajes de programación para diseñar la red Kinect y escogió Processing, para implementar la interfaz se utilizó las librerías del Processing; se obtuvo la validación del software desarrollado mediante el protocolo de pruebas. La combinación de reconocimiento de movimientos, y el sensor Kinect, da una buena retroalimentación. La limitación de este proyecto es el sistema de imitación no se espera que sea una imitación movimiento perfecto. Es sólo un punto de partida de este proyecto que se actualice para mejorar en el futuro. Se utilizó el SDK plataforma gratuita de Microsoft y Processing que es un lenguaje de programación intuitivo y muy fácil de manejar también gratuito y que es compatible con Arduino, pensado para trabajos futuros; para realizar la interfaz entre el Kinect y la computadora En cuanto a distancias se concluye que a pesar de que el Kinect es más preciso que otros dispositivos de captura de imagen, en este proyecto y con la programación utilizada, necesita una distancia considerable para procesar la imagen en un rango de 1.50 a 2 m. 60 El esqueleto se puede realizar en varios lenguajes de programación, en donde se verán pequeñas variaciones, gracias a su versatilidad y software libre. Como se mencionó desde un principio este proyecto es investigativo, que puede servir de base para futuros proyectos. La capacidad del Kinect queda reflejada en las múltiples aplicaciones que se le puede dar, desde medicina hasta entretenimiento. Después de Kinect, el futuro tiende a extender la interfaz de usuario natural (NUI). Permitir una comunicación hombre-máquina casi instantánea. El Kinect de Microsoft a través de su SDK, que ahora permite a los desarrolladores independientes crear aplicaciones para esta herramienta, la apertura de las puertas de la Realidad Virtual y Aumentada, antes reservado para las grandes empresas o laboratorios de investigación. El Kinect es el comienzo de una comunicación hombre-máquina; interactiva, innovadora e instintiva. Kinect para Windows está a la vanguardia de la revolución conocida como interfaz de usuario NUI-Natural. La próxima generación de la interacción persona-computador, NUI permite a las personas interactuar con cualquier dispositivo, en cualquier lugar, con los movimientos y el lenguaje que usan todos los días de sus vidas. Microsoft Kinect, para las aplicaciones habilitadas en Windows abre un amplio abanico de nuevas posibilidades para que las personas interactúen con las computadoras de manera que se sienten naturales. Desde negocios hasta las artes, desde la educación a los juegos, y más allá, NUI expande los horizontes de desarrollo de aplicaciones. 5.2. RECOMENDACIONES Es recomendable que en el proceso de selección de lenguajes de programación, se tome en cuenta las facilidades para todo tipo de programadores ya que existen varios lenguajes que lleven a los mismos resultados. Ya que el Processing es un lenguaje amigable y fácil de manejar, es el más opcionado para su uso. 61 Se recomienda tener el Kinect en una posición estable, donde no exista movimiento, ya que influirá en la imagen del esqueleto directamente. Así como la variación que se tendrá en la imagen reflejada por el usuario. Así como no se debe exponer directamente a la luz, la imagen se distorsionará. No mover manualmente el motor del Kinect ya que sufrirá daños, a pesar de que en este proyecto no se utilizó. 62 Bibliografía 2NAND. (02 de 08 de 2012). Recuperado el 20 de 02 de 2014, de http://2nand.com/tutorial-processing-2-el-color/ all-reefs.com. (03 de 2007). Recuperado el 24 de 01 de 2014, de http://www.all-reefs.com/inicio/showthread.php?t=5499 Ana, H. (12 de 2011). SINC. Recuperado el 10 de 2013, de http://www.agenciasinc.es/ Christian Andrés Diaz, M. L. (2009). Detección, rastreo y reconstrucción tridimensional de marcadores pasivos para análisis de movimiento humano. Cinemed III. Ingeniería Biomédica , 56-57. Coppée, G. H. (1998). ENCICLOPEDIA DE SALUD Y SEGURIDAD EN EL TRABAJO . Madrid, España. Diego-Más, J. A., & Cuesta, S. A. (s.f.). Ergonautas.com. Recuperado el 10 de Octubre de 2013, de www.ergonautas.com dspace.ups.edu.ec. (s.f.). Recuperado el 23 de 01 de 2014, de http://dspace.ups.edu.ec/bitstream/123456789/220/2/Capitulo%201.pdf Dueñas, C. P. (2009). Recuperado el 22 de 01 de 2014, de http://www.elai.upm.es/webantigua/spain/Asignaturas/MIP_VisionArtificial/Ap untesVA/cap1IntroVA.pdf es.madeinasia.com. (07 de 2011). Recuperado el 24 de 01 de 2014, de http://es.madeinasia.com/factory-110921/RGY-Three-Color-Animation-LaserLight-677081.html#!prettyPhoto Etitudela. (2010). Recuperado el 22 de 01 de 2014, de http://www.etitudela.com/celula/downloads/visionartificial.pdf GD. (15 de 04 de 2010). Techterms. Recuperado el 10 de 09 de 2013, de http://www.techterms.com/definition/sdk 63 haciendofotos.com. (10 de 2008). Recuperado el 24 de 01 de 2014, de http://haciendofotos.com/iluminacion-luces-fluorescentes/ iaci.unq.edu.ar. (11 de 2010). Recuperado el 24 de 01 de 2014, de http://iaci.unq.edu.ar/materias/vision/archivos/apuntes/Tipos%20de%20Ilumi naci%C3%B3n.pdf Jana, A. (2012). Kinect for Windows SDK Programing Guide. BIRMINGHAMMUMBAI: PACKT PUBLLISHING. Jarrett Webb, J. A. (2012). Beginning kinect programminh with microsoft sdk. Apress. Knight, M. (06 de 09 de 2012). CNN México. Recuperado el 12 de 2013, de http://mexico.cnn.com/tecnologia/2012/09/06/como-el-kinect-inspiro-una-erade-innovaciones-en-todos-los-campos laoficina20.com. (05 de 2012). La oficina. Recuperado el 24 de 01 de 2014, de http://www.laoficina20.com/muy-interesante/que-es-la-iluminacion-led/ Mery, D. (2002). Visión Artificial. Santiago de Chile. Microsoft. (2013). Kinect for Windows. Recuperado el 29 de 12 de 2013, de Human Interface Guide Lines: http://www.microsoft.com/en- us/kinectforwindows/ Miller, R. (2010). Engadget. Recuperado el 12 de 09 de 2013, de http://www.engadget.com/2010/11/04/kinect-for-xbox-360-review/ msdn.microsoft.com. (2011). Recuperado el 25 de 01 de 2014, de http://msdn.microsoft.com/en-us/library/hh855355.aspx Pérez, E. (02 de 11 de 2013). Proyecto Kinect. Quito, Pichincha, Ecuador. Processing 2. (02 de 01 de 2014). Recuperado el 21 de 02 de 2014, de http://www.processing.org/reference/vertex_.html 64 R. Mogollán-Toral, O. R.-M.-L. (16 de 10 de 2013). Recuperado el 12 de 2013, de http://eventos.cicese.mx/amca2013/papers/0070.pdf Robinson, J. (2009). Free Republic. Recuperado el 03 de 03 de 2014, de http://www.freerepublic.com/focus/bloggers/3105061/posts Taringa. (20 de 10 de 2010). Inteligencia Colectiva. Recuperado el 05 de 03 de 2104, de http://www.taringa.net/posts/noticias/12840946/Prueban-unaterapia-basada-en-Kinect-contra-la-esclerosis.html uk.socialnumbers.com. (30 de 03 de 2013). socialnumbers. Recuperado el 30 de 01 de 2014, de http://uk.socialnumbers.com/page/Kinect_for_Xbox_360-114655738578578/ wiki.processing.org. (2010). Recuperado el 03 de 02 de 2014, de http://wiki.processing.org/w/Java_Comparison Wikipedia. (14 de 02 de 2014). Wikipedia. Recuperado el 05 de 03 de 2014, de http://es.wikipedia.org/wiki/Profundidad 65 ANEXOS 1. KINECT PARA WINDOWS SDK, Y EL TRABAJO EN CONJUNTO TOOLKIT El sensor Kinect para Windows Proporciona imágenes en color de la cámara RGB, imagen de profundidad de la cámara, y los datos de audio de la matriz de micrófono. Procesa los datos en bruto del sensor para ofrecer información, como el esqueleto de seguimiento para dos personas, seguimiento de hasta para seis personas, y el reconocimiento de palabras a partir de los datos de audio de un determinado idioma. Puede descargar el SDK libre de www.KinectforWindows.com.(Microsoft, 2013) 2. KINECT PARA WINDOWS DEVELOPER TOOLKIT Usar el kit de herramientas es opcional, pero se pueden encontrar ejemplos de código en él que muestran cómo utilizar las funciones del SDK , así como los componentes, tales como Button Kinect y Kinect Cursor , que le ayudan a construir las interfaces más rápido. El uso de los componentes en el kit de herramientas le permite centrarse en su problema único, y hace que la experiencia de usuario totalmente divertida; el kit de herramientas de desarrollador, también se puede descargar en www.KinectforWindows.com. Las siguientes secciones cubren lo que este equipo y los productos hacen para llevar experiencias naturales para su aplicación. Cuando se dice " Kinect para Windows ", se hace referencia a la "sensor" y SDK trabajando juntos, a menos que se especifique lo contrario. 66 3. LO QUE KINECT PARA WINDOWS VE Kinect para Windows es muy versátil y se puede ver a las personas de manera integral, no sólo la mano más pequeña. Seis personas se pueden rastrear, entre ellos dos esqueletos completos. El sensor tiene una cámara de video a color RGB (rojo-verde-azul), y un emisor de infrarrojos que miden la profundidad. Las mediciones de profundidad se devuelven en milímetros. (Microsoft, 2013) Figura A1 Rangos de profundidad en modo cerca. (Microsoft, 2013) Figura A2 Rangos de profundidad en modo predeterminado. (Microsoft, 2013) 67 Figura A3 Ángulo de visión (profundidad y RGB). (Microsoft, 2013) - SKELETON TRAKING:Kinect para Windows puede realizar un seguimiento de hasta seis personas dentro de rango de visión, entre ellos dos esqueletos completos. Figura A4 Reconocimiento de esqueletos. (Microsoft, 2013) - MODO DE ESQUELETO COMPLETO: Kinect para Windows puede realizar un seguimiento de los esqueletos en el modo de esqueleto completo predeterminado con 20 articulaciones. Figura A5 Esqueleto completo. (Microsoft, 2013) 68 - MODO SENTADO: Kinect para Windows también puede seguir esqueletos sentados sólo la parte superior 10 juntas. Figura A6 Esqueleto en modo cercano. (Microsoft, 2013) 4. LO QUE KINECT PARA WINDOWS OYE Kinect para Windows es único, ya que su único sensor capta la voz y los gestos, de seguimiento de la cara y los movimientos pequeños. El sensor tiene cuatro micrófonos que permiten su aplicación para responder a la entrada verbal, además de responder al movimiento. (Microsoft, 2013) - ENTRADA DE AUDIO El sensor Kinect para Windows detecta la entrada de audio de + y - 50 grados en la parte frontal del sensor. Figura A7 Detección de audio. (Microsoft, 2013) 69 - MATRIZ DE MICRÓFONO: El conjunto de micrófonos puede señalar en incrementos de 10 grados dentro del rango de 100 grados. Esto puede ser usado para ser específico acerca de la dirección de los sonidos importantes, tales como una persona que habla, pero no va a eliminar por completo otros ruidos en el ambiente. Figura A8 Grados de sonido. (Microsoft, 2013) - UMBRAL DE SONIDO: El conjunto de micrófonos puede cancelar 20dB (decibeles) de ruido ambiente, lo que mejora la fidelidad de audio. Eso es aproximadamente el nivel de sonido de un susurro. (Kinect de Windows cancelael sonido monofónico, pero no estereofónico.) El sonido que viene de detrás de la Sensor consigue una supresión 6dB adicional basado en el diseño de la carcasa del micrófono. Figura A9 Decibeles. (Microsoft, 2013) 70 Las siguientes imágenes pertenecen a los ejemplos que vienen incluidos en el DeveloperTool Kit Browser del Kinect para Windows. Figura A10 Profundidad. (Pérez, 2013) Figura A11 Kinect Fusion Explorer (Pérez, 2013) 71 Figura A12 Infrarrojo. (Pérez, 2013) Figura A13 Escáner Tridimensional. (Pérez, 2013) 72 Figura A14 Seguimiento del esqueleto. (Pérez, 2013) Figura A15 Seguimiento del esqueleto. (Pérez, 2013) 73 Figura A16 Imitación de movimientos faciales. (Pérez, 2013) Figura A17 Cara en 3D. (Pérez, 2013) 74 Elsiguiente código fue un intento fallido, para la representación del esqueleto y el seguimiento de los movimientos en tiempo real. CÓDIGO importSimpleOpenNI.*; SimpleOpenNIkinect; public void setup() { kinect = new SimpleOpenNI(this); kinect.setMirror(true); kinect.enableDepth(); kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_ALL);//En la version 2.1 esta librería ya no está presente por lo cual al momento de ejecutar el código nos da un error. size(kinect.depthWidth(), kinect.depthHeight()); } public void draw() { kinect.update(); image(kinect.depthImage(), 0, 0); if (kinect.isTrackingSkeleton(1)) { drawSkeleton(1); } } voiddrawSkeleton(intuserId) { pushStyle(); stroke(255,0,0); strokeWeight(3); kinect.drawLimb(userId, SimpleOpenNI.SKEL_HEAD, SimpleOpenNI.SKEL_NECK); kinect.drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_LEFT_SHOULDER); kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_ELBOW); kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HAND); kinect.drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_RIGHT_SHOULDER); kinect.drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_RIGHT_ELBOW); kinect.drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_ELBOW, SimpleOpenNI.SKEL_RIGHT_HAND); kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_TORSO); kinect.drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_TORSO); kinect.drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_LEFT_HIP); kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_HIP, SimpleOpenNI.SKEL_LEFT_KNEE); kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_KNEE, SimpleOpenNI.SKEL_LEFT_FOOT); kinect.drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_RIGHT_HIP); 75 kinect.drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_RIGHT_KNEE); kinect.drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_KNEE, SimpleOpenNI.SKEL_RIGHT_FOOT); popStyle(); } public void onNewUser(intuserId) { println("onNewUser - userId: " + userId); if (kinect.isTrackingSkeleton(1)) return; println(" start pose detection"); kinect.startPoseDetection("Psi", userId); } public void onLostUser(intuserId) { println("onLostUser - userId: " + userId); } public void onLostUser(intuserId) { println("onLostUser - userId: " + userId); } public void onStartPose(String pose, intuserId) { println("onStartPose - userId: " + userId + ", pose: " + pose); println(" stop pose detection"); kinect.stopPoseDetection(userId); kinect.requestCalibrationSkeleton(userId, true); } public void onEndPose(String pose, intuserId) { println("onEndPose - userId: " + userId + ", pose: " + pose); } public void onStartCalibration(intuserId) { println("onStartCalibration - userId: " + userId); } public void onEndCalibration(intuserId, booleansuccessfull) { println("onEndCalibration - userId: " + userId + ", successfull: " + successfull); if (successfull) { println(" User calibrated !!!"); kinect.startTrackingSkeleton(userId); } else { println(" Failed to calibrate user !!!"); println(" Start pose detection"); kinect.startPoseDetection("Psi", userId); } 76 } Como se mencionó anteriormente el error que se genera es por una actualización en la versión del lenguaje de programación utilizado. 77