人脸识别
一、项目准备
提前导入用于人脸识别的haarcascade_frontalface_default.xml数据集、age_net.caffemodel、deploy_age.prototxt、deploy_gender.prototxt、gender_net.caffemodel、model.h5等文件以及用到的相关图片。此项目将实现人脸识别、人脸提取、人脸比对、特征标注、动态处理、属性判断等功能,先做出一个登录页面方便之后连接各个功能的分页面。
二、登录页面
1.导入所需的包
tkinter:这是Python的标准GUI(图形用户界面)库。它用于创建窗口、按钮、文本框、标签等图形界面元素。tkinter非常易于使用,并且可以跨平台运行。
messagebox:这是tkinter的一个模块,用于显示消息框。消息框可以用于显示信息、警告、错误消息或询问用户问题。在您的代码中,messagebox.showinfo函数用于显示一个人脸识别的结果信息。
subprocess:这个模块允许你启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回值。在您的代码中,它可能用于调用外部的人脸识别程序或脚本。
PIL/Pillow:PIL(Python Imaging Library)是一个用于处理图像的库。由于PIL已经不再维护,通常使用它的一个友好的分叉版本Pillow。Pillow提供了广泛的文件格式支持、图像处理功能,如缩放、裁剪、颜色转换等。在您的代码中,它用于处理和显示用户选择的图像。
ImageTk:这是Pillow库的一个模块,它提供了用于Tkinter的图像处理类。ImageTk.PhotoImage类用于将Pillow的图像对象转换为可以在Tkinter中显示的图像。
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image
2.设置窗口
2.1定义窗口外观和大小
实例化窗口,设置窗口标题,尺寸。
#设置窗口
win=tk.Tk()
win.title('人脸识别系统')
win.geometry('600x650')
2.2设置窗口背景
2.2.1设置背景图片
调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。
#设置背景图
image = Image.open("1.gif")
image = image.resize((600, 650)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
2.2.2创建label控件
Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。
# 创建Label并将背景图片设置为背景
canvas = tk.Label(win, image=photo1)
canvas.pack()
3.运行脚本
3.1定义识别脚本
定义一个名为 S 的函数,在Python中运行另一个名为 “识别.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义识别
def S():
script_path = "识别.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
3.2定义提取脚本
定义一个名为 T的函数,在Python中运行另一个名为 “提取.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义提取
def T():
script_path = "提取.py"
try:
# 运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
3.3定义标注脚本
定义一个名为 B的函数,在Python中运行另一个名为 “标注.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
#定义标注
def B():
script_path = "标注.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
3.4定义人脸比对脚本
定义一个名为R的函数,在Python中运行另一个名为 “人脸比对.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义对比
def R():
script_path = "人脸比对.py"
try:
# 运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
3.5定义动态处理脚本
定义一个名为D的函数,在Python中运行另一个名为 “动态处理.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
#定义动态处理
def D():
script_path = "动态处理.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
3.6定义属性判断脚本
定义一个名为SXPD的函数,在Python中运行另一个名为 “属性判断.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义属性判断
def SXPD():
script_path = "属性判断.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
4.创建一个退出对话框
定义一个名为 close 的函数,该函数用于在Tkinter图形用户界面中创建一个确认退出对话框。当用户点击“确定”时,窗口 win 将被关闭;如果用户点击“取消”,则不会发生任何操作。
# 定义退出
def close():
if messagebox.askokcancel("退出", "确定要退出吗?"):
win.destroy()
5.按钮设计
5.1人脸识别按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 S 函数。
# 人脸识别按钮
image = Image.open("2.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=35, command=S)
bt1.place(x=75, y=140)
5.2人脸提取按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 T函数。
# 人脸提取按钮
image = Image.open("3.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win,image=photo3,width=198,height=35,command=T)
bt2.place(x=310,y=90)
5.3特征标注按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 B函数。
# 特征标注按钮
image = Image.open("4.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win,image=photo4,width=198,height=35,command=B)
bt3.place(x=310,y=185)
5.4动态处理按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 D函数。
# 动态处理按钮
image = Image.open("5.gif") # 加载一张图片
photo5 = ImageTk.PhotoImage(image)
bt4 = tk.Button(win,image=photo5,width=198,height=33,command=D)
bt4.place(x=75,y=350)
5.5人脸对比按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 R函数。
# 人脸对比按钮
image = Image.open("F4.gif") # 加载一张图片
photo6 = ImageTk.PhotoImage(image)
bt4 = tk.Button(win,image=photo6,width=198,height=33,command=R)
bt4.place(x=75,y=245)
5.6属性判断按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 SXPD函数。
# 属性判断按钮
image = Image.open("F18.gif") # 加载一张图片
photo7 = ImageTk.PhotoImage(image)
bt = tk.Button(win, image=photo7, text="退出",width=198,height=32,command=SXPD)
bt.place(x=310,y=300)
5.7退出按钮
创建一个按钮(bt),这个按钮在界面上显示之前导入的6.gif图像和一个文本标签“退出”,并且当用户点击这个按钮时,会执行一个名为close的函数。
# 退出按钮
image = Image.open("6.gif") # 加载一张图片
photo8 = ImageTk.PhotoImage(image)
bt = tk.Button(win, image=photo8, text="退出",width=170,height=110,command=close)
bt.place(x=380,y=400)
用法:close函数通常这个函数用来关闭应用程序窗口。
6.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
7.登录页面运行结果图
完整代码
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image
#设置窗口
win=tk.Tk()
win.title('人脸识别系统')
win.geometry('600x650')
#设置背景图
image = Image.open("1.gif")
image = image.resize((600, 650)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
# 创建Label并将背景图片设置为背景
canvas = tk.Label(win, image=photo1)
canvas.pack()
#定义识别
def S():
script_path = "识别.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
#定义提取
def T():
script_path = "提取.py"
try:
# 运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
#定义标注
def B():
script_path = "标注.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
#定义对比
def R():
script_path = "人脸比对.py"
try:
# 运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
#定义动态处理
def D():
script_path = "动态处理.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
# 定义属性判断
def SXPD():
script_path = "属性判断.py"
try:
#运行文件
subprocess.Popen(["python", script_path])
win.destroy()
except Exception as e:
# 如果有错误,弹出消息框
messagebox.showerror("Error", f"无法打开脚本:{e}")
#定义退出
def close():
if messagebox.askokcancel("退出", "确定要退出吗?"):
win.destroy()
#按钮设计
#人脸识别按钮
image = Image.open("2.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=35, command=S)
bt1.place(x=75, y=140)
#人脸提取按钮
image = Image.open("3.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win,image=photo3,width=198,height=35,command=T)
bt2.place(x=310,y=90)
#特征标注按钮
image = Image.open("4.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win,image=photo4,width=198,height=35,command=B)
bt3.place(x=310,y=185)
#动态处理按钮
image = Image.open("5.gif") # 加载一张图片
photo5 = ImageTk.PhotoImage(image)
bt4 = tk.Button(win,image=photo5,width=198,height=33,command=D)
bt4.place(x=75,y=350)
#人脸对比按钮
image = Image.open("F4.gif") # 加载一张图片
photo6 = ImageTk.PhotoImage(image)
bt4 = tk.Button(win,image=photo6,width=198,height=33,command=R)
bt4.place(x=75,y=245)
# 属性判断按钮
image = Image.open("F18.gif") # 加载一张图片
photo7 = ImageTk.PhotoImage(image)
bt = tk.Button(win, image=photo7, text="退出",width=198,height=32,command=SXPD)
bt.place(x=310,y=300)
#退出按钮
image = Image.open("6.gif") # 加载一张图片
photo8 = ImageTk.PhotoImage(image)
bt = tk.Button(win, image=photo8, text="退出",width=170,height=110,command=close)
bt.place(x=380,y=400)
win.mainloop()