【问题标题】:Reading binary file data from MATLAB using fread()使用 fread() 从 MATLAB 读取二进制文件数据
【发布时间】:2020-06-09 19:34:19
【问题描述】:

我正在尝试使用位于以下位置的离线数据集: http://www.nlpr.ia.ac.cn/databases/handwriting/Offline_database.html.

但是,我无法处理数据(CASIA-HWDB1.0-1.2 gnt 文件)。 我使用了位于http://www.nlpr.ia.ac.cn/databases/Download/GntRead.cpp.pdf 的示例代码,但这无法编译。结果,我使用 MATLAB 读取数据,但由于显示的图像不合理,因此数据似乎无法正确读取。我的测试代码如下,它应该读取并显示一张图像:

fid = fopen("HWDB1.1trn_gnt.alz", 'rb', 'n','GB2312');
length= fread(fid, 1, 'uint32');
label= fread(fid, 2, 'int8');
width= fread(fid, 1, 'uint16');
height= fread(fid, 1, 'uint16');
bitmap=fread(fid, width*height, 'uint8');
imgtmp=reshape(bitmap, [height, width]);
imagesc(imgtmp)
fclose(fid)

显然这不起作用,因为我的宽度是 0,而对于图片来说不能这样!而且 imagesc 给出了一张噪声图片。

谢谢

【问题讨论】:

  • 你看label了吗?它有预期值吗?
  • 你也应该重塑为[width,height],然后转置。数据似乎按行存储,但 MATLAB 按列存储。
  • 它没有预期值(GB 2312 字符映射表)。可以肯定的是, fread(fid, 1, 'uint32') 行表示读取 4 个字节的数据并将其解释为 unit32 数据类型的单个数字,对吗?如果是这种情况,对于任意 n,fread(fid, n, 'uint32') 的解释是什么?我看到的文档似乎不够清楚。
  • 作为校验和,您可以检查length 是否等于(widthxheight)+10。此外,该文档没有指定数据的字节序,因此如果它不能以一种方式工作(默认情况下可能是您的机器的小字节序),请尝试将大于 1 字节的值读取为大字节序并查看值是否更有意义。

标签: matlab dataset fread


【解决方案1】:

我的问题可能很愚蠢,但您确定您正在阅读的文件是正确的吗?因为根据我的阅读,.alz 文件是存档文件,例如 .zip(而且我在您提供的链接上找不到您的文件)。

当你使用fread(fid,n,'uint32')时,matlab会读取一个uint32格式和n el的线向量

【讨论】:

  • 你是对的。我获得文件的数据集没有提到需要解压缩它们的任何内容(即使在我解压缩它们之后)。谢谢
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2011-12-27
  • 2016-04-19
相关资源
最近更新 更多