You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动