Чтение глубинного изображения png из набора данных

Мы пытаемся использовать этот набор данных американского языка жестов. В этом наборе данных есть изображения букв американского языка жестов, как RGB, так и изображения глубины.

Я скачал набор данных по ссылке. Изображения 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;

Однако мне нужны пиксели с плавающей запятой, они целые и имеют бессмысленные значения.

Нужно ли мне включать стороннюю библиотеку?


person Sait    schedule 01.03.2013    source источник


Ответы (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;

Мой вывод:

вот как это выглядит

Я снова играл с этим. Сначала я увеличил яркость и контраст в фотошопе. Таким образом, значения 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 бита) или глубина каким-то образом преобразована перед сохранением в файл.

person bitWorking    schedule 01.03.2013
comment
Я запустил ваш код и создал тот же выходной файл, однако похоже, что в этом выводе нет информации о глубине. Вместо информации о глубине она больше похожа на двоичную. Я ожидал изображения глубины .. - person Sait; 04.03.2013
comment
Ладно, оказалось, что, скорее всего, изображение не содержит большего, чем я думал вначале. Спасибо за вашу помощь. - person Sait; 05.03.2013
comment
@Sait, я проверю это сегодня. Как мы можем определить, является ли то, что мы читаем, глубинной информацией? Я использую matplotlib python для просмотра черного изображения, и я вижу силуэт руки. Я наведу указатель мыши и вижу другое третье значение (в дополнение к x, y), которое выглядело как относительное расстояние. Но, как я думаю, это также может быть серый градиентный цвет. Как определить расстояние? - person eigenfield; 03.06.2021