如何用Python遍历文件夹批量读取图片并处理面部关键点?
我来帮你搞定批量处理图片的需求!核心就是给你的单张处理逻辑套一个遍历文件夹的循环,再做一点小封装就可以了。我把你的代码改成了支持批量处理的版本,还加了一些实用的异常处理:
修改后的完整代码
import numpy as np import cv2 import dlib import os from glob import glob # 初始化dlib的人脸检测器和关键点预测器(记得替换成你的模型文件路径) detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") def process_single_image(img_path, output_file): """封装单张图片的嘴部关键点提取逻辑""" # 读取图片 img = cv2.imread(img_path) if img is None: print(f"⚠️ 无法读取图片:{img_path}") return gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector(gray) if not faces: print(f"⚠️ 图片 {os.path.basename(img_path)} 中未检测到人脸") return # 提取第一张人脸的关键点(如果要处理多张人脸,可以循环遍历faces) face = faces[0] landmarks = predictor(gray, face) # 提取嘴部关键点(dlib 68点标注中,嘴部对应第48-67号点) mouth_coords = [] for i in range(48, 68): x = landmarks.part(i).x y = landmarks.part(i).y mouth_coords.append((x, y)) # 将结果写入文件,格式可以根据你的需求调整 output_file.write(f"图片名称: {os.path.basename(img_path)}\n") output_file.write("嘴部关键点坐标:\n") for idx, (x, y) in enumerate(mouth_coords, 1): output_file.write(f"关键点{idx}: ({x}, {y})\n") output_file.write("-------------------------\n") if __name__ == "__main__": # 配置你的路径 target_folder = "C:/Users/faruk/Desktop/your_images_folder" # 替换成你的图片文件夹路径 result_file_path = "C:/Users/faruk/Desktop/matrices/mouth.txt" # 获取文件夹内所有图片(支持jpg、png,可自行添加其他格式) all_image_paths = glob(os.path.join(target_folder, "*.[jp][pn]g")) if not all_image_paths: print("❌ 未找到任何图片,请检查文件夹路径是否正确") exit() # 批量处理并写入结果 with open(result_file_path, "w", encoding="utf-8") as mouth_matrice: mouth_matrice.write("批量提取嘴部关键点结果\n") mouth_matrice.write("========================\n") # 遍历所有图片逐个处理 for img_path in all_image_paths: print(f"正在处理: {os.path.basename(img_path)}") process_single_image(img_path, mouth_matrice) print(f"✅ 所有图片处理完成!结果已保存到: {result_file_path}")
关键改动说明
- 封装单张处理逻辑:把原来处理单张图片的代码放进
process_single_image函数里,循环调用更清晰,也方便后续维护 - 遍历文件夹图片:用
glob工具匹配目标文件夹里的所有图片,支持多格式(你可以根据需要添加*.bmp等后缀) - 异常处理:增加了图片读取失败、未检测到人脸的提示,避免单个出错导致整个脚本崩溃
- 高效文件写入:用
with open管理文件,全程只打开一次,比每次处理单张都打开关闭文件更高效 - 结果可读性优化:给每个图片的结果加上名称和分隔线,方便你区分不同图片的关键点
只要替换代码里的target_folder(你的图片文件夹路径)和shape_predictor_68_face_landmarks.dat的路径,就能直接运行啦!
内容的提问来源于stack exchange,提问作者ali kaya




