1

このアメリカ手話データセットを使用しようとしています。このデータセットには、アメリカ手話の文字の画像、RGB画像と深度画像の両方が含まれています。

リンクからデータセットをダウンロードしました。RGB画像は問題ないように見えますが、深度画像は完全に黒一色です。何かが間違っている。

すべてのデータセットが大きく、すべてをダウンロードするには時間がかかるため、ここに、RGB画像の例と深度画像の例をアップロードしています。

RGB画像の例 深度画像の例

深度画像には深度データが含まれている必要があるため、float値が含まれていると思います(Kinectを使用しており、Kinectがfloat値を提供しているとのことです)。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;

ただし、floatピクセルが必要です。これらは整数であり、意味のない値があります。

サードパーティのライブラリを含める必要がありますか?

4

1 に答える 1

3

私はそれを自分で試しました。通常、深度データは 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 値を使用できます。

明るさとコントラストの向上

次に、画像が16ビットグレースケールでエンコードされているため、WPFを使用して画像から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ビット)が含まれているのか、ファイルに保存する前に深度が何らかの形で変換されているのかはわかりません。

于 2013-03-01T21:50:21.407 に答える