车牌识别(二)批量提取文件夹下面的图片

matlab版本

打开文件选择单图像
[filename, path]=uigetfile('*.*','open');
c1=[path filename];
I1 = imread(c1);
单文件选择批量图片
file_path =  '.\data\';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像
img_num = length(img_path_list);%获取图像总数量
if img_num > 0 %有满足条件的图像
        for j = 1:img_num %逐一读取图像
            image_name = img_path_list(j).name;% 图像名
            image =  imread(strcat(file_path,image_name));
            fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));% 显示正在处理的图像名
            %图像处理过程 省略
        end
end
读取文件夹以及子文件夹所有图像
p = genpath('.\data');% 获得文件夹data下所有子文件的路径,这些路径存在字符串p中,以';'分割
length_p = size(p,2);%字符串p的长度
path = {};%建立一个单元数组,数组的每个单元中包含一个目录
temp = [];
for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中
    if p(i) ~= ';'
        temp = [temp p(i)];
    else 
        temp = [temp '\']; %在路径的最后加入 '\'
        path = [path ; temp];
        temp = [];
    end
end  
clear p length_p temp;
%至此获得data文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,存于数组path中。
%下面是逐一文件夹中读取图像
file_num = size(path,1);% 子文件夹的个数
for i = 1:file_num
    file_path =  path{i}; % 图像文件夹路径
    img_path_list = dir(strcat(file_path,'*.jpg'));
    img_num = length(img_path_list); %该文件夹中图像数量
    if img_num > 0
        for j = 1:img_num
            image_name = img_path_list(j).name;% 图像名
            image =  imread(strcat(file_path,image_name));
            fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));% 显示正在处理的路径和图像名
            %图像处理过程 省略
        end
    end
end
建立读取图像并且建立Mat类
clear 
close all

p = genpath('E:\车牌\新建文件夹 (2)\20160427');% 获得文件夹data下所有子文件的路径,这些路径存在字符串p中,以';'分割
length_p = size(p,2);%字符串p的长度
path = {};%建立一个单元数组,数组的每个单元中包含一个目录
temp = [];
for i = 1:length_p %寻找分割符';',一旦找到,则将路径temp写入path数组中
    if p(i) ~= ';'
        temp = [temp p(i)];
    else 
        temp = [temp '\']; %在路径的最后加入 '\'
        path = [path ; temp];
        temp = [];
    end
end  
clear p length_p temp;
%至此获得data文件夹及其所有子文件夹(及子文件夹的子文件夹)的路径,存于数组path中。
%下面是逐一文件夹中读取图像
%建立矩阵(图片大小要相同)
num=0;
allimage=[];
file_num = size(path,1);% 子文件夹的个数
for i = 1:file_num
    file_path =  path{i}; % 图像文件夹路径
    img_path_list = dir(strcat(file_path,'*.jpg'));
    img_num = length(img_path_list); %该文件夹中图像数量
    if img_num > 0
        for j = 1:img_num
            image_name = img_path_list(j).name;% 图像名
            image =  imread(strcat(file_path,image_name));
            fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));% 显示正在处理的路径和图像名
            %图像处理过程 省略
            num=num+1;
            allimage = [allimage,image];
            if (mod(num,200)==0 )
                ii=num2str(num/200);
                chepai=strcat(ii,'.mat');
                save(chepai,'allimage','num');
                allimage=[];
            end   %每200张图建立一个mat类
        end
    end
end
                chepai=strcat(num2str(num/200+1),'.mat');
                save(chepai,'allimage','num');%余下的构成一个mat

opencv版本

打开单图像
    srcImage = cv::imread("E:\\learning opencv 程序\\2\\颜末.jpg");
遍历文件夹图像

原文出处
C/C++遍历文件夹和文件
本方法可用于windows和linux双平台,采用C/C++标准库函数。

库函数

包含头文件 #include <io.h>

用到数据结构_finddata_t,文件信息结构体的指针。

1.  struct _finddata_t  
2.  {  
3.  unsigned attrib;     //文件属性  
4.  time_t time_create;  //文件创建时间  
5.  time_t time_access;  //文件上一次访问时间  
6.  time_t time_write;   //文件上一次修改时间  
7.  _fsize_t size;  //文件字节数  
8.  char name[_MAX_FNAME]; //文件名  
9.  };  

文件属性是无符号整数,取值为相应的宏:_A_ARCH(存档),_A_SUBDIR(文件夹),_A_HIDDEN(隐藏),_A_SYSTEM(系统),_A_NORMAL(正常),_A_RDONLY(只读)。容易看出,通过这个结构体,我们可以得到关于该文件的很多信息。结合以下函数,我们可以将文件信息存储到这个结构体中:

1.  //按FileName命名规则匹配当前目录第一个文件  
2.  _findfirst(_In_ const char * FileName, _Out_ struct _finddata64i32_t * _FindData);   
3.  //按FileName命名规则匹配当前目录下一个文件  
4.  _findnext(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);  
5.  //关闭_findfirst返回的文件句柄  
6.  _findclose(_In_ intptr_t _FindHandle);  

_findfirst 函数返回的是匹配到文件的句柄,数据类型为long。遍历过程可以指定文件类型。

实例

1.  #include <iostream>  
2.  #include <string>  
3.  #include <io.h>  
4.  using namespace std;  

6.  //遍历当前目录下的文件夹和文件,默认是按字母顺序遍历  
7.  bool TraverseFiles(string path,int &file_num)  
8.  {  
9.  _finddata_t file_info;  
10.  string current_path=path+"/*.*"; //可以定义后面的后缀为*.exe,*.txt等来查找特定后缀的文件,*.*是通配符,匹配所有类型,路径连接符最好是左斜杠/,可跨平台  
11.  //打开文件查找句柄  
12.  int handle=_findfirst(current_path.c_str(),&file_info);  
13.  //返回值为-1则查找失败  
14.  if(-1==handle)  
15.  return false;  
16.  do  
17.  {  
18.  //判断是否子目录  
19.  string attribute;  
20.  if(file_info.attrib==_A_SUBDIR) //是目录  
21.  attribute="dir";  
22.  else  
23.  attribute="file";  
24.  //输出文件信息并计数,文件名(带后缀)、文件最后修改时间、文件字节数(文件夹显示0)、文件是否目录  
25.  cout<<file_info.name<<' '<<file_info.time_write<<' '<<file_info.size<<' '<<attribute<<endl; //获得的最后修改时间是time_t格式的长整型,需要用其他方法转成正常时间显示  
26.  file_num++;  

28.  }while(!_findnext(handle,&file_info));  //返回0则遍历完  
29.  //关闭文件句柄  
30.  _findclose(handle);  
31.  return true;  
32.  }  

34.  //深度优先递归遍历当前目录下文件夹和文件及子文件夹和文件  
35.  void DfsFolder(string path,int layer)  
36.  {  
37.  _finddata_t file_info;  
38.  string current_path=path+"/*.*"; //也可以用/*来匹配所有  
39.  int handle=_findfirst(current_path.c_str(),&file_info);  
40.  //返回值为-1则查找失败  
41.  if(-1==handle)  
42.  {  
43.  cout<<"cannot match the path"<<endl;  
44.  return;  
45.  }  

47.  do  
48.  {  
49.  //判断是否子目录  
50.  if(file_info.attrib==_A_SUBDIR)  
51.  {  
52.  //递归遍历子目录  
53.  //打印记号反映出深度层次  
54.  for(int i=0;i<layer;i++)  
55.  cout<<"--";  
56.  cout<<file_info.name<<endl;  
57.  int layer_tmp=layer;  
58.  if(strcmp(file_info.name,"..")!=0&&strcmp(file_info.name,".")!=0)  //.是当前目录,..是上层目录,必须排除掉这两种情况  
59.  DfsFolder(path+'/'+file_info.name,layer_tmp+1); //再windows下可以用\\转义分隔符,不推荐  
60.  }  
61.  else  
62.  {  
63.  //打印记号反映出深度层次  
64.  for(int i=0;i<layer;i++)  
65.  cout<<"--";  
66.  cout<<file_info.name<<endl;  
67.  }  
68.  }while(!_findnext(handle,&file_info));  //返回0则遍历完  
69.  //关闭文件句柄  
70.  _findclose(handle);  
71.  }  

73.  int main(int argc,char *argv[])  
74.  {  
75.  //遍历单个目录  
76.  int file_num=0;  
77.  if(!TraverseFiles("E:/android-ndk",file_num))  //此处路径连接符只能用/,根盘符大小写都行  
78.  cout<<"traverse files failed"<<endl;  
79.  cout<<"-------------------\n"<<"file number: "<<file_num<<endl;  

81.  //递归遍历文件夹  
82.  DfsFolder("E:/personal_profile/tinyxml",0);  
83.  return 0;  
84.  }  

(ps:貌似注释多了点,有点碍眼T_T)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容