2013-03-01 4 views
1

Мы пытаемся использовать this American Sign Language dataset. В этом наборе данных есть изображения букв American Sign Language, как RGB, так и изображений глубины.Чтение глубины png изображения из набора данных

Я скачал набор данных по ссылке. Изображения RGB кажутся прекрасными, но изображения глубины полностью сплошные. Что-то не так.

Поскольку весь набор данных большой, и для их загрузки требуется время; Я загрузив пример RGB изображения и пример глубины изображения здесь:

An example RGB image An example depth image

Поскольку глубина изображения должны иметь данные о глубине, я ожидаю, что это имеет значения с плавающей точкой (они говорят, что они использовали 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; 

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

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

ответ

2

Я пробовал это сам. Обычно данные глубины составляют 16 бит. 13 старших бит содержат расстояние, а три младших бита содержат карту сегментации пользователя.

Карта сегментирования пользователя построена только в том случае, если отслеживание скелета активно, что, я считаю, не было в вашем примере. Хотя значения 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

Затем я попытался получить значения 16bit от изображения с WPF, потому что изображение 16bit полутоновой закодирован.

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

+0

Я запустил ваш код и выпустил тот же выходной файл, однако кажется, что в этом выходе нет информации о глубине. Вместо информации о глубине она больше похожа на двоичную. Я ожидал изображения глубины. – Sait

+0

Я обновил свой ответ. Надеюсь, что это поможет. – bitWorking

+0

Хорошо, оказалось, что, скорее всего, изображение не содержит больше, чем то, что я думал вначале. Спасибо за вашу помощь. – Sait

Смежные вопросы