在批量处理图像时,循环读取文件夹内所有图片是基础需求。本文通过极简代码,演示如何遍历文件夹、读取图片并按固定间隔动态展示,新手可直接复用至批量图像预览、预处理场景。
核心代码实现
python
import cv2 as cv
import os
# 初始化全局变量
b = 0
A = 0
# 定义读取文件夹图片的函数
def read_directory(directory_name):
# 遍历文件夹内所有文件
for filename in os.listdir(directory_name):
# 拼接完整文件路径
img_path = directory_name + "/" + filename
# 读取图片
img = cv.imread(img_path)
if img is None: # 跳过非图片文件
continue
print(f"当前读取:{img_path}") # 打印当前图片路径
# 创建自适应窗口并调整尺寸
cv.namedWindow('outimage', cv.WINDOW_NORMAL)
cv.resizeWindow('outimage', 600, 600)
# 显示图片
cv.imshow('outimage', img)
# 全局变量存储当前图片(可选)
global A
A = img
# 等待1000ms,支持按键提前跳过
if cv.waitKeyEx(1000) > 0:
break
# 循环读取2次文件夹(可按需调整次数)
while True:
if b < 2:
read_directory("D:/image")
b += 1
else:
break
cv.destroyAllWindows() # 释放窗口资源
关键知识点解析
1. 核心逻辑拆解
| 步骤 | 代码要点 | 作用说明 |
|---|---|---|
| 遍历文件夹 | os.listdir(directory_name) |
获取文件夹内所有文件名(含非图片文件) |
| 拼接路径 | directory_name + "/" + filename |
生成图片完整路径,避免文件找不到 |
| 动态展示 | cv.waitKeyEx(1000) |
每张图片显示 1 秒,按键可提前切换 |
| 循环控制 | while+计数器b |
控制文件夹遍历次数(示例为 2 次) |
2. 优化与避坑点
- 过滤非图片文件 :新增
if img is None判断,跳过文件夹内的 txt、exe 等非图片文件,避免窗口显示异常; - 窗口复用 :
namedWindow只需创建一次,无需在循环内重复创建,减少资源占用; - 按键中断 :
cv.waitKeyEx(1000) > 0支持按任意键跳过当前图片,提升操作灵活性; - 路径兼容性 :建议使用
os.path.join(directory_name, filename)替代字符串拼接,适配 Windows/Linux 不同路径分隔符。
3. 扩展技巧
-
按后缀过滤 :仅读取 jpg/png/bmp 图片,可添加判断:
python
运行
if filename.endswith(('.jpg', '.png', '.bmp')): # 执行读取逻辑 -
批量预处理:在显示前添加滤波、二值化等操作,实现批量处理 + 预览;
-
无限循环展示 :删除计数器
b,直接while True: read_directory(...),按 ESC 键退出(需新增 ESC 键判断)。
总结
- 循环读取文件夹图片核心是
os.listdir遍历 +cv.imread读取,需注意路径拼接和非图片文件过滤; cv.waitKeyEx可控制图片展示间隔,兼顾自动播放和手动切换;- 路径拼接优先用
os.path.join,提升代码跨平台兼容性。