sdk - for - kinect v2
Cómo detectar mano abierta/cerrada usando Microsoft Kinect para Windows SDK ver 1.7 C# (4)
Recientemente comencé a usar Microsoft Kinect para Windows SDK para programar algunas cosas usando el dispositivo Kinect.
Estoy reventando mi culo para encontrar una manera de detectar si una determinada mano está cerrada o abierta.
Vi el Kit de herramientas de Kinect para Windows pero la documentación no existe y no puedo encontrar la manera de hacerlo funcionar.
¿Alguien sabe de una forma simple de detectar la situación de la mano? aún mejor si no implica la necesidad de utilizar el kit de herramientas Kinect.
Por lo que sé, Microsoft kinect para Windows SDK no es el mejor para detectar las manos abiertas y cerradas. Microsoft proporciona seguimiento de 20 partes del cuerpo y no incluye los dedos de la mano. Puede aprovechar las interacciones de kinect para eso de una manera indecorosa. Este tutorial muestra cómo: http://dotneteers.net/blogs/vbandi/archive/2013/05/03/kinect-interactions-with-wpf-part-iii-demystifying-the-interaction-stream.aspx
Pero creo que la mejor solución al seguir los movimientos de los dedos sería usar OpenNI SDK.
Algunos MiddleWares de OpenNI permiten el seguimiento de los dedos.
SDK 1.7 introduce el concepto de interacción llamado "agarre". Ha leído acerca de todos los conceptos de KinectInteraction
en el siguiente enlace: http://msdn.microsoft.com/en-us/library/dn188673.aspx
La forma en que Microsoft ha implementado esto es a través de un evento de una KinectRegion
. Entre los eventos de KinectRegion
encuentran HandPointerGrip
y HandPointerGripRelease
, que se HandPointerGripRelease
en los momentos apropiados. Como el evento proviene del elemento de la mano, puede tomar las medidas adecuadas desde el controlador de eventos.
Tenga en cuenta que una KinectRegion
puede ser cualquier cosa. La clase base es un ContentControl
para que pueda colocar algo tan simple como una imagen en un diseño de Grid
complejo dentro de la región en la que se actuará.
Puede encontrar un ejemplo de cómo usar esta interacción en el ejemplo ControlBasics-WPF , proporcionado con el SDK.
ACTUALIZAR:
KinectRegion
es simplemente un ContentControl
elegante, que a su vez es solo un contenedor, que puede tener cualquier cosa dentro. Eche un vistazo al ejemplo de ControlBasics-WPF
, en el CodePlex de Kinect para Windows , y realice una búsqueda de KinectRegion
en el archivo MainWindow.xaml
. Verá que hay varios controles dentro de los cuales se actúa.
Para ver cómo se implementan Grip
y GripRelease
en este ejemplo, es mejor abrir la solución en Visual Studio y buscar "agarre". La forma en que lo hacen es un poco extraña, en mi opinión, pero es una implementación limpia que fluye muy bien.
Puedes usar algo como esto
private void OnHandleHandMove(object source, HandPointerEventArgs args)
{
HandPointer ptr = args.HandPointer;
if (ptr.HandEventType==HandEventType.Grip)
{
// TODO
}
}
Así es como lo hice eventualmente:
Lo primero es lo primero, necesitamos una clase ficticia que se parezca a esto:
public class DummyInteractionClient : IInteractionClient
{
public InteractionInfo GetInteractionInfoAtLocation(
int skeletonTrackingId,
InteractionHandType handType,
double x,
double y)
{
var result = new InteractionInfo();
result.IsGripTarget = true;
result.IsPressTarget = true;
result.PressAttractionPointX = 0.5;
result.PressAttractionPointY = 0.5;
result.PressTargetControlId = 1;
return result;
}
}
Luego, en el código de la aplicación principal, debemos anunciar sobre el manejador de eventos de interacciones como este:
this.interactionStream = new InteractionStream(args.NewSensor, new DummyInteractionClient());
this.interactionStream.InteractionFrameReady += InteractionStreamOnInteractionFrameReady;
Finalmente, el código para el manejador en sí:
private void InteractionStreamOnInteractionFrameReady(object sender, InteractionFrameReadyEventArgs e)
{
using (InteractionFrame frame = e.OpenInteractionFrame())
{
if (frame != null)
{
if (this.userInfos == null)
{
this.userInfos = new UserInfo[InteractionFrame.UserInfoArrayLength];
}
frame.CopyInteractionDataTo(this.userInfos);
}
else
{
return;
}
}
foreach (UserInfo userInfo in this.userInfos)
{
foreach (InteractionHandPointer handPointer in userInfo.HandPointers)
{
string action = null;
switch (handPointer.HandEventType)
{
case InteractionHandEventType.Grip:
action = "gripped";
break;
case InteractionHandEventType.GripRelease:
action = "released";
break;
}
if (action != null)
{
string handSide = "unknown";
switch (handPointer.HandType)
{
case InteractionHandType.Left:
handSide = "left";
break;
case InteractionHandType.Right:
handSide = "right";
break;
}
if (handSide == "left")
{
if (action == "released")
{
// left hand released code here
}
else
{
// left hand gripped code here
}
}
else
{
if (action == "released")
{
// right hand released code here
}
else
{
// right hand gripped code here
}
}
}
}
}
}