人脸识别系统代码--照片识别

1.导包

Tkinter用于创建GUI,PIL用于图像处理,cv2用于OpenCV库,subprocess用于运行其他Python脚本。

复制代码
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
from PIL.Image import Resampling
import cv2
import subprocess

2.创建主窗口并设置标题和大小

复制代码
win = tk.Tk()
win.title("人脸属性")
win.geometry("800x400")

3.加载预训练的人脸检测模型和性别、年龄识别模型。

复制代码
# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载预训练的性别和年龄识别模型
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')

4.定义性别和年龄的标签列表

复制代码
gender_list = ['男', '女']
age_list = ['(0-5)', '(5-10)', '(15-20)', '(20-25)',  '(25-30)', '(60-70)', '(45-55)', '(55-65)', '(65-80)', '(80-100)']

5.定义标量,用来储存用户选择图片的路径

复制代码
selected_image1_path = None
selected_image2_path = None

6.定义字体样式

复制代码
my_font = ('Arial', 18, 'normal')

7.创建画布

复制代码
blue = tk.Canvas(win, width=350, height=200, bg='lightblue')
blue.place(x=30, y=120)

pink = tk.Canvas(win, width=350, height=200, bg='light pink')
pink.place(x=420, y=120)

8.定义image1函数

用于处理第一个画布上的人脸识别。函数内部会打开文件选择对话框,加载图像,调整大小,转换为灰度图像进行人脸检测,然后使用深度学习模型预测性别和年龄,并在画布上显示结果。

复制代码
def image1():
    # 调用全局变量
    global selected_image1_path, photo1, img1
    # 打开文件选择对话框
    selected_image1_path = filedialog.askopenfilename()
    if selected_image1_path:  # 检查用户是否选择了文件
        # 加载图像
        image= cv2.imread(selected_image1_path)
        # 调整图像大小
        image = cv2.resize(image, (130, 170))
        # 将 OpenCV 图像转换为 PIL 图像
        pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
        # 将PIL图像对象转换为Tkinter图像对象
        photo1 = ImageTk.PhotoImage(pil_image)
        # 在画布上显示图像
        blue.create_image(80, 105, image=photo1)  # 调整坐标以适应画布

        # 转换为灰度图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)
        if len(faces) > 0:
            # 遍历检测到的人脸
            for (x, y, w, h) in faces:
                # 从原始图像中裁剪人脸区域
                face_img = image[y:y + h, x:x + w].copy()

                # 预处理人脸图像以适应神经网络输入
                blob = cv2.dnn.blobFromImage(face_img, 1,
                                             (227, 227), (78.4263377603,
                                                          87.7689143744, 114.895847746), swapRB=False)
                # 预测性别
                gender_net.setInput(blob)
                gender_preds = gender_net.forward()
                gender = gender_list[gender_preds[0].argmax()]

                # 预测年龄
                age_net.setInput(blob)
                age_preds = age_net.forward()
                age = age_list[age_preds[0].argmax()]

                tk.Label(blue, text=f'性别:{gender}', bg='lightblue', font=my_font).place(x=160, y=70)
                tk.Label(blue, text=f'年龄:{age}', bg='lightblue', font=my_font).place(x=160, y=120)
        else:
            tk.Label(blue,text='未检测到人脸', bg='lightblue', font=my_font).place(x=160, y=70)

9. 定义image2函数

image1类似,用于处理第二个画布上的人脸识别。

复制代码
def image2():
    # 调用全局变量
    global selected_image2_path, photo2
    # 打开文件选择对话框
    selected_image2_path = filedialog.askopenfilename()
    if selected_image2_path:  # 检查用户是否选择了文件
        # 加载图像
        image = cv2.imread(selected_image2_path)
        # 调整图像大小
        image = cv2.resize(image, (130, 170))
        # 将 OpenCV 图像转换为 PIL 图像
        pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
        # 将PIL图像对象转换为Tkinter图像对象
        photo2 = ImageTk.PhotoImage(pil_image)
        # 在画布上显示图像
        pink.create_image(80, 105, image=photo2)  # 调整坐标以适应画布

        # 转换为灰度图像
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)
        if len(faces) > 0:
            # 遍历检测到的人脸
            for (x, y, w, h) in faces:
                # 从原始图像中裁剪人脸区域
                face_img = image[y:y + h, x:x + w].copy()

                # 预处理人脸图像以适应神经网络输入
                blob = cv2.dnn.blobFromImage(face_img, 1,
                                             (227, 227), (78.4263377603,
                                                          87.7689143744, 114.895847746), swapRB=False)
                # 预测性别
                gender_net.setInput(blob)
                gender_preds = gender_net.forward()
                gender = gender_list[gender_preds[0].argmax()]

                # 预测年龄
                age_net.setInput(blob)
                age_preds = age_net.forward()
                age = age_list[age_preds[0].argmax()]

                tk.Label(pink, text=f'性别:{gender}', bg='lightpink', font=my_font).place(x=160, y=70)
                tk.Label(pink, text=f'年龄:{age}', bg='lightpink', font=my_font).place(x=160, y=120)
        else:
            tk.Label(pink, text='未检测到人脸', bg='lightpink', font=my_font).place(x=160, y=70)

10.定义close函数

用于关闭当前窗口并打开另一个Python脚本

复制代码
def close():
    subprocess.Popen(["python", "属性判断.py"])
    win.destroy()

11.加载按钮图像

并创建三个按钮,分别用于选择图像1、选择图像2和关闭窗口

复制代码
image = Image.open("img/F11.gif")  # 加载一张图片
photo7 = ImageTk.PhotoImage(image)
tk.Button(win, image=photo7, command=image1).place(x=100, y=30)

image = Image.open("img/F12.gif")  # 加载一张图片
photo8 = ImageTk.PhotoImage(image)
tk.Button(win, image=photo8, command=image2).place(x=490, y=30)

image = Image.open("img/T.gif")  # 加载一张图片
photo9 = ImageTk.PhotoImage(image)
tk.Button(win, image=photo9,command=close).place(x=300, y=350)

12.退出系统

复制代码
win.mainloop()
相关推荐
龙萱坤诺1 小时前
无限画布 + gpt-image-2:用智狐AI工作台把AI草图直接拖进排版区
人工智能·ai短剧·无限画布
马***4118 小时前
适配成人英语学习痛点,打造落地性强的学习辅助方式
人工智能·学习
夜焱辰8 小时前
浏览器端 Agent 的文件版本管理:不用 Git,基于 OPFS + SQLite 自己造了一个
前端·人工智能
Ricky05539 小时前
CTRL-WORLD:一种用于机器人操控的可控生成世界模型(中美2025年联合研究)
人工智能·机器人·世界模型
jeffer_liu9 小时前
Spring AI 生产级实战:工具调用
java·人工智能·后端·spring·ai编程
lifloveyou9 小时前
table接口结构
python
阿乔外贸日记9 小时前
2026尼日利亚五项清关政策更新,拉高能源装备进口综合成本
大数据·人工智能·搜索引擎·智能手机·云计算·能源
民乐团扒谱机9 小时前
【AI笔记】短时纯音时长对音高感知偏移效应研究综述
人工智能·笔记
侃谈科技圈9 小时前
破除数据中台落地困境:2026数据治理平台差异化能力与选型决策指南
大数据·人工智能
大象说9 小时前
Python多进程共享队列无报错僵死 120G Nginx访问日志清洗踩坑全记录
人工智能·自然语言处理