0

Итак, у меня есть довольно большой двоичный файл, содержащий информацию о 70 видеокадрах.Как разбить бинарный файл на разные кадры

Я прочитал двоичный файл в MATLAB, используя следующую

fid = fopen('data.binary'); 
B = fread(fid,'int64'); 
fclose(fid); 

Но тогда переменная B еще содержит огромное количество данных. Поэтому мне было интересно, как мы можем разделить переменную B так, чтобы я мог получать данные из одного кадра только один за другим. Например, скажем, 30 FPS.

Возможно ли это?

Благодаря

PS: точность пикселя uint8 и размер 424X512 кадров. Это код, который я использую:

fid = fopen('C:\KinectData\Depth\Depth_Raw_0.binary'); 
B = fread(fid,'uint8'); 
fclose(fid); 

B = uint8(B); 

Z = B(1:217088) 

n = 424; % No. of columns of T 
BB = reshape(Z, n,[]); 

BB = uint8(BB); 

imshow(BB) 

Но изображение еще не совсем там.

+2

Знаете ли вы размер каждого кадра? Невозможно восстановить последовательность кадров, если вы не знаете, что это такое. Кроме того, какова точность каждого пикселя? 'Uint8'? 'Uint16'? 'int64' определенно невозможен, поскольку нет стандарта, который я знаю для видео, имеющего 64 бита на пиксель. Является ли это ** цветным ** видео или ** оттенком серого ** видео? Если это цвет, цветные пиксели чередуются или цветные каналы разделены плоскостью? Вы должны дать намного больше информации, прежде чем мы/я смогу ответить. – rayryeng

+0

@rayreng Привет Спасибо за ответ. Размер кадра составляет 512x412. Видео - черно-белое видео. Поэтому я просто хочу, чтобы каждый кадр был как картинка, поэтому я могу обрабатывать его по отдельности на MATLAB. Я не слишком уверен в точности пикселей. Код, который я использую, находится здесь: http://kinectstreamsaver.codeplex.com/ внизу страницы и да, видео с глубины от Kinect для XBOX. –

+0

ОК, я вижу код ниже. Да, можно читать по одному кадру за раз, но я не знаю, как структурированы эти данные. Похоже, вы читаете из нескольких потоков в одном кадре. Кроме того, код, на который вы ссылаетесь, выглядит так, как будто он пытается читать данные кватерниона, а не данные глубины. Не могли бы вы прояснить? – rayryeng

ответ

0

ОК, так что мы знаем кое-что данные Ваши комментарии:

  1. Каждый кадр 424 х 512
  2. Точность каждого элемента в вашем видео uint8
  3. Это черно-белое видео, поэтому цвет не будет рассматриваться
  4. Я собираюсь предположить, что ваши данные читаются в основном формате. Имейте в виду, что MATLAB считывает данные в формате основного столбца, если вы хотите читать данные в виде матрицы, поэтому вам нужно будет выполнить операцию транспонирования и убедиться, что вы сначала прочитаете данные в транспонированной матрице.

Что мне нужно сделать, это поместить каждый кадр в запись cell внутри массива ячеек. Причина, по которой я делаю это, состоит в том, что мы не знаем, сколько кадров действительно в вашей последовательности. Вы сказали «70 или около того» фреймов, и поскольку мы не знаем точного числа, мы будем динамически заполнять массив ячеек, когда мы идем.

Код, который вы написали, будет преимущественно одним и тем же, но мы будем запускать цикл while до тех пор, пока мы не будем читать из файла. В цикле while мы будем считывать один кадр за раз и хранить его в массиве ячеек. Я также сделаю счетчик, который подсчитывает количество кадров, которые у нас есть на потом, и вы поймете, почему. Таким образом:

%// Open the file 
fid = fopen('C:\KinectData\Depth\Depth_Raw_0.binary'); 
col = 424; %// Change if the dimensions are not proper 
row = 512; 

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(fin, [col row],'uint8=>uint8'); %// 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 
end 

%// Close the file  
fclose(fid); 

Как таковой, если вы хотите получить доступ к я й кадр, вы бы просто сделать:

frm = frames{i}; 

В качестве дополнительного бонуса, вы можете играть это как movie в MATLAB. Мы можем сделать предварительную выделение структуры фильма, которая совместима для воспроизведения фильма, а затем, когда вы запустите команду movie, это будет воспроизводить фреймы для вас. Давайте укажем частоту кадров 10 кадров в секунду, чтобы она играла достаточно медленно, чтобы увидеть результаты. Поэтому, когда вы сделали что-то вроде этого:

%// Preallocate the movie structure array 
movieFrames(numFrames) = struct('cdata',[],'colormap',[]); 

for idx = 1 : numFrames 
    img = frames{idx}; 
    movieFrames(idx) = im2frame(cat(3, img, img, img)); 
end 
figure; 
imshow(movieFrames(1).cdata); %// Show first frame to establish figure size 
movie(movieFrames, 1, 10); %// Play the movie once at 10 FPS 

Обратите внимание, что фильмы могут быть воспроизведены только в цвете, и поэтому вы должны сделать свое полутоновое изображение искусственно в цвет.Цветовая рамка представляет собой трехмерную матрицу, где каждый двумерный срез сообщает вам количество красного, зеленого или синего. Для оттенков серого каждый из этих фрагментов один и тот же, и поэтому вы просто будете копировать каждый оттенок серого для каждого фрагмента. Я использовал cat, чтобы сделать рамку в градациях серого в 3D-матрицу. Я также использую im2frame, чтобы преобразовать каждое изображение в структуру кадра фильма, совместимую с movie.

Маленький нюанс

У меня нет доступа к двоичному файлу, так что этот код не тестировался. Используйте на свой риск!

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