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

Matlab 如何将二进制文件拆分为不同的帧,matlab,image-processing,computer-vision,signal-processing,kinect,Matlab,Image Processing,Computer Vision,Signal Processing,Kinect,所以我有一个相当大的二进制文件,它包含了大约70个视频帧的信息 我使用以下命令将二进制文件读入MATLAB fid = fopen('data.binary'); B = fread(fid,'int64'); fclose(fid); 但是变量B仍然包含大量数据。所以我想知道如何分割变量B,这样我就可以从一个帧中一个接一个地获取数据。比如说每秒30帧 这可能吗 谢谢 PS:像素精度为uint8,帧大小为424X512。这是我正在使用的代码: fid = fopen('C:\KinectDat

所以我有一个相当大的二进制文件,它包含了大约70个视频帧的信息

我使用以下命令将二进制文件读入MATLAB

fid = fopen('data.binary');
B = fread(fid,'int64');
fclose(fid);
但是变量
B
仍然包含大量数据。所以我想知道如何分割变量B,这样我就可以从一个帧中一个接一个地获取数据。比如说每秒30帧

这可能吗

谢谢

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)

但是情况还不完全清楚。

好的,根据您的评论,我们知道一些事情:

  • 每帧为424 x 512
  • 视频中每个元素的精度为
    uint8
  • 这是一个灰度视频,所以不考虑颜色
  • 我假设您的数据是以行主格式读取的。请记住,如果希望以矩阵形式读入数据,MATLAB将以列主格式读入数据,因此必须执行转置操作,并确保首先将数据读入转置矩阵 我要做的是把每一帧放到一个单元格数组中的一个条目中。我这样做的原因是因为我们不知道你的序列中到底有多少帧。你说的是“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帧,只需执行以下操作:

    frm = frames{i};
    
    作为额外的奖励,您可以在MATLAB中将其作为一个游戏来玩。我们可以做的是预先分配一个与播放电影兼容的电影结构,然后当您运行
    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切片告诉您红色、绿色或蓝色的数量。对于灰度,每个切片都是相同的,因此您只需为每个切片复制每个灰度帧。我曾经将灰度帧制作成3D矩阵。我还使用将每个图像转换为与
    电影
    兼容的电影帧结构

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

    你知道每一帧的大小吗?除非您知道这是什么,否则无法重建帧序列。另外,每个像素的精度是多少<代码>uint8<代码>uint16
    int64
    绝对不可能,因为据我所知,对于每像素64位的视频,没有标准。这是彩色视频还是灰度视频?如果这是颜色,颜色像素是交错的,还是颜色通道由平面分隔?您需要提供更多信息,我们/我才能回答。@rayreng Hi感谢您的回复。框架的大小为512x412。该视频是灰度视频。所以我只希望每一帧都是一张图片,这样我就可以在MATLAB上单独处理它。我对像素精度不是很确定。我使用的代码来自这里:页面底部,是的,深度视频来自Kinect for XBOX one。好的,我看到下面的代码。是的,一次读取一帧是可能的,但我不知道数据是如何构造的。看起来您在一个帧中读取多个流。此外,您引用的代码看起来像是试图读入四元数数据,而不是深度数据。你能澄清一下吗?我引用的代码试图给出关节坐标的输出。然而,我对此并不感兴趣。我只想处理囚犯物体的深度图像。因此,不是fid=fopen('C:\KinectData\Skel\liTimeStamp.binary');我只是在使用fopen('C:\KinectData\Depth\u data.binary'),它只包含深度数据,其他什么都不包含。@rayeng您好。我现在明白您所说的数据类型了。因此像素精度是uint8而不是int64,每帧分辨率是424X512。这就是我使用的代码:参见编辑。再次感谢您的帮助!这是否适用于任何视频格式?@Canadian_Republican这只适用于问题中提到的特定格式。例如,任何其他视频格式都必须使用
    VideoReader
    进行修改。加载视频和逐帧读取视频的文档非常好。