txt文件按以下格式组织:
image filename
n (number of objects of interest in the image)
bounding box for object 1
bounding box for object 2
...
bounding box for object n
例如,txt文件中的内容如下所示:
images/1.jpg
1
39.284331 23.721327 88.000000 135.915360
images/2.jpg
4
107.912089 129.898400 62.372022 89.263200
186.266100 61.768245 64.831800 106.847910
298.909724 34.289100 73.830894 105.977200
135.454600 -63.205613 109.739600 176.375026
images/3.jpg
2
136.462492 18.762699 121.522126 187.348778
333.601798 18.139177 104.944018 155.239682
我现在想要将文件读入一个结构数据(N * 1,其中N等于图像数),其中包含三个字段,文件名,对象数和边界框。有没有一种有效的方法来实现这一目标?
答案 0 :(得分:1)
没有一种简单的方法来解析文件并保留标题。您可以使用textscan来获取每个条目的数据,但是您没有获得标题。这可能满足您的需求,但我猜测您会想要相应边界框的文件名。有关此问题的Mathworks文档可以在here找到。在您的情况下,可以使用
轻松解析 A = textscan(fid,'%f %f %f %f','HeaderLines',2)
。
然后可以重复此操作,直到您到达文件末尾。
或者,您可以将fgetl
与textscan
结合使用来首先解析标头,然后读取块数据。下面是一个实现。请注意,下面的实现假设每个块一个接一个地出现,没有空格。您可能希望根据用例添加更强大的功能。
function [ data ] = parseTestSO( filename )
fid = fopen(filename);
% automatically close the file when cleanupFunction goes out of scope
cleanupFunction = onCleanup(@()fclose(fid));
% define the struct
n = 1;
while ~feof(fid) % repeat the read until all entries are parsed
data(n).filename = fgetl(fid); % gets the filename
data(n).numEntries = str2double(fgetl(fid)); % gets the number of entries
tempVal = textscan(fid,'%f %f %f %f'); % read formatted data block until next non-matching line
data(n).values = [tempVal{:}]; % transform the returned cell array into an nx4 array
n = n+1;
end
end
答案 1 :(得分:0)
fileID = fopen('yourfile.txt','rt');
data = textscan(fileID,'%s','delimiter','\n');
C = data{1} ;
fclose(fileID);
IdxC = strfind(C, 'images');
Idx = find(not(cellfun('isempty', IdxC)));
nimages = length(Idx) ; % total number of images
iwant = struct ; % initialize structure
for i = 1:nimages-1
iwant(i).name = C{Idx(i)} ;
iwant(i).no_objects = str2num(C{Idx(i)+1}) ;
iwant(i).bounding_box = C((Idx(i)+2):(Idx(i+1)-1)) ;
end
iwant(nimages).name = C(Idx(nimages)) ;
iwant(nimages).no_objects = C(Idx(nimages)+1) ;
iwant(nimages).bounding_box = C(Idx(nimages)+2:end) ;