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)
网友评论