Autor

Alejandro Alcalde

Data Scientist and Computer Scientist. Creator of this blog.

Más artículos de Alejandro Alcalde | Porfolio

Índice

Este artículo es parte de una práctica de una asignatura de mi facultad Nuevos Paradigmas de la Interacción. El trabajo consiste en programar por primera vez una aplicación haciendo uso de una Kinect.

Esta vez vamos a hacer las cosas al revés, en el vídeo se muestra el resultado de la aplicación. Permite realizar presentaciones, ya sean PDFs o Power Points mediante la detección de gestos del usuario. Por defecto el esqueleto aparece en rojo. Esto significa que el procesamiento de gestos está desactivado. Mediante un pequeño gesto, se activa y el esqueleto se vuelve verde. A partir de ahora, doblando el codo derecho, avanzaremos una transparencia, mientras que con el codo izquierdo retrocedemos.

El código está en github, y la práctica la hemos realizado Cristina H.G y Alejandro Alcalde.

Como se puede ver, inicialmente no se nos hace caso, luego activamos el procesamiento y comenzamos a avanzar y retroceder transpacencias. Cada vez que se ejecuta un comando, se ilumina el brazo que ejecutó la acción.

Descripción del código

Para esta primera práctica consistente en familiarizarse con Kinect , nos hemos basado en un ejemplo de Microsoft [1] en el que se permite controlar una presentación Power Point mediante gestos. El proyecto original avanza o retrocede las diapositivas elevando el brazo derecho/izquierdo por encima del hombro derecho/izquierdo. Nosotros la hemos modificado para que los gestos sean los especificados más arriba.

Estando de frente en la kinect, con los brazos en posición normal, hay que subir la muñeca de forma que sobrepase la cadera, y luego volver a bajarla. El brazo derecho se usa para avanzar una diapositiva, mientras que el izquierdo retrocede. Para ello se hace uso de un framework simple que declara una relación entre una o varias articulaciones, el ejemplo que pusimos al principio implica la relación de dos articulaciones (muñeca y cadera) y la relación arriba y abajo. Los posibles tipos de relaciones entre articulaciones se definen en la siguiente enumeración:


public enum JointRelationship
{
  None,
  Above,
  Below,
  LeftOf,
  RightOf,
  AboveAndRight,
  BelowAndRight,
  AboveAndLeft,
  BelowAndLeft
}

La relación por defecto usada en el ejemplo se define en el siguiente fichero XML

<Gestures GestureResetTimeout="500">
  <Gesture Description="Previous Bullet" MaxExecutionTime="1000" MappedKeyCode="PRIOR">
    <GestureComponent FirstJoint="WristLeft" SecondJoint="HipLeft" EndingRelationship="BelowAndLeft" BeginningRelationship="AboveAndLeft" />
  </Gesture>
  <Gesture Description="Next Bullet" MaxExecutionTime="1000" MappedKeyCode="NEXT">
    <GestureComponent FirstJoint="WristRight" SecondJoint="HipRight" EndingRelationship="BelowAndRight" BeginningRelationship="AboveAndRight" />
  </Gesture>
</Gestures>

Jugando con los atributos de la etiqueta <gesturecomponent> es posible cambiar el tipo de gesto que reconocerá el programa, tanto articulaciones como la relación entre ellas, o usar solo una única articulación.

Antes de comenzar una presentación en Power Point, o un PDF, hay que realizar un gesto que active el procesamiento. Para ello se ha definido un nuevo gesto consistente en desplazar la rodilla a la derecha del hombro derecho. Y su homólogo izquierdo para desactivar el procesamiento. Esto se define en el xml:

<Gesture Description="Ready Position" MaxExecutionTime="1000" MappedKeyCode="ACCEPT">
  <GestureComponent FirstJoint="KneeRight" SecondJoint="ShoulderRight" EndingRelationship="LeftOf" BeginningRelationship="RightOf" />
</Gesture>
<Gesture Description="Cancel Position" MaxExecutionTime="1000" MappedKeyCode="CANCEL">
  <GestureComponent FirstJoint="KneeLeft" SecondJoint="ShoulderLeft" EndingRelationship="RightOf" BeginningRelationship="LeftOf" />
</Gesture>

Para proporcionar feedback al usuario, inicialmente el esqueleto está de color rojo. Se proporcionan una serie de instrucciones para que se active el procesamiento. Una vez activado, el esqueleto se pone de color verde. Cuando se detectan los gestos para avanzar o retroceder también cambia de color, aunque sólo la extremidad con la cual se realizó el gesto. Azul para avanzar y rosa para retroceder. Todos estos cambios de color se realizan en el método AddSkeletonToDepthBitmap como sigue:

Pen pen = new Pen(Color.Red, 5);
var gobject = Graphics.FromImage(bitmap);

if (_readyGestureDetected)
{
  pen = new Pen(Color.Green, 3);
}
else if (isActive)
{
  pen = new Pen(Color.Red, 5);
}

Se intentó hacer uso de la distancia Euclídea para establecer umbrales de tal forma que cuando la distancia entre dos articulaciones superara dicho umbral, el movimiento se procesara:

\[ d = \sqrt{(p1-q1)^2 + (p2-q2)^2 + (p3-q3)^2} \]

Problemas encontrados

Referencias

[1] - Walt Smith, Simple Gesture Processing using the Kinect for Windows | code.msdn.microsoft.com

¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.

Categorías: