Python3.6(Anaconda+OpenCV)如何从多文件夹读取多张图片
批量读取多文件夹下的图片(OpenCV + Python)
嘿,我来帮你搞定这个批量读取图片的问题!你的数据集是按子文件夹分类存放的,刚好可以用Python的文件遍历工具结合OpenCV来处理,下面给你两种实用的方案:
方法一:用os.walk()递归遍历所有文件
os.walk()会帮你逐层遍历目标文件夹下的所有子目录和文件,非常适合这种有层级结构的数据集:
import os import cv2 # 定义数据集根路径(注意用正斜杠或者双反斜杠,避免转义问题) dataset_path = "E:/food-101/images" # 用来存储读取到的图片和对应的类别(可选,训练时可能需要) images = [] labels = [] # 遍历所有子文件夹和文件 for root, dirs, files in os.walk(dataset_path): for file in files: # 只处理图片文件,可根据你的数据集扩展后缀 if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')): # 拼接完整的图片路径 img_path = os.path.join(root, file) # 用OpenCV读取图片 img = cv2.imread(img_path) # 检查图片是否读取成功(避免损坏的图片导致报错) if img is not None: images.append(img) # 如果需要,还可以把当前子文件夹名作为类别标签 label = os.path.basename(root) labels.append(label) else: print(f"警告:无法读取图片 {img_path}") print(f"总共读取了 {len(images)} 张图片")
方法二:用glob.glob()快速匹配文件
如果你觉得os.walk有点繁琐,glob模块的通配符匹配会更简洁,一行代码就能匹配所有子文件夹里的图片:
import glob import cv2 dataset_path = "E:/food-101/images" # 用**匹配所有子文件夹,*.jpg匹配所有jpg图片(可修改后缀) img_paths = glob.glob(os.path.join(dataset_path, "**", "*.jpg"), recursive=True) # 也可以同时匹配多种后缀: # img_paths = glob.glob(os.path.join(dataset_path, "**", "*.[jp][pn]g"), recursive=True) images = [] labels = [] for path in img_paths: img = cv2.imread(path) if img is not None: images.append(img) # 提取类别标签(子文件夹名) label = os.path.basename(os.path.dirname(path)) labels.append(label) else: print(f"警告:无法读取图片 {path}") print(f"总共读取了 {len(images)} 张图片")
小提示
- Windows路径里,尽量用正斜杠
/或者双反斜杠\\,避免单个反斜杠的转义问题; - 记得添加图片格式的判断,避免读取非图片文件;
- 加入
img is not None的检查,防止损坏的图片影响后续代码运行; - 如果你的训练需要按类别处理,上面的代码已经帮你提取了子文件夹作为标签,直接用就行。
内容的提问来源于stack exchange,提问作者aaku
相关产品推荐
相关产品推荐

