2016-02-02 10 views
0

Я пытаюсь отобразить число игроков, обнаруженных датчиком Kinect, с помощью приложения WPF. В дополнение к отображению числа игроков я также покрасил пиксели в зависимости от их расстояния от Kinect. Первоначальная цель состояла в том, чтобы измерить расстояние пикселей и отобразить расстояние, но я также хотел бы показать, сколько людей находится в кадре. Вот фрагменты кода, которые я использую сейчас.Обнаружение и отображение количества игроков, обнаруженных с помощью Kinect

PS Я позаимствовал идею из THIS учебника, и я использую SDK 1.8 с XBOX 360 Kinect (1414)

private void _sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e) 
    { 
     using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()) 
     { 
      if (depthFrame==null) 
      { 
       return; 
      } 
      byte[] pixels = GenerateColoredBytes(depthFrame); 
      int stride = depthFrame.Width * 4; 
      image.Source = BitmapSource.Create(depthFrame.Width, depthFrame.Height, 
      96, 96, PixelFormats.Bgr32, null, pixels, stride); 
     } 
    } 

private byte[] GenerateColoredBytes(DepthImageFrame depthFrame) 
    { 
     //get the raw data from kinect with the depth for every pixel 
     short[] rawDepthData = new short[depthFrame.PixelDataLength]; 
     depthFrame.CopyPixelDataTo(rawDepthData); 
     /* 
     Use depthFrame to create the image to display on screen 
     depthFrame contains color information for all pixels in image 
     */ 
     //Height * Width *4 (Red, Green, Blue, Empty byte) 
     Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4]; 
     //Hardcoded loactions for Blue, Green, Red (BGR) index positions 
     const int BlueIndex = 0; 
     const int GreenIndex = 1; 
     const int RedIndex = 2; 
     //Looping through all distances and picking a RGB colour based on distance 

     for (int depthIndex = 0, colorIndex = 0; 
      depthIndex < rawDepthData.Length && 
      colorIndex<pixels.Length; depthIndex++, colorIndex+=4) 
     { 
      //Getting player 
      int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask; 

      //Getting depth value 
      int depth =rawDepthData[depthIndex]>>DepthImageFrame.PlayerIndexBitmaskWidth; 

      //.9M or 2.95' 
      if (depth <=900) 
      { 
       //Close distance 
       pixels[colorIndex + BlueIndex] = 0; 
       pixels[colorIndex + GreenIndex] = 0; 
       pixels[colorIndex + RedIndex] = 255; 
       //textBox.Text = "Close Object"; 
      } 

      //.9M - 2M OR 2.95' - 6.56' 
      else if (depth >900 && depth<2000) 
      { 
       //Bit further away 
       pixels[colorIndex + BlueIndex] = 255; 
       pixels[colorIndex + GreenIndex] = 0; 
       pixels[colorIndex + RedIndex] = 0; 
      } 

      else if (depth > 2000) 
      { 
       //Far away 
       pixels[colorIndex + BlueIndex] = 0; 
       pixels[colorIndex + GreenIndex] = 255; 
       pixels[colorIndex + RedIndex] = 0; 
      } 

      //Coloring all people in Gold 
      if (player > 0) 
      { 
       pixels[colorIndex + BlueIndex] = Colors.Gold.B; 
       pixels[colorIndex + GreenIndex] = Colors.Gold.G; 
       pixels[colorIndex + RedIndex] = Colors.Gold.R; 
       playersValue.Text = player.ToString(); 
      } 
     } 
     return pixels; 
    } 

Текущей целью является, целью которых

  • Detect общего количества игроки обнаружили и отобразили их в textBox
  • Цвет их в соответствии с логикой расстояния, т.е. depth <=900 is red.

С текущим кодом я могу обнаружить игрок и цвета их в золоте, но как только игрок регистрировал image замерзает, и когда игрок находится вне кадра image размораживается и действует нормально. Это из-за цикла? Идеи, рекомендации, рекомендации и критика приветствуются.

Спасибо!

Скриншоты:

enter image description here

enter image description here

ответ

0

Получить статическую переменную внутри кода формы

Затем установите эту переменную с помощью обычной видеокадра (Dont определить его там).

А затем обновить вид текстового поля, probaply в вашем _sensor_AllFramesReady Как приход новых кадров работает в другом потоке я не вижу, весь код может быть, чтобы обновить вызов textbox.show

основной цикл выглядит немного странно, однако, слишком сложно. в основном вы используете его для цветного пикселя в вашем изображении. , так как kinect360 имеет 320x240 пикселей, что делает массив глубин размером 76800 . Вы можете просто создать 2 для следующих циклов циклов для X и Y, а затем внутри этого цикла иметь переменное увеличение, чтобы выбрать правильное значение глубины.