从数据集中读取深度png图像

时间:2013-03-01 19:40:30

标签: c# image color-depth

我们正在尝试使用this American Sign Language dataset。此数据集包含美国手语字母的图片,包括RGB和深度图像。

我从链接下载了数据集。 RGB图像看起来很好,但深度图像完全是纯黑色。出了点问题。

由于所有数据集都很大,下载所有数据集需要时间;我在这里上传了一个示例RGB图像和示例深度图像:

An example RGB image An example depth image

由于深度图像应该具有深度数据,我希望它具有浮点值(他们说他们使用Kinect和Kinect提供浮点值)。如何使用C#读取这些浮点像素?我尝试了以下方法:

Bitmap bmp = new Bitmap("depth_0_0002.png");
int R = bmp.GetPixel(0,0).R;
int G = bmp.GetPixel(0,0).G;
int B = bmp.GetPixel(0,0).B;

但是,我需要浮点像素,这些是整数,它们有无意义的值。

我是否需要加入第三方库?

1 个答案:

答案 0 :(得分:2)

我自己尝试过。通常,深度数据是16位值。 13个高位包含距离,3个低位包含用户分段图。

用户细分地图仅在骨架跟踪处于活动状态时生成,我相信这不在您的示例中。虽然rgb值是24位,但似乎有效。我从分段的手中得到一张图片。

Bitmap bmpOrg = new Bitmap("bKawM.png");
Bitmap bmp = new Bitmap(106, 119);

for (int i = 0; i < 106;i++ )
{
    for (int j = 0; j < 119;j++ )
    {
        Color rgb = bmpOrg.GetPixel(i, j);

        int bit24 = (rgb.B << 16 + rgb.G << 8 + rgb.R);
        int user = bit24 & 0x07;
        int realDepth = bit24 >> 3;

        bmp.SetPixel(i, j, Color.FromArgb(realDepth));
    }
}

pictureBox1.Image = bmp;

我的输出:

this is what it looks

我再次玩过它。首先,我增加了Photoshop中的亮度和对比度。 因此,如果您不需要以毫米为单位的实际深度值,则可以使用rgb值。

increased brightness and contrast

然后我尝试用WPF从图像中获取16位值,因为图像是16位灰度编码。

Stream imageStreamSource = new FileStream("bKawM.png", FileMode.Open, FileAccess.Read, FileShare.Read);
PngBitmapDecoder decoder = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];

int height = bitmapSource.PixelHeight;
int width = bitmapSource.PixelWidth;
int stride = width * ((bitmapSource.Format.BitsPerPixel + 7) / 8);

byte[] bytes = new byte[height * stride];
bitmapSource.CopyPixels(bytes, stride, 0);

for (int x = 0; x < width; x++)
{
    for (int y = 0; y < height; y++)
    {
        byte low = bytes[y * stride + x + 0];
        byte high = bytes[y * stride + x + 1];

        ushort bit16 = (ushort)((high << 8) | low);

        int user = bit16 & 0x07;
        int realDepth = bit16 >> 3;

    }
}

我用深度值创建了一个新图像,看起来很奇怪。我找不到任何信息 图像包含哪些数据。我不知道它是否包含userdata(3位),或者在保存到文件之前是否以某种方式转换了深度。