0

我有一个应用程序,可以在其中创建自己的深度框架(使用 Kinect SDK)。问题是当检测到人类时,深度的 FPS(然后是颜色)会显着减慢。是一个帧变慢的电影。我正在使用的代码:

        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?为什么我的应用程序会这样做?

4

1 回答 1

7

GY 是正确的,您没有正确处理。您应该重构您的代码,以便尽快处理掉 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 方法。如果编译器没有内联该方法,那就是很多无关的方法调用。尝试删除该方法,然后在当前调用方法的位置编写代码。

于 2012-07-30T14:20:44.883 回答