如何将二进制文件拆分为不同的帧

时间:2014-09-10 22:39:07

标签: matlab image-processing computer-vision signal-processing kinect

所以我有一个非常大的二进制文件,其中包含大约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)

但是图片还没有。

1 个答案:

答案 0 :(得分:1)

好的,所以我们知道你的意见后的一些事情:

  1. 每帧为424 x 512
  2. 视频中每个元素的精确度为uint8
  3. 这是一个灰度视频,因此不会考虑颜色
  4. 我将假设您的数据以行主格式读取。请记住,如果要将数据作为矩阵读取,MATLAB将以列主格式读取数据,因此您必须先进行转置操作,并确保首先将数据读入转置矩阵。
  5. 我要做的是将每个帧放入单元格数组中的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);
    

    因此,如果您想访问i th 框架,您只需执行以下操作:

    frm = frames{i};
    

    作为额外奖励,您可以在MATLAB中将其作为movie来播放。我们可以做的是预先分配兼容播放电影的电影结构,然后当你运行movie命令时,这将为你播放帧。让我们指定10 fps的帧速率,这样它就会播放得足够慢以查看结果。因此,当你完成这样的事情时:

    %// 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
    

    请注意,电影只能以彩色方式播放,因此您必须将灰度图像人为地变为彩色。颜色框架是一个3D矩阵,每个2D切片会告诉您红色,绿色或蓝色的数量。对于灰度,这些切片中的每一个都是相同的,因此您只需复制每个切片的每个灰度帧。我用cat将灰度帧变成了3D矩阵。我还使用im2frame将每个图像转换为与movie兼容的电影帧结构。

    小警告

    我无法访问您的二进制文件,因此此代码未经测试。使用风险自负!