代码改变世界

读取siftgeo格式文件的matlab程序

2015-07-08 21:01  GarfieldEr007  阅读(398)  评论(0编辑  收藏  举报
% This function reads a siftgeo binary file %读取siftgeo格式的二进制文件
%
% Usage: [v, meta] = siftgeo_read (filename, maxdes)
%   filename    the input filename
%   maxdes      maximum number of descriptors to be loaded 要加载的描述子最大数量
%   (default=unlimited)%默认无限制
%
% Returned values %返回值
%   v           the sift descriptors (1 descriptor per line) %每行一个sift描述子
%   meta        meta data for each descriptor, i.e., per line: %每个描述子的元数据
%               x, y, scale, angle, mi11, mi12, mi21, mi22, cornerness
function [v, meta] = siftgeo_read (filename, maxdes) 

if nargin < 2 %nargin:number of arguments input %nargout:number of arguments ouput
  maxdes = 100000000; %1亿
end
  
% open the file and count the number of descriptors
fid = fopen (filename, 'r');
 
fseek (fid, 0, 1); %fseek(fid, 0, 'eof'); 跳到文件末尾 %'bof' or -1   Beginning of file;  'cof' or  0   Current position in file;  'eof' or  1   End of file
n = ftell (fid) / (9 * 4 + 1 * 4 + 128); %n是descriptors的数量 %return the current position (number of bytes from the file beginning)
fseek (fid, 0, -1); %fseek(fid, 0, 'bof') 跳到文件开头


if n > maxdes
  n = maxdes;
end;

% first read the meta information associated with the descriptor
meta = zeros (n, 9, 'single'); %n*9矩阵
v = zeros (n, 128, 'single'); %n*128矩阵

% read the elements
for i = 1:n %n是要读区的descriptors数量
  meta(i,:) = fread (fid, 9, 'float'); %(float)*9 元数据信息
  d = fread (fid, 1, 'int'); %(int)*1
  v(i,:) = fread (fid, d, 'uint8=>single'); %(uint8=>single)*d 描述子
end

fclose (fid);