• No se han encontrado resultados

Integración de Unity con Kinect V2 y detección de los movimientos

Integración de Unity con Kinect V2

En el proyecto fin de grado titulado “Sistema de Apoyo Terapéutico con Kinect para niños con parálisis cerebral infantil” realizado por Sampedro E., antecedente del presente proyecto, se empleó para su desarrollo el entorno XNA que es un conjunto de librerías .NET específicas para permitir la programación de videojuegos [SAM15]. Básicamente el juego realizado por Sampedro E. se basó principalmente en la reproducción de videos cortos y animaciones. En esa solución no hacía falta una integración debido a que se produce un desacople de la funcionalidad proporcionada, la parte de comunicación con la Kinect 360 se realizó empleando el SDK y la parte de animación mediante un proyecto XNA. En la aplicación había una comunicación entre ambas partes para facilitar la sincronización durante el juego. En el presente proyecto fin de grado, para realizar la integración entre el sensor Kinect V2 y Unity se ha optado por el uso del asset desarrollado por Rumen Filikov que ya

especificamos en el apartado de especificaciones y restricciones del diseño disponible en [KIE18]. Para utilizarlo, este asset es importado a la escena de Unity nos permite el uso y el

control de los datos provenientes del sensor. Para poder empezar a detectar los movimientos necesitamos crear un Game Object vacío y asignarle el script de Kinect Manager y Facetracking Manager.

4.4.1.1 Kinect Manager

El script de KinectManager es el encargado de la integración entre Unity y Kinect V2,

ofrece una gran cantidad de opciones como podemos encontrar en la siguiente figura.

Algunas de las opciones más importantes se explican a continuación:

Sensor Height: altura en metros con respecto al suelo del sensor.

Sensor Angle: ángulo en grados de elevación del sensor.

Compute color Map: checkbox para la utilización o no de la cámara de color.

Compute infrared Map: checkbox para la utilización o no del sensor de infrarrojos.

Display Color Map: checkbox para mostrar la imagen que captura la cámara por la pantalla.

Display Maps Width Percent: porcentaje de la anchura de la pantalla para mostrar la imagen a color.

Max Tracked Users: cantidad máxima de usuarios que pueden ser detectados.

Face Tracking OK: imagen que indica en el menú la detección correcta de la cara del usuario.

Este script es capaz de realizar la configuración de la Kinect V2 en un entorno Unity,

permitiéndonos la posibilidad de utilizar dicha información para la elaboración del juego.

4.4.1.2 Facetracking Manager

El siguiente script es el encargado de realizar el seguimiento de la cara, en la siguiente

figura recogemos el conjunto de opciones que nos ofrece este script.

Figura 44. Script para la detección y el seguimiento de la cara en Unity

Algunas de las opciones más importantes de este script son las siguientes:

Player index: referencia del jugador detectado, 0 significa primer jugador detectado, 1 significa segundo jugador detectado, etc.

Get Face Model Data: checkbox para el tratamiento o no en alta definición de la cara en Unity.

Display Face Rect: checkbox para mostrar un rectángulo en la cara detectada en la imagen de la cámara definida en el script de KinectManager.

Face Tracking Tolerance: tolerancia en segundos cuando la cara no es detectada sin considerarla como perdida.

Detección de los movimientos

Una vez tenemos la integración entre nuestro sensor y Unity podemos recoger la información y realizar la detección de los movimientos simples de los que consta el juego, levantar las cejas, guiñar el ojo, soplar, dar un beso y sonreír.

En un primer instante se intentó realizar un modelo parecido al utilizado en el proyecto fin de grado antecedente del proyecto que estamos desarrollando [SAM15], es decir tratar de reconocer los puntos de la cara con Kinect V2 trasladarlos al motor de juegos y hacer una discriminación según las distancias entre ellos. La enumeración de estos puntos la podemos encontrar en [HDP18].

En la siguiente figura, se pueden observar los puntos más importantes detectados por el sensor (Kinect V2), y que pueden considerarse útiles para identificar los movimientos faciales que componen el juego.

Figura 45. Puntos detectados por la Kinect V2 representados en una cara

Mediante la detección de la posición de estos puntos sería posible realizar un cálculo de las distancias relativas entre ellos. Estas distancias son diferentes en cada uno de los movimientos realizados (subir cejas, guiñar ojos, soplar, etc.), lo que nos permitiría decidir si el movimiento se ha realizado de manera correcta o incorrecta

En la siguiente tabla, se puede observar la enumeración de los puntos detectados por el sensor y que han sido representados en la figura anterior. En la tabla, se muestra: la descripción en

español del punto, su descripción en inglés y por último el color de cada punto (a modo de código de colores para facilitar su identificación).

Tabla 5. Descripción de los puntos de la cara de Kinect V2

Punto Descripción (español) Descripción (inglés) Color

1 Centro de la barbilla Chin Center

2 Centro de la frente Forehed Center

3 Centro mejilla derecha Rightcheek Center 4 Centro mejilla izquierda Leftcheek Center

5 Pómulo derecho Rightcheekbone

6 Pómulo izquierdo Leftcheekbone

7 Mandíbula inferior izquierda Lowerjaw Leftend 8 Mandíbula inferior derecha Lowerjaw Rightend

9 Parte inferior media del labio inferior Mouth Lowerlip Midbottom 10 Parte inferior media del labio

superior Mouth Upperlip Midbottom

11 Parte superior media del labio

inferior Mouth Lowerlip Midtop

12 Parte superior media del labio

superior Mouth Upperlip Midtop

13 Esquina izquierda de la boca Mouth Leftcorner 14 Esquina derecha de la boca Mouth Rightcorner 15 Exterior ceja izquierda Lefteyebrow Outer 16 Centro ceja izquierda Lefteyebrow Center 17 Interior ceja izquierda Lefteyebrow Inner 18 Ojo izquierdo esquina interior Lefteye Innercorner 19 Ojo izquierdo mitad superior Lefteye Midtop 20 Ojo izquierdo esquina exterior Lefteye Outcorner 21 Ojo izquierdo mitad inferior Lefteye Midbottom 22 Exterior ceja derecha Righteyebrow Outer 23 Centro ceja derecha Righteyebrow Center 24 Interior ceja derecha Righteyebrow Inner 25 Ojo derecho esquina interior Righteye Innercorner 26 Ojo derecho mitad superior Righteye Midtop 27 Ojo derecho esquina exterior Righteye Outercorner 28 Ojo derecho mitad inferior Righteye Midbottom 29 Parte inferior derecha de nariz Nose Bottomright 30 Parte superior derecha de nariz Nose Topright 31 Parte inferior de la nariz Nose Bottom

32 Punta nariz Nose Tip

33 Parte superior nariz Nose Top

34 Parte superior izquierda de nariz Nose Topleft 35 Parte inferior izquierda de nariz Nose Bottomleft

Mediante el uso de estos puntos y unos umbrales definidos por el desarrollador se realizaba la discriminación de si el movimiento ha sido valido o no. Esto constituía una solución valida, pero no del todo exacta debido a la posibilidad de que aparecieran errores en las distancias entre los puntos.

Debido a la gran cantidad de puntos detectados por el sensor Kinect V2 (1347) se puede leer en [DSN16], que producían problemas de computación debido a limitaciones de CPU y de memoria RAM del ordenador en el cual se iba a instalar la aplicación. Así como a la inexactitud en las distancias entre los puntos, principal motivo por el que se decidió descartar esta posible implementación. En su lugar, se ha tratado de buscar una implementación más eficiente desde el punto de vista de los requisitos del PC en el que se va a ejecutar el juego, y también más clara y precisa desde el punto de vista del desarrollo.

La solución a este problema la encontramos en los Animation Units disponibles en la

API del sensor Kinect V2. Concretamente se utilizó el seguimiento en alta definición de la cara, que se encuentra descrito en [HDF14]. Este seguimiento en alta definición nos facilita una mayor integración entre el juego y los movimientos detectados por el sensor, y permite crear una conexión emocional más fuerte entre los jugadores y el juego.

Dicha API, la high definition face tracking, es la encargada de la captura del rostro y del seguimiento facial del jugador.

4.4.2.1 Captura del rostro del Jugador

Mediante esta función se obtiene la forma de la cara del jugador. La API le indicará al desarrollador del juego dónde se encuentra la persona en la captura que realiza la cámara, cuando tenga suficientes frames válidos calculará la forma de la cara del usuario. El

desarrollador del juego puede usar esos valores para influir en el diseño del juego y de los personajes del juego.

4.4.2.2 Seguimiento facial

Mediante esta función somos capaces de seguir la cara del jugador. Así podemos obtener expresiones faciales en tiempo real del jugador. Para cada frame, el desarrollador obtendrá

las unidades de animación que se relacionan con los movimientos faciales del jugador.

4.4.2.3 Animation units

La API del sensor Kinect V2 es capaz de detectar 17 unidades de animación (AU). La mayoría de las de ellas se expresan como un peso numérico que varía entre 0 y 1. Tres de ellos, varían entre -1 y +1. Las Animation Units utilizadas para el desarrollo del videojuego son las siguientes. Algunas de ellas fueron descritas en la tabla 2 del capítulo de especificaciones y restricciones de diseño.

AU3 Brow Lowerer: esta unidad de animación nos mide la elevación de las cejas. Los pesos numéricos correspondiente a esta animación son:

o 0= neutral

o -1=totalmente subidas o 1= totalmente bajadas.

AU6 Eyelid Closed: esta unidad de animación nos mide si el parpado está cerrado o no. Es útil en el guiño de los ojos. Los pesos numéricos correspondientes a esta animación son:

o -1 ojo abierto o 1= ojo cerrado.

AU7 Lip Pucker: esta unidad de animación nos permite saber el estiramiento de los labios. Los pesos numéricos correspondientes a esta animación son:

o -1= labios estirados (sonrisa)

o 1=labios redondeados (acción de soplar).

AU2 Lip Stretcher: esta unidad de animación nos permite saber si lo labios están extendidos o no. Los pesos numéricos correspondientes a esta animación son:

o 0= neutral

o -1=labios totalmente extendidos (sonrisa) o 1=labios totalmente redondeados

AU4 Lip Corner Depressor: esta unidad de animación nos permite saber la elevación de la esquina de los labios. Los pesos numéricos correspondientes a esta animación son:

o 0=neutral,

o -1=expresión de felicidad (elevacion positiva de los bordes de los

labios)

o 1= expresión de tristeza (elevacion negativa de los bordes de los labios)

Mediante el uso de estas AU somos capaces de determinar de manera más exacta si el movimiento se ha realizado de manera correcta.

En el juego desarrollado, y con el fin de unificar todos los resultados con el mismo signo, se ha utilizado el siguiente estándar:

• 0 = neutral

• 1 = Umbral máximo que se corresponde con la perfecta realización del movimiento

• -1 = Umbral mínimo que se corresponde con la realización incorrecta del movimiento En los AU en los que los pesos varían entre 0 y 1 realizamos una interpolación para que el intervalo sea entre -1 y 1. También, hemos modificado el signo de AU3 y AU4 para que el resultado de nuestro juego que persigue la elevación de las cejas y la sonrisa sea positivo.

Documento similar