2011-10-14 12 views
6

Estoy haciendo una aplicación de kinect usando Official Kinect SDK.Análisis de gestos de Kinect

El resultado que deseo 1) capaz de identificar el cuerpo ha estado ondeando durante 5 segundos. Haga algo si lo hace 2) puede identificar inclinarse con una pierna durante 5 segundos. hacer algo si lo hace

¿Alguien sabe cómo hacerlo? Lo estoy haciendo en una aplicación WPF.

Me gustaría tener un ejemplo. Soy bastante nuevo para Kinect.

Gracias de antemano por toda su ayuda!

Respuesta

17

El Kinect le proporciona los esqueletos que rastrea, tiene que hacer el resto. Básicamente, debe crear una definición para cada gesto que desee y ejecutar eso contra los esqueletos cada vez que se active el evento SkeletonFrameReady. Esto no es fácil

Definición de gestos

Definición de los gestos puede ser sorprendentemente difícil. Los gestos más simples (más fáciles) son aquellos que ocurren en un solo punto en el tiempo, y por lo tanto no dependen de ubicaciones pasadas de las extremidades. Por ejemplo, si desea detectar cuando el usuario tiene su mano levantada sobre su cabeza, esto puede verificarse en cada cuadro individual. Los gestos más complicados deben tener en cuenta un período de tiempo. Para su gesto de saludo, no podrá decir a partir de un solo cuadro si una persona está saludando o simplemente levantando su mano frente a ellos.

Así que ahora necesita poder almacenar información relevante del pasado, pero ¿qué información es relevante? ¿Debería guardar una tienda de los últimos 30 marcos y ejecutar un algoritmo contra eso? 30 marcos solo le dan un segundo de información ... ¿tal vez 60 cuadros? ¿O para tus 5 segundos, 300 cuadros? Los humanos no se mueven tan rápido, así que tal vez podrías usar cada cinco cuadros, lo que reduciría tus 5 segundos a 60 cuadros. Una mejor idea sería seleccionar y elegir la información relevante de los marcos. Para un gesto de saludo, la velocidad actual de la mano, cuánto tiempo ha estado en movimiento, qué tan lejos se ha movido, etc. podría ser información útil.

Después de haber descubierto cómo obtener y almacenar toda la información relativa a su gesto, ¿cómo convertir esos números en una definición? Agitar podría requerir una cierta velocidad mínima o una dirección (izquierda/derecha en lugar de arriba/abajo) o una duración. Sin embargo, esta duración no es la duración de 5 segundos que le interesa. Esta duración es el mínimo absoluto necesario para suponer que el usuario está agitando. Como se mencionó anteriormente, no puede determinar una onda desde un marco. No debe determinar una onda de 2, o 3 o 5, porque eso no es suficiente. Si mi mano se mueve nerviosamente durante una fracción de segundo, ¿consideraría eso una ola? Probablemente haya un punto positivo en el que la mayoría de las personas estaría de acuerdo en que un movimiento de izquierda a derecha constituye una onda, pero ciertamente no lo conozco lo suficiente como para definirlo en un algoritmo.

Hay otro problema al requerir que un usuario haga cierto gesto durante un período de tiempo. Lo más probable es que no todos los cuadros en esos cinco segundos parezcan una ola, independientemente de qué tan bien escriba la definición. Mientras que usted puede determinar fácilmente si alguien sostuvo su mano sobre su cabeza durante cinco segundos (porque se puede determinar en una sola base de cuadro), es mucho más difícil hacer eso para los gestos complicados. Y aunque agitar no es tan complicado, todavía muestra este problema. A medida que su mano cambia de dirección a cada lado de una ola, deja de moverse durante una fracción de segundo. ¿Todavía estás saludando? Si respondió que sí, agite más despacio, de modo que pause un poco más a cada lado. ¿Esa pausa todavía sería considerada una ola? Lo más probable es que, en algún momento de ese gesto de cinco segundos, la definición no detecte una ola.Entonces, ahora debe tener en cuenta una indulgencia por la duración del gesto ... si el gesto de agitar se produjo durante el 95% de los últimos cinco segundos, ¿es eso suficiente? 90%? 80%?

El punto que estoy tratando de hacer aquí es que no hay una manera fácil de hacer reconocimiento de gestos. Tienes que pensar en el gesto y determinar algún tipo de definición que convierta un montón de posiciones conjuntas (los datos esqueléticos) en un gesto. Deberá realizar un seguimiento de los datos relevantes de marcos anteriores, pero darse cuenta de que la definición del gesto probablemente no sea perfecta.

Considere los usuarios

Así que ahora que he dicho por qué la segunda ola de cinco sería difícil de detectar, me permiten, al menos, dar mi opinión sobre la manera de hacerlo: no lo hacen. No debe forzar a los usuarios a repetir un gesto basado en movimiento durante un período de tiempo determinado (la ola de cinco segundos). Es sorprendentemente agotador y no es lo que la gente espera de las computadoras. Apuntar y hacer clic es instantáneo; tan pronto como haga clic, esperamos una respuesta. Nadie quiere tener que presionar un clic durante cinco segundos antes de que puedan abrir Minesweeper. Repetir un gesto durante un período de tiempo está bien si se está ejecutando continuamente alguna acción, como usar un gesto para recorrer una lista: el usuario entenderá que debe continuar haciendo el gesto para avanzar más en la lista. Esto incluso hace que el gesto sea más fácil de detectar, porque en lugar de necesitar información durante los últimos 5 segundos, solo necesita información suficiente para saber si el usuario está haciendo el gesto en este momento.

Si desea que el usuario mantenga un gesto durante un período de tiempo determinado, hágalo con un gesto estacionario (mantener la mano en una posición durante x segundos es mucho más fácil que agitar). También es una muy buena idea dar algunos comentarios visuales, decir que el temporizador ha comenzado. Si un usuario arruina el gesto (mano equivocada, lugar equivocado, etc.) y termina allí de pie por 5 o 10 segundos esperando que ocurra algo, no estará contento, pero eso no es realmente parte de esta pregunta.

A partir de gestos Kinect

inicio pequeña .. muy pequeño. Primero, asegúrate de que conoces bien la clase SkeletonData. Hay 20 articulaciones rastreadas en cada esqueleto, y cada una tiene un estado de seguimiento. Este estado de seguimiento mostrará si el Kinect puede ver realmente la articulación (Rastreado), si está averiguando la posición de la articulación en función del resto del esqueleto (Inferido), o si ha abandonado por completo el intento de encontrar la articulación (No rastreado) . Estos estados son importantes. No querrás pensar que el usuario está parado sobre una pierna simplemente porque el Kinect no ve la otra pierna y está reportando una posición falsa para eso. Cada articulación tiene una posición, que es cómo usted sabe dónde se encuentra el usuario ... pieza por pieza. Familiarícese con el sistema de coordenadas.

Después de conocer los conceptos básicos de cómo se informan los datos del esqueleto, intente con algunos gestos simples. Imprima un mensaje en la pantalla cuando el usuario levanta una mano sobre su cabeza. Esto solo requiere comparar cada mano con la junta de la cabeza y ver si alguna mano es más alta que la cabeza en el plano de coordenadas. Después de que funcione, muévete a algo más complicado. Sugiero probar un movimiento deslizante (la mano en frente del cuerpo, se mueve de derecha a izquierda o de izquierda a derecha a una distancia mínima). Esto requiere información de marcos anteriores, por lo que deberá pensar qué información debe almacenar. Si logras que funcione, podrías intentar con una serie de gestos deslizar en una pequeña cantidad de tiempo e interpretar eso como una ola.

tl; dr: Los gestos son difíciles. Comience poco a poco, construya su camino hacia arriba. No haga que los usuarios realicen movimientos repetitivos para una sola acción, es agotador y molesto. Incluye retroalimentación visual para los gestos basados ​​en la duración. Lee el resto de esta publicación.

+0

Gracias por el consejo! =) – user981924

3

Kinect SDK le ayuda a obtener las coordenadas de las diferentes articulaciones.Un gesto no es más que un cambio en la posición de un conjunto de articulaciones durante un período de tiempo.

Para reconocer los gestos, debe almacenar las coordenadas durante un período de tiempo y recorrerlas para ver si obedecen las reglas de un gesto en particular (como - la mano derecha siempre se mueve hacia arriba).

Para más detalles, echa un vistazo a mi blog sobre el tema: http://tinyurl.com/89o7sf5