2012-04-17 39 views
5

Estoy creando una aplicación usando el SDK, en el que debo tener un solo usuario y bloquearlo, así que si alguien más aparece, incluso si esa persona está más cerca de Kinect, la aplicación mantiene rastreando el primer esqueleto que rastreó.Cómo bloquear un solo esqueleto

Desde la biblioteca MSDN descubrí que podía utilizar la Corriente Clase Skeletom:

propiedad: AppChoosesSkeletons = Obtiene o establece un valor booleano que determina si la aplicación elige qué esqueletos para el seguimiento.

Método: SkeletonStream.ChooseSkeletons (Int32) = Elige un esqueleto para rastrear. Sintaxis: public void ChooseSkeletons (int trackingId1)

No soy muy bueno en la programación y estoy usando C#, pensé en escribir algo así como el código, pero dice que estoy usando una expresión no válida .

SkeletonFrame SFrame = e.OpenSkeletonFrame(); 
if (SFrame == null) return; 

Skeleton[] Skeletons = new Skeleton[SFrame.SkeletonArrayLength]; 
SFrame.CopySkeletonDataTo(Skeletons); 

int firstSkeleton = Skeletons[0].TrackingId; 
sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton); 

if (firstSkeleton == null) 
return; 

if (SkeletonTrackingState.Tracked == firstSkeleton.TrackingState) 
{ 
//body... 

El problema es con el sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton, que dice int firstSkeleton cannot be used.
¿Podría alguien ayudarme? ¡Gracias!

+0

Por favor, dime, dónde y cuando llegue ese error. – Likurg

+0

@Likurg Lo escribí de otra manera, no estoy seguro de si funcionará o si es la mejor manera 'Esqueleto más cercanoSkeleton = (de s en Skeletons donde s.TrackingState == SkeletonTrackingState.Tracked && s.Joints [JointType.Head ] .TrackingState == JointTrackingState.Tracked select s) .OrderBy (s => s.TrackingId) .FirstOrDefault(); 'Del código que publiqué antes, el problema fue con' sensor.SkeletonStream.ChooseSkeletons (int firstSkeleton); ' decía que int firstSkeleton no podía ser usado. Creo que mi lógica no es del todo correcta, me falta algo, pero no estoy seguro de cómo hacerlo. Gracias por tu respuesta – Paola

+0

¿Has probado con Skeletons 'TrackingID'? Tal vez solo prestar atención a la primera? –

Respuesta

3
sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton); 

¿Qué desea lograr con esta línea?

Imo si quieres lanzar firstSkeleton a int escribir así:

sensor.SkeletonStream.ChooseSkeletons((int) firstSkeleton); 

si no te quieren echarlo y justo para dar y int variable para methid acaba de escribir:

sensor.SkeletonStream.ChooseSkeletons(firstSkeleton); 
2

No puede bloquear un esqueleto, pero puede elegir el esqueleto que desea rastrear, independientemente de su posición. Se complica cuando ambas personas abandonan el campo de visión de Kinect.

Al configurar AppChoosesSkeletons como verdadero, puede elegir el usuario que desea rastrear. Para especificar el usuario o los usuarios a seguir, llame al método SkeletonStream.ChooseSkeletons y pase el ID de seguimiento de uno o dos esqueletos que desea rastrear (o ningún parámetro si no se van a rastrear esqueletos).

Algo como esto:

private void ChooseSkeleton() 
    { 
    if (this.kinect != null && this.kinect.SkeletonStream != null) 
     { 
     if (!this.kinect.SkeletonStream.AppChoosesSkeletons) 
     { 
     this.kinect.SkeletonStream.AppChoosesSkeletons = true; // Ensure AppChoosesSkeletons is set 
     } 

     foreach (Skeleton skeleton in this.skeletonData.Where(s => s.TrackingState != SkeletonTrackingState.NotTracked)) 
     { 
     int ID { get.skeleton[1]}//Get ID here 
     } 

     if (ID = 0) 
     { 
     this.kinect.SkeletonStream.ChooseSkeletons(ID); // Track this skeleton 
     } 
    } 
    } 
Cuestiones relacionadas