【技术工具】python人员照片简介批量对照(千人级)

要实现根据照片上的工号批量添加人员姓名和工号到照片上,可以按照以下步骤操作(使用Python + PIL/Pillow + OpenCV + pytesseract):

解决方案步骤

  1. 准备数据

    • 创建人员信息表(CSV格式):姓名,工号
    • 确保所有照片文件名包含工号(如工号.jpg),或照片中有清晰可见的工号文本
  2. 安装依赖库

pip install pillow opencv-python pandas pytesseract
# 额外安装Tesseract OCR引擎(Windows需单独安装)
  1. 完整代码
import os
import csv
import cv2
import pytesseract
from PIL import Image, ImageDraw, ImageFont

# 配置Tesseract路径(Windows需指定安装路径)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def add_text_to_image(image_path, name, id, output_dir):
    """添加姓名和工号到图片右下角"""
    try:
        img = Image.open(image_path)
        draw = ImageDraw.Draw(img)
        
        # 选择字体(根据系统调整)
        try:
            font = ImageFont.truetype("simhei.ttf", 40)  # 黑体
        except:
            font = ImageFont.load_default()
        
        # 在右下角添加文本
        text = f"{
     
     name} ({
     
     id})"
        text_width, text_height = draw.textsize(text, font=font)
        margin = 20
        position = (img.width - text_width - margin, img.height - text_height - margin)
        
        # 添加半透明背景
        bg = Image.new('RGBA', (text_width+10, text_height+10), (0,0,0,128))
        img.paste(bg, (position[0]-5, position[1]-5), bg)
        
        # 绘制白色文本
        draw.text(position, text, font=font, fill="white")
        
        # 保存结果
        output_path = os.path.join(output_dir, os.path.basename(image_path))
        img.save(output_path)
        print(f"已处理: {
     
     os.path.basename(image_path)}")
        return True
    except Exception as e:
        print(f"处理失败 {
     
     image_path}: {
     
     str(e)}")
        return False

def detect_id_from_image(image_path):
    """使用OCR识别图片中的工号"""
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 增强识别率(可选)
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    
    # OCR识别
    text = pytesseract.image_to_string(gray, lang='chi_sim+eng', config='--psm 6')
    # 提取数字工号(根据实际格式调整)
    import re
    matches = re.findall(r'\d{5,}', text)  # 匹配5位以上数字
    return matches[0] if matches else None

# 主处理流程
def process_images(photo_dir, csv_file, output_dir):
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    
    # 读取人员数据
    id_to_name = {
   
   }
    with open(csv_file, mode='r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            id_to_name[row['工号']] = row['姓名']
    
    # 处理每张照片
    for filename in os.listdir(photo_dir):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            img_path = os.path.join(photo_dir, filename)
            
            # 方法1:从文件名提取工号(推荐)
            file_id = os.path.splitext(filename)[0]  # 假设文件名就是工号
            
            # 方法2:OCR识别工号(备用)
            if file_id not in id_to_name:
                detected_id = detect_id_from_image(img_path)
                if detected_id and detected_id in id_to_name:
                    file_id = detected_id
            
            # 添加文字
            if file_id in id_to_name:
                add_text_to_image(
                    img_path,
                    id_to_name[file_id],
                    file_id,
                    output_dir
                )
            else:
                print(f"工号未匹配: {
     
     filename}")

if __name__ == "__main__":
    # 配置路径
    PHOTO_DIR = "原始照片文件夹路径"
    CSV_FILE = "人员信息表.csv"
    OUTPUT_DIR = "输出照片文件夹路径"
    
    process_images(PHOTO_DIR, CSV_FILE, OUTPUT_DIR)

关键步骤说明

  1. 数据准备

    • CSV格式示例:
      姓名,工号
      张三,10001
      李四,10002
      
    • 照片命名建议:10001.jpg(工号作为文件名)
  2. 工号识别策略

    • 首选方案:通过文件名提取工号(速度快,准确率高)
    • 备用方案:使用OCR识别图片中的工号(需确保工号在图片中清晰可见)
  3. 文字添加功能

    • 在照片右下角添加半透明背景的白色文字
    • 自动调整文字位置
    • 支持中文字体(需系统有中文字体)
  4. 执行流程

你可能感兴趣的:(医疗高效编程研发,python,开发语言,自然语言处理,健康医疗,语言模型)