因为最近使用labelImg软件标注训练图片,如果图片有目标区域就标注,没有当然就不用就标注了,标注文件保存在当前图片文件夹下,这样当标注完一批图片后你将看到,好多图片和图片对应的标注文件(.xml格式),还有没有标注的图片:
那么问题来了:如何从这些文件中取出标注的文件图片(标注文件很好取,可以用.xml后缀名使用文件过滤器来筛选)?手动选取?如果这有十几张图片还勉强可行,多了眼睛都花了,我要达到的目的是从这些文件中取出标注的图片,而我们知道只用标注过的图片含有标注文件,而他们的文件名是相同,这是有规律的,有规律的事最适合程序来干了,基于这样的情况,还是写个小程序便捷,得了下面就用Matlab写了个程序。
Matlab中有个函数 movefile就是完成这个事情的主要函数,大致简介一点:
算了我还是直接粘贴help文档吧,简介明了,只做个别注解。
movefile('source')
movefile('source','destination')#把source 移动destination
movefile('source','destination','f
')#强行把source 移动destination,即使source只有只读属性
[status,message,messageid] = movefile(___)
好了现在就上完整代码:
%2018/09/05 by DQ
clc;
clear;
close all;
OriginalFolderName='temp';
AnotFolder='C:\Users\Administrator\Desktop\windows_v1.6.0\ImageSet\NewAppendIm';
%创建一个文件夹用于放置含有标注的图片和标注文件
ValidAnotName=strcat('Valid',OriginalFolderName);
ValidAnotFolder=fullfile(AnotFolder,ValidAnotName);
if ~exist(ValidAnotFolder,'dir')
mkdir(ValidAnotFolder);
end
%选出含有标注的文件和图片
AnotFileSet=dir(strcat(AnotFolder,'\*.xml'));
AnotFileNum=length(AnotFileSet);
for i=1:AnotFileNum
AnotFileName=AnotFileSet(i).name;
AnotFilePath=fullfile(AnotFolder,AnotFileName);
ImFileName=strcat(AnotFileName(1:end-4),'.jpg');
ImFilePath=fullfile(AnotFolder,ImFileName);
movefile(AnotFilePath,ValidAnotFolder);%标注文件移动到指定的文件夹下
movefile(ImFilePath,ValidAnotFolder);%标注图片移动到指定的文件夹下
end
%创建一个文件夹用于放置未标注图片
InvalidFolderName=strcat('Invalid',OriginalFolderName);
InvalidImFolder=fullfile(AnotFolder,InvalidFolderName);
if ~exist(InvalidImFolder,'dir')
mkdir(InvalidImFolder);
end
InvalidImSet=dir(strcat(AnotFolder,'\*.jpg'));
ImFileNum=length(InvalidImSet);
for i=1:ImFileNum
ImFileName=InvalidImSet(i).name;
ImFilePath=fullfile(AnotFolder,ImFileName);
movefile(ImFilePath,InvalidImFolder);
end
% %一种简洁的操作
% InvalidFolderName=strcat('Invalid',OriginalFolderName);
% InvalidImFolder=fullfile(AnotFolder,InvalidFolderName);
% InvalidIms=strcat(AnotFolder,'\*.jpg');
% movefile(InvalidIms,InvalidImFolder,'f')%移动文件夹下所有含有.jpg后缀名的图片,'f'表示如果放置的文件夹不存在自动创建一个
至此就完成了把标注图片及标注文件从杂乱的文件中取出来了