MATLAB R2015a递归读取子目录图片失败问题求助
解决MATLAB R2015a递归读取子文件夹图片的问题
你遇到的问题其实是版本兼容性导致的——MATLAB R2015a并不支持**这种递归通配符,这个便捷的通配符特性是从R2016b才开始加入的,所以你用dir('main_folder/**/*.jpg')根本搜不到任何文件,自然读不出图片。下面给你两种适配R2015a的可行方案,亲测有效:
方案一:手动遍历子文件夹
先定位main_folder下的所有子目录,再逐个读取每个子目录里的jpg文件,逻辑清晰,适合你这种固定层级的结构:
mainFolder = 'main_folder'; % 获取mainFolder下的所有子目录 subFolders = dir(mainFolder); subFolders = subFolders([subFolders.isdir]); % 筛选出目录项 % 排除系统默认的.和..目录 subFolders = subFolders(~ismember({subFolders.name}, {'.', '..'})); % 建议用cell数组存储图片,比固定尺寸矩阵更灵活 imageCell = cell(0); % 遍历每个子文件夹 for i = 1:length(subFolders) subFolderPath = fullfile(mainFolder, subFolders(i).name); % 获取当前子文件夹下的所有jpg图片 imageFiles = dir(fullfile(subFolderPath, '*.jpg')); % 遍历当前子文件夹的每一张图片 for j = 1:length(imageFiles) % 用fullfile拼接路径,避免手动加/出错 imagePath = fullfile(subFolderPath, imageFiles(j).name); I = imread(imagePath); I = imresize(I, [128 128]); % 存入cell数组,如果需要一维向量可以用reshape(I,1,[]) imageCell{end+1} = I; end end % 如果最后需要转为矩阵(假设所有图片都是同尺寸同通道) arrayImage = cell2mat(cellfun(@(x) reshape(x,1,[]), imageCell, 'UniformOutput', false));
方案二:用genpath自动获取所有递归路径
如果以后子目录层级变多,genpath可以自动递归生成所有子文件夹的路径,更通用:
mainFolder = 'main_folder'; % 生成所有递归子文件夹的路径字符串,用系统路径分隔符分隔 folderPaths = genpath(mainFolder); % 分割成单个文件夹路径的列表 folderList = strsplit(folderPaths, pathsep); imageCell = cell(0); for i = 1:length(folderList) currentFolder = folderList{i}; if isempty(currentFolder) continue; % 跳过空路径 end % 获取当前文件夹下的jpg文件 imageFiles = dir(fullfile(currentFolder, '*.jpg')); for j = 1:length(imageFiles) imagePath = fullfile(currentFolder, imageFiles(j).name); I = imread(imagePath); I = imresize(I, [128 128]); imageCell{end+1} = I; end end % 转为矩阵(按需使用) arrayImage = cell2mat(cellfun(@(x) reshape(x,1,[]), imageCell, 'UniformOutput', false));
几个关键注意点
- 别用手动拼接路径:
fullfile会自动适配Windows的\和Mac/Linux的/,避免路径格式错误。 - 避免预分配错误尺寸:你原来的
zeros(numData, 133183)需要提前知道总图片数,而且如果是RGB图片,1281283=49152,和你写的133183不符,很容易出问题。用cell数组存储原始图片更稳妥。 - 兼容多格式:如果子文件夹里有png等其他格式,可以把
*.jpg改成*.{jpg,png}来匹配多种图片格式。
内容的提问来源于stack exchange,提问作者gordon
相关产品推荐
相关产品推荐

