-1

Kinect SDKを使用していて、カラーフレームを追加しようとしています。私はコードを使用しています:

byte[] pixels = new byte[sensor.ColorStream.FramePixelDataLength];

WriteableBitmap image = new WriteableBitmap(sensor.ColorStream.FrameWidth, sensor.ColorStream.FrameHeight, 96, 96,
        PixelFormats.Bgra32, null);

video.Source = image;

colorFrame.CopyPixelDataTo(pixels);

image.WritePixels(new Int32Rect(0, 0, image.PixelWidth, image.PixelHeight), pixels, image.PixelWidth * sizeof(int), 0);

しかし、画像は表示されていません。仰角を変更できるので、Kinectに接続できることはわかっています。私は何が間違っているのですか?前もって感謝します。注:Coding4Funの使用を避けようとしています

4

1 に答える 1

0

いや、あなたはとても近かった。videoWPFイメージだと思います。

private WriteableBitmap wBitmap; 
private byte[] pixels;

private void WindowLoaded(...)
{
    //set up kinect first, but don't start it
    ...

    pixels = new byte[sensor.ColorStream.FramePixelDataLength];

    wBitmap = new WriteableBitmap(sensor.ColorStream.FrameWidth, sensor.ColorStream.FrameHeight, 
        96, 96, PixelFormats.Bgra32, null);

    video.Source = wBitmap;

    sensor.Start();
}

private void ColorFrameReady(object sender, ColorImageFrameReadyArgs e)
{
    using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
    {
        if (colorFrame == null)
        {
            return;
        }


        colorFrame.CopyPixelDataTo(pixels);

        wBitmap.WritePixels(new Int32Rect(0, 0, wBitmap.PixelWidth, wBitmap.PixelHeight),
            pixels, image.PixelWidth * 4, 0);
    }
}

すべてのフレームで新しいBitmapSourceを作成する必要はありません。最初に単一のWriteableBitmapを作成し、各フレームでそれを更新する方がはるかに優れています。

また、以前に画像が表示されなかった理由は、実際には更新されていなかったためではありませんでした。絶対にそうだったが、見えなかった。WriteableBitmap形式をBgra32に設定します。ここで、aはアルファです。KinectはBgr32形式でデータを送信します。アルファチャネルは設定されていません。したがって、Bgra32ビットマップを作成すると、Kinectがアルファチャネルを0に設定したままになっていることがわかります。したがって、画像は完全に透明として表示されます。

于 2012-07-30T14:39:05.927 に答える