Kinect Depth FPS在检测到人体时显着减慢

时间:2012-07-28 17:56:48

标签: c# wpf kinect frame-rate depth

我有一个应用程序,我创建自己的深度框架(使用Kinect SDK)。问题是当检测到人的深度的FPS(然后颜色也是如此)显着减慢时。 Here是画面减速时的电影。我正在使用的代码:

        using (DepthImageFrame DepthFrame = e.OpenDepthImageFrame())
        {
            depthFrame = DepthFrame;
            pixels1 = GenerateColoredBytes(DepthFrame);

            depthImage = BitmapSource.Create(
                depthFrame.Width, depthFrame.Height, 96, 96, PixelFormats.Bgr32, null, pixels1,
                depthFrame.Width * 4);

            depth.Source = depthImage;
        }

...

    private byte[] GenerateColoredBytes(DepthImageFrame depthFrame2)
    {
        short[] rawDepthData = new short[depthFrame2.PixelDataLength];
        depthFrame.CopyPixelDataTo(rawDepthData);

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

        const int BlueIndex = 0;
        const int GreenIndex = 1;
        const int RedIndex = 2;


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

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

            byte intensity = CalculateIntensityFromDepth(depth);
            pixels[colorIndex + BlueIndex] = intensity;
            pixels[colorIndex + GreenIndex] = intensity;
            pixels[colorIndex + RedIndex] = intensity;

            if (player > 0)
            {
                pixels[colorIndex + BlueIndex] = Colors.Gold.B;
                pixels[colorIndex + GreenIndex] = Colors.Gold.G;
                pixels[colorIndex + RedIndex] = Colors.Gold.R;
            }
        }

        return pixels;
    }

FPS对我来说非常重要,因为我正在创建一个可以在检测到人物时保存照片的应用程序。如何保持更快的FPS?为什么我的应用程序这样做?

1 个答案:

答案 0 :(得分:7)

G.Y是正确的,你没有妥善处理。您应该重构代码,以便尽快处理DepthImageFrame。

...
private short[] rawDepthData = new short[640*480]; // assuming your resolution is 640*480

using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
{
    depthFrame.CopyPixelDataTo(rawDepthData);
}

pixels1 = GenerateColoredBytes(rawDepthData);    
...

private byte[] GenerateColoredBytes(short[] rawDepthData){...}

您说您正在使用应用程序中其他位置的深度框架。这是不好的。如果您需要深度框架中的某些特定数据,请单独保存。

dowhilefor也是正确的,你应该看看使用WriteableBitmap,它非常简单。

private WriteableBitmap wBitmap;

//somewhere in your initialization
wBitmap = new WriteableBitmap(...);
depth.Source = wBitmap;

//Then to update the image:
wBitmap.WritePixels(...);

此外,您正在创建新阵列以在每个帧上反复存储像素数据。您应该将这些数组创建为全局变量,一次创建它们,然后在每一帧上覆盖它们。

最后,虽然这不会产生很大的不同,但我对你的CalculateIntensityFromDepth方法感到好奇。如果编译器没有内联该方法,那就是很多无关的方法调用。尝试删除该方法,只需编写现在方法调用的代码。