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(...);

また、フレームごとにピクセル データを何度も格納するための新しい配列を作成しています。これらの配列をグローバル変数として作成し、1 回だけ作成してから、フレームごとに上書きする必要があります。

最後に、これは大きな違いにはなりませんが、あなたの CalculateIntensityFromDepth メソッドに興味があります。コンパイラがそのメソッドをインライン化していない場合、それは多くの無関係なメソッド呼び出しです。そのメソッドを削除して、メソッド呼び出しが現在ある場所にコードを記述してみてください。

于 2012-07-30T14:20:44.883 に答える