2012-03-15 2 views
4

Выполнение группового проекта, пытающегося что-то сделать, когда игрок (в частности, игрок) близок/далеко, поэтому мы написали эту функцию. (Мы не разрешается использовать функции скелета)Как получить плеер Глубина от данных Kinect SDK C#?

private void FindDepth(DepthImageFrame depthFrame) 
    { 

     short[] rawDepthData = new short[depthFrame.PixelDataLength]; 
     depthFrame.CopyPixelDataTo(rawDepthData); 

     Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4]; 

     for (int depthIndex = 0; depthIndex < rawDepthData.Length; depthIndex++) 
     { 
      int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask; 
      int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth; 

      if (player > 0) 
      { 
       playerDepth = rawDepthData[depthIndex]; 
      } 

     } 

    } 

Почему это не правильно захватить глубину игрока, захватывая один пиксель?

ответ

3

Глубинный пиксель представлен как 16 бит. Нижние 3 бита обеспечивают индекс игрока и остальные 13 бит обеспечивают глубину, например. {глубина битов} {индекс игрок бит}

{0100 1011 1001 0} {010}

, таким образом, чтобы найти индекс игрока мы, и с помощью DepthImageFrame.PlayerIndexBitmask, как показано ниже

(0100 1011 1001 0010) и (0000 0000 0000 0111) = 0000 0000 0000 0010 = 2 т.е. второй игрок

и для того, чтобы найти расстояние мы сдвиг вправо на 3 бита, которые возвращают 13 битов, как показано ниже 0000 +1001 0111 0010 = 2418 т.е. 2418 мм

0

Важно помнить, что значения количества игроков добавляются только в изображение глубины, если включено отслеживание скелета. Если отслеживание скелета отключено, номер игрока на каждой глубине установлен в 0.