Matlab 如何将二进制文件拆分为不同的帧
所以我有一个相当大的二进制文件,它包含了大约70个视频帧的信息 我使用以下命令将二进制文件读入MATLABMatlab 如何将二进制文件拆分为不同的帧,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
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)
但是情况还不完全清楚。好的,根据您的评论,我们知道一些事情:
uint8
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
进行修改。加载视频和逐帧读取视频的文档非常好。