2015-03-09 4 views
1

У меня есть .binary файл, содержащий данные глубины от датчика kinect.Преобразование двоичного файла в изображение

Я пытаюсь пройти через .binary файл и вернуть фактическое изображение в MATLAB. Так что это программа MATLAB, что я придумал:

fid = fopen('E:\KinectData\March7Pics\Depth\Depth_Raw_0.binary'); 
col = 512; %// Change if the dimensions are not proper 
row = 424; 
frames = {}; %// Empty cell array - Put frames in here 
numFrames = 0; %// Let's record the number of frames too 
while (true) %// Until we reach the end of the file: 
    B = fread(fid, [col row],'ushort=>ushort'); %// Read in one frame at a time 

if (isempty(B)) %// If there are no more frames, get out 
    break; 
end 


frames{end+1} = B.'; %// Transpose to make row major and place in cell array 
numFrames = numFrames + 1; %// Count frame 
    imwrite(frames{numFrames},sprintf('Depth_%03d.png',numFrames)); 
end 

%// Close the file  
fclose(fid); 
frm = frames{1}; 
imagesc(frm) 
colormap(gray) 

выше программа работает нормально, но это не дало бы мне все Thats изображение выше 99. То есть, я бы обрабатывать .binary файл и последнее изображение, которое я получил, - Depth_099.png, хотя полное видео имеет больше, чем это.

Кто-нибудь знает y? Спасибо

+0

Почему бы вам просто не использовать% 04d, если вам нужно больше цифр? % 03d ограничивает имя файла на 3 цифры и заполнение 0. –

+0

Этот код содержится в более длинном цикле while, который выполняет итерацию по номеру кадра? Не могли бы вы разместить весь код, если так? – eigenchris

+0

Да, я пробовал это, но, к сожалению, повышение точности не работает. И нет, это не внутри цикла while. –

ответ

2

Причина, по которой вы не получаете изображения выше 99, объясняется тем, как вы форматируете свое целое число при создании строки имени файла при чтении в файле. В частности, здесь:

imwrite(frames{numFrames},sprintf('Depth_%03d.png',numFrames)); 

%03d.png означает, что вы только указать до 3 цифр точности, и поэтому 999 это максимум вы получите. Если вы превзошли 999, ваши персонажи для вашего имени файла также будут расширяться, например, Depth_1000.png или Depth_124141.png. %03d в строке форматирования гарантирует, что ваш номер имеет три цифры точности, нулевое заполнение слева от номера, чтобы обеспечить, чтобы у вас было много цифр. Если вы хотите сохранить одинаковое количество символов для вашего имени файла, один исправить это, вероятно, увеличит число цифр точности, что-то вроде:

imwrite(frames{numFrames},sprintf('Depth_%05d.png',numFrames)); 

Таким образом, длина строки будет больше, и идя с вашей конвенцией, вы получите до 'Depth_99999.png'. Если вы выйдете за рамки этого, ваши имена файлов соответственно увеличатся. Если вы укажете %05d, вы гарантированно получите 5 цифр точности, нулевое заполнение тех чисел, которые имеют менее 5 цифр соответственно.

В зависимости от того, сколько кадров в вашем видео содержится, соответствующим образом скорректируйте число.


Однако, учитывая ваши комментарии ниже .... это может быть просто, что у вас есть только 99 кадров данных:) ... но точность наконечник, который я уже упоминал выше, следует, безусловно, будет полезно.

+0

Я допускаю, что меня тоже путают. Почему 3-значные целые числа останавливаются на '099'? Должен ли '% 03d' давать вам три 3 цифры, только нулевые нули? 'sprintf ('Depth_% 03d.png', 134)' дает мне результат 'Depth_134.png'. – eigenchris

+0

@eigenchris - Да, я думаю, что OP означал 999, а не 099. В любом случае, я думаю, что увеличение числа цифр точности должно помочь! – rayryeng

+0

Ах. Это имеет смысл. :) – eigenchris

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