所以我有一个非常大的二进制文件,其中包含大约70个视频帧的信息。
我使用以下
将二进制文件读入MATLABfid = 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)
但是图片还没有。
答案 0 :(得分:1)
好的,所以我们知道你的意见后的一些事情:
uint8
我要做的是将每个帧放入单元格数组中的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
兼容的电影帧结构。
我无法访问您的二进制文件,因此此代码未经测试。使用风险自负!