【问题标题】:Reading a depth png image from a dataset从数据集中读取深度 png 图像
【发布时间】:2013-03-01 19:40:29
【问题描述】:

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

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

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

由于深度图像应该有深度数据,我希望它有浮点值(他们说他们使用了 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;

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

我需要包含第 3 方库吗?

【问题讨论】:

    标签: c# image color-depth


    【解决方案1】:

    我自己试过了。通常深度数据是 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;
    

    我的输出:

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

    然后我尝试使用 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;
    
        }
    }
    

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

    【讨论】:

    • 我运行了您的代码并生成了相同的输出文件,但是此输出中似乎没有深度信息。与其说是深度信息,不如说它更像是一个二进制信息。我期待一个深度图像..
    • 好吧,事实证明,很可能,与我一开始想的相反,图像所包含的内容很可能并不多。感谢您的帮助。
    • @Sait,我今天检查一下。我们如何判断我们正在阅读的内容是否是深度信息?我正在使用 matplotlib python 查看黑色图像,我可以看到一只手的轮廓。我将鼠标悬停,我看到了一个变化的第三个值(除了 x,y),它看起来像相对距离。但正如我思考的那样,它也可能是灰色渐变色。如何判断距离?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2019-11-30
    • 2014-08-25
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多