Обнаружение и отображение количества игроков, обнаруженных с помощью Kinect

Я пытаюсь отобразить количество игроков, обнаруженных датчиком Kinect, с помощью приложения WPF. В дополнение к отображению количества игроков я также раскрасил пиксели в зависимости от их расстояния от 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;
    }

Текущая цель -

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

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

Спасибо!

Скриншоты:

1 ответ

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

Затем установите эту переменную, используя процедуру видеокадра (не определяйте ее там).

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

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

Другие вопросы по тегам