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

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

作者: 大梦一场三十一 | 来源:发表于2018-03-09 21:21 被阅读0次

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)

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/ejvlzxtx.html