我有一个.binary文件,其中包含来自kinect传感器的深度数据。
我正在尝试浏览.binary文件并在MATLAB中获取实际图像。所以这是我提出的MATLAB程序:
fid = fopen('E:\KinectData\March7Pics\Depth\Depth_Raw_0.binary');
col = 512; %// Change if the dimensions are not proper
row = 424;
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(fid, [col row],'ushort=>ushort'); %// 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
imwrite(frames{numFrames},sprintf('Depth_%03d.png',numFrames));
end
%// Close the file
fclose(fid);
frm = frames{1};
imagesc(frm)
colormap(gray)
以上程序运行正常,但它不会给我任何99以上的图像。 也就是说,我将处理.binary文件,我获得的最后一张图像是Depth_099.png,即使完整的视频有更多。
有谁知道吗? 感谢
答案 0 :(得分:2)
你没有得到99以上图像的原因是你在格式中指定整数,因为你在文件中读到时正在创建文件名字符串。具体来说,这里:
imwrite(frames{numFrames},sprintf('Depth_%03d.png',numFrames));
%03d.png
表示您只指定精确度为 3 的数字,因此999
是您获得的最大值。如果超过999
,则您文件名的字符也会扩大,例如Depth_1000.png
或Depth_124141.png
。格式化字符串中的%03d
可确保您的号码具有三位精度,数字左侧为零填充,以确保您拥有那么多位数。如果要为文件名保持相同的字符数,一个修复可能会增加精度的位数,如:
imwrite(frames{numFrames},sprintf('Depth_%05d.png',numFrames));
这样,字符串的长度会更长,按照惯例,你将达到'Depth_99999.png'
。如果超出此范围,那么您的文件名将相应地增加字符数。如果指定%05d
,则保证精度为5位,对相应小于5位的数字进行零填充。
视视频所包含的帧数而定,请相应调整数字。
然而,鉴于您的评论如下......可能只是您只有99帧数据:) ...但我上面提到的精确提示应该是有用的。