为什么不显示彩色图像?

时间:2012-07-28 01:36:38

标签: c# wpf image image-processing kinect

我正在使用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

1 个答案:

答案 0 :(得分:0)

不,你太近了。我假设video是WPF图像。

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是alpha。 Kinect以Bgr32格式发送数据;没有设置alpha通道。因此,当您创建Bgra32位图时,它会看到Kinect将Alpha通道设置为0,因此图像显示为完全透明。