OpenCv之简单的人脸识别项目(人脸提取页面)
人脸识别
- 准备
- 五、人脸提取页面
- 1.导入所需的包
- 2.设置窗口
- 2.1定义窗口外观和大小
- 2.2设置窗口背景
- 2.2.1设置背景图片
- 2.2.2创建label控件
- 3.定义单人脸提取脚本
- 4.定义多人脸提取脚本
- 5.创建一个退出对话框
- 6.按钮设计
- 6.1单人脸提取按钮
- 6.2多人脸提取按钮
- 6.3返回按钮
- 7.定义关键函数
- 8.人脸提取页面运行结果图
- 人脸提取页面完整代码
- 六、单人脸提取页面
- 1.导入所需的包
- 2.设置窗口
- 2.1定义窗口外观和大小
- 2.2设置窗口背景
- 2.2.1设置背景图片
- 2.2.2创建label控件
- 3.定义两个全局变量
- 4.定义选择图片函数
- 4.1定义函数和声明全局变量
- 4.2 打开文件对话框并获取文件路径
- 4.3 处理图片并创建标签
- 4.4 显示图像
- 5.检测人脸并提取
- 5.1函数定义和全局变量声明
- 5.2条件判断和图片加载
- 5.3 遍历人脸位置并提取人脸
- 5.4 保存和显示提取的人脸
- 5.5 处理已有的图像标签
- 5.5 创建新的图像标签并显示人脸
- 6.定义关闭窗口的函数
- 7.按钮设计
- 7.1选择图片按钮
- 7.2开始提取按钮
- 7.3返回按钮
- 8.定义关键函数
- 9.单人脸提取页面运行结果图
- 10.单人脸提取页面功能展示图
- 单人脸提取页面完整代码
- 七、多人脸提取页面
- 1.导入所需的包
- 2.设置窗口
- 2.1定义窗口外观和大小
- 2.2 设置背景
- 3.定义全局变量
- 4.定义选择图片函数
- 4.1定义函数和声明全局变量
- 4.2 打开文件对话框并获取文件路径
- 4.3 处理图片并创建标签
- 4.4 显示图像
- 5.检测人脸并提取
- 5.1定义函数和全局变量声明
- 5.2条件判断和图片加载
- 5.3清理旧的图像标签
- 5.4设置Canvas组件的尺寸和滚动条
- 5.5创建新的图像标签并显示人脸
- 6.定义函数处理鼠标滚轮事件
- 7.定义关闭窗口的函数
- 8.按钮设计
- 8.1选择图片按钮
- 8.2开始提取按钮
- 8.3返回按钮
- 9.定义关键函数
- 10. 多人脸提取页面运行结果图
- 11.多人脸提取页面功能展示图
- 多人脸提取页面完整代码
准备
本篇将展示人脸提取页面,并与登录页面连接起来。人脸提取页面分为单人脸提取和多人脸提取两个分页面。
五、人脸提取页面
1.导入所需的包
tkinter:
Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。
messagebox:
这个模块是tkinter的一个扩展,提供了一个对话框,允许您显示消息框、警告框、错误框等。它是tkinter的一部分,通常与tkinter一起使用来与用户进行交互。
subprocess:
这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。
PIL (Python Imaging Library):
PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。
ImageTk:
ImageTk是PIL库中用于与Tkinter一起使用的模块,它提供了在Tkinter中显示图像的功能。它通常与Tkinter的PhotoImage类一起使用,以在Tkinter应用程序中显示PIL的Image对象。
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('600x450')
2.2设置窗口背景
2.2.1设置背景图片
调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。
#背景设计
image = Image.open("14.gif")
image = image.resize((600, 450)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()
2.2.2创建label控件
Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。
canvas = tk.Label(win, image=photo1)
canvas.pack()
3.定义单人脸提取脚本
定义一个名为ONE的函数,在Python中运行另一个名为 “单人脸提取.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义单人脸提取
def ONE():script_path = "单人脸提取.py"try:#运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")
4.定义多人脸提取脚本
定义一个名为TWO的函数,在Python中运行另一个名为 “多人脸提取.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义多人脸提取
def TWO():script_path = "多人脸提取.py"try:#运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")
5.创建一个退出对话框
定义一个名为 close 的函数,该函数用于在Tkinter图形用户界面中创建一个确认退出对话框。当用户点击“确定”时,窗口 win 将被关闭;如果用户点击“取消”,则不会发生任何操作。
# 定义退出
def close():if messagebox.askokcancel("退出", "确定要退出吗?"):win.destroy()
6.按钮设计
6.1单人脸提取按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 ONE函数。
# 按钮设计
image = Image.open("F14.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=31,command=ONE)
bt1.place(x=190, y=140)
6.2多人脸提取按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 TWO函数。
image = Image.open("F15.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=31,command=TWO)
bt2.place(x=190, y=230)
6.3返回按钮
定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb 的函数。
image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)
用法:close函数通常这个函数用来关闭应用程序窗口。
7.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
8.人脸提取页面运行结果图
人脸提取页面完整代码
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image#设置窗口
win=tk.Tk()
win.title('提取')
win.geometry('600x450')#背景设计
image = Image.open("14.gif")
image = image.resize((600, 450)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()#定义单人脸提取
def ONE():script_path = "单人脸提取.py"try:#运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")#定义多人脸提取
def TWO():script_path = "多人脸提取.py"try:# 运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")def close():subprocess.Popen(["python","登录页面.py"])win.destroy()# 按钮设计
image = Image.open("F14.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=31,command=ONE)
bt1.place(x=190, y=140)image = Image.open("F15.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=31,command=TWO)
bt2.place(x=190, y=230)image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=190, y=320)win.mainloop()
六、单人脸提取页面
1.导入所需的包
tkinter:
Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。
filedialog:
这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。
face_recognition:
这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。
PIL (Python Imaging Library):
PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。
ImageTk:
ImageTk是PIL库中用于与Tkinter一起使用的模块,它提供了在Tkinter中显示图像的功能。它通常与Tkinter的PhotoImage类一起使用,以在Tkinter应用程序中显示PIL的Image对象。
subprocess:
这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。
import tkinter as tk
from tkinter import filedialog
import face_recognition
from PIL import Image, ImageTk
import subprocess
2.设置窗口
2.1定义窗口外观和大小
实例化窗口,设置窗口标题,尺寸。
win = tk.Tk()
win.title('Welcome')
win.geometry('750x600')
2.2设置窗口背景
2.2.1设置背景图片
调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。
#背景设计
image = Image.open("9.gif")
image = image.resize((750, 600)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
2.2.2创建label控件
Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。
canvas = tk.Label(win, image=photo1)
canvas.pack()
3.定义两个全局变量
定义全局变量时,使用None来初始化它们,这意味着在程序开始时,它们不指向任何具体的图像路径或标签对象。在实际的应用程序中,将会通过用户的操作或程序的逻辑来更新这些变量,以便它们能够存储图像路径和显示图像。
file_path = None
face_image_label = None
用法:
file_path: 这个变量被用来保存用户选择的图片文件的路径。在图像处理或显示图像的应用
程序中,您可能需要存储用户选择的图像文件的路径,以便之后进行操作,如加
载、显示或处理图像
face_image_label: 这个变量通常用于在Tkinter应用程序中显示处理后的图像。在Tkinter中,Label组件可以用来显示文本或图像。face_image_label可能被用来引用一个Label组件,该组件被配置为显示一个图像。这个标签可以放置在窗口中,并且可以根据需要更新以显示不同的图像。
4.定义选择图片函数
4.1定义函数和声明全局变量
定义了一个名为 xz 的函数,并在函数内部声明了全局变量 file_path。
def xz():global file_path
4.2 打开文件对话框并获取文件路径
使用 tkinter 的 filedialog 模块来弹出一个文件选择对话框,让用户选择一个图片文件。如果用户选择了文件,file_path 将包含该文件的路径;如果用户取消了选择,file_path 将为 None。
file_path = filedialog.askopenfilename(title="选择图片",filetypes=(("图片文件", "*.png *.jpg *.jpeg *.bmp"),("所有文件", "*.*")))
4.3 处理图片并创建标签
首先检查 file_path 是否有值,如果有,则打开这个路径对应的图片文件,并调整其大小到 370x450 像素。然后,它将调整后的图片转换为 Tkinter 可以显示的 PhotoImage 对象,并创建一个新的 Label 组件来显示这个图像。
if file_path:image = Image.open(file_path)image = image.resize((370, 450))photo = ImageTk.PhotoImage(image)image_label = tk.Label(win, image=photo)image_label.image = photo
4.4 显示图像
将图像标签放置在主窗口的 (10, 100) 位置。
image_label.place(x=10, y=100)
5.检测人脸并提取
5.1函数定义和全局变量声明
定义了一个名为 tq 的函数,并在函数内部声明了两个全局变量 file_path 和 face_image_label。这意味着函数内部对这些变量的修改将会影响函数外部的同名变量。
def tq():global file_path, face_image_label
5.2条件判断和图片加载
首先检查 file_path 是否有值,如果有,则使用 face_recognition 库的 load_image_file 函数来加载这个路径对应的图片文件。然后,它使用 face_recognition 库的 face_locations 函数来检测图片中的人脸位置,这里使用了 hog 模型。
if file_path:img = face_recognition.load_image_file(file_path)face_locations = face_recognition.face_locations(img, model='hog')
5.3 遍历人脸位置并提取人脸
遍历 face_locations 列表中的每个元素,每个元素是一个元组,包含了一个人脸的边界框的坐标。它使用这些坐标来从原始图片中提取出对应的人脸区域。
for i, face_location in enumerate(face_locations):top, right, bottom, left = face_locationface_img = img[top:bottom, left:right]
5.4 保存和显示提取的人脸
将提取的人脸保存为一个文件,并创建一个新的人脸图像对象。然后,它将这个图像对象调整到 100x100 像素的大小,并将其转换为 Tkinter 可以显示的 PhotoImage 对象。
face_name = f"face_{i}.jpg"
face_image = Image.fromarray(face_img)
face_image = face_image.resize((100, 100)
face_photo = ImageTk.PhotoImage(face_image)
5.5 处理已有的图像标签
检查是否存在一个名为 face_image_label 的图像标签。如果有,它将这个标签从窗口中移除。
if face_image_label:face_image_label.destroy()
5.5 创建新的图像标签并显示人脸
创建一个新的图像标签,用于显示处理后的人脸。它将 face_photo 设置为标签的图像,并将其放置在主窗口的 (430, 100) 位置。
face_image_label = tk.Label(win, image=face_photo)
face_image_label.image = face_photo
face_image_label.place(x=430, y=100)
6.定义关闭窗口的函数
当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。
def close():subprocess.Popen(["python","提取页面.py"])win.destroy()
用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。
7.按钮设计
7.1选择图片按钮
定义一个名为 bt1 的按钮,该按钮将显示一个前面导入的名为 “A.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 xz 的函数。
image = Image.open("A.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=xz)
bt1.place(x=30, y=30)
7.2开始提取按钮
定义一个名为 bt2 的按钮,该按钮将显示一个前面导入的名为 “F3.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 tq的函数。
image = Image.open("F3.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=tq)
bt2.place(x=275, y=30)
7.3返回按钮
定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb 的函数。
image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)
用法:close函数通常这个函数用来关闭应用程序窗口。
8.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
9.单人脸提取页面运行结果图
10.单人脸提取页面功能展示图
单人脸提取页面完整代码
import tkinter as tk
from tkinter import filedialog
import face_recognition
from PIL import Image, ImageTk
import subprocesswin = tk.Tk()
win.title('Welcome')
win.geometry('750x600')#背景设计
image = Image.open("9.gif")
image = image.resize((750, 600)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()file_path = None
face_image_label = Nonedef xz():global file_pathfile_path = filedialog.askopenfilename(title="选择图片",filetypes=(("图片文件", "*.png *.jpg *.jpeg *.bmp"),("所有文件", "*.*")))if file_path:image = Image.open(file_path)image = image.resize((370, 450))photo = ImageTk.PhotoImage(image)image_label = tk.Label(win, image=photo)image_label.image = photoimage_label.place(x=10, y=100)def tq():global file_path, face_image_labelif file_path:img = face_recognition.load_image_file(file_path)face_locations = face_recognition.face_locations(img, model='hog')for i, face_location in enumerate(face_locations):top, right, bottom, left = face_locationface_img = img[top:bottom, left:right]face_name = f"face_{i}.jpg"face_image = Image.fromarray(face_img)face_image = face_image.resize((100, 100))face_photo = ImageTk.PhotoImage(face_image)if face_image_label:face_image_label.destroy()face_image_label = tk.Label(win, image=face_photo)face_image_label.image = face_photoface_image_label.place(x=430, y=100)def close():win.destroy() # 先关闭当前窗口subprocess.Popen(["python", "提取.py"]) # 再打开新的脚本#按钮设计
image = Image.open("A.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=xz)
bt1.place(x=30, y=30)image = Image.open("F3.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=tq)
bt2.place(x=275, y=30)image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)win.mainloop()
七、多人脸提取页面
1.导入所需的包
tkinter:
Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。
filedialog:
这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。
face_recognition:
这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。
PIL (Python Imaging Library):
PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。
ImageTk:
ImageTk是PIL库中用于与Tkinter一起使用的模块,它提供了在Tkinter中显示图像的功能。它通常与Tkinter的PhotoImage类一起使用,以在Tkinter应用程序中显示PIL的Image对象。
subprocess:
这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。
import tkinter as tk
from tkinter import filedialog
import face_recognition
from PIL import Image, ImageTk
import subprocess
2.设置窗口
2.1定义窗口外观和大小
实例化窗口,设置窗口标题,尺寸。
win = tk.Tk()
win.title('Welcome')
win.geometry('750x600')
2.2 设置背景
创建canvas组件,并将其放置在主窗口 win 中。设置组件宽度、高度以及背景颜色。
# 背景设计
canvas = tk.Canvas(win, width=750, height=600, bg="white")
canvas.pack()
3.定义全局变量
定义这些全局变量时,使用None来初始化它们,这意味着在程序开始时,它们不指向任何具体的文件路径或标签对象。在实际的应用程序中,您会通过用户的操作或程序的逻辑来更新这些变量,以便它们能够存储图片文件的路径和显示处理后的图像。
file_path = None
face_image_labels = []
用法:
file_path: 这个变量被用来保存用户选择的图片文件的路径。在图像处理或显示图像的应用程序中,您可能需要存储用户选择的图像文件的路径,以便之后进行操作,如加载、显示或处理图像。
face_image_labels: 这个变量是一个列表,用于存储 Tkinter 窗口中显示的人脸图像标签。当检测到图片中的人脸时,将创建一个新的 Label 组件来显示这个人脸图像,并将这个组件的引用添加到 face_image_labels 列表中。这样,您就可以在应用程序的其他部分访问和操作这些标签。
4.定义选择图片函数
4.1定义函数和声明全局变量
定义了一个名为 xz 的函数,并在函数内部声明了全局变量 file_path。
def xz():global file_path
4.2 打开文件对话框并获取文件路径
使用 tkinter 的 filedialog 模块来弹出一个文件选择对话框,让用户选择一个图片文件。如果用户选择了文件,file_path 将包含该文件的路径;如果用户取消了选择,file_path 将为 None。
file_path = filedialog.askopenfilename(title="选择图片",filetypes=(("图片文件", "*.png *.jpg *.jpeg *.bmp"),("所有文件", "*.*")))
4.3 处理图片并创建标签
首先检查 file_path 是否有值,如果有,则打开这个路径对应的图片文件,并调整其大小到 370x450 像素。然后,它将调整后的图片转换为 Tkinter 可以显示的 PhotoImage 对象,并创建一个新的 Label 组件来显示这个图像。
if file_path:image = Image.open(file_path)image = image.resize((370, 450))photo = ImageTk.PhotoImage(image)image_label = tk.Label(win, image=photo)image_label.image = photo
4.4 显示图像
将图像标签放置在主窗口的 (10, 100) 位置。
image_label.place(x=10, y=100)
5.检测人脸并提取
5.1定义函数和全局变量声明
定义一个名为 tq 的函数,并在函数内部声明了三个全局变量 file_path、face_image_labels 和 canvas。这意味着函数内部对这些变量的修改将会影响函数外部的同名变量。
def tq():global file_path, face_image_labels, canvas
5.2条件判断和图片加载
首先检查 file_path 是否有值,如果有,则使用 face_recognition 库的 load_image_file 函数来加载这个路径对应的图片文件。然后,它使用 face_recognition 库的 face_locations 函数来检测图片中的人脸位置,这里使用了 hog 模型。
if file_path:img = face_recognition.load_image_file(file_path)face_locations = face_recognition.face_locations(img, model='hog')
5.3清理旧的图像标签
遍历 face_image_labels 列表中的每个元素,并将其从窗口中移除。
for face_image_label in face_image_labels:face_image_label.destroy()
5.4设置Canvas组件的尺寸和滚动条
设置了Canvas组件的宽度和高度,以适应所有要显示的人脸图像。它还创建了一个垂直滚动条,以便用户可以滚动查看所有的人脸图像。
face_width = 100
spacing = 10
canvas_width = (face_width + spacing) * len(face_locations) - spacing
canvas_height = len(face_locations) * 100canvas.config(width=canvas_width, height=canvas_height)scrollbar = tk.Scrollbar(win, orient="vertical", command=canvas.yview)
scrollbar.place(x=730, y=100, height=500)canvas.configure(yscrollcommand=scrollbar.set)
5.5创建新的图像标签并显示人脸
创建一个新的图像标签,用于显示处理后的人脸。它将 face_photo 设置为标签的图像,并将其放置在Canvas组件中的指定位置。它还设置了 count 变量,以便在放置每两张图片后增加垂直间距。
face_image_labels = []
x_p = 430
y_p = 90
count = 0
for i, face_location in enumerate(face_locations):top, right, bottom, left = face_locationface_img = img[top:bottom, left:right]face_name = f"face_{i}.jpg"face_image = Image.fromarray(face_img)face_image = face_image.resize((100, 100))face_photo = ImageTk.PhotoImage(face_image)face_image_label = tk.Label(canvas, image=face_photo)face_image_label.image = face_photocanvas.create_window(x_p, y_p, anchor='nw', window=face_image_label)face_image_labels.append(face_image_label)count += 1if count == 2: # 每放两张图片后增加间距x_p = 430 # 重置x_py_p += 130 # 设置第一行和第二行之间的垂直间距为50像素count = 0else:x_p += 110
6.定义函数处理鼠标滚轮事件
定义了一个名为 on_mouse_wheel 的函数,用于处理鼠标滚轮事件,并在 canvas 组件上执行滚动操作。同时,您将这个函数绑定到 canvas 组件上,以便在用户滚动鼠标滚轮时触发该函数。
def on_mouse_wheel(event):canvas.yview_scroll(-1 * (event.delta // 120), "units") # 根据鼠标滚轮事件滚动Canvascanvas.bind_all("<MouseWheel>", on_mouse_wheel) # 绑定鼠标滚轮事件
7.定义关闭窗口的函数
当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。
def close():subprocess.Popen(["python","提取页面.py"])win.destroy()
用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。
8.按钮设计
8.1选择图片按钮
定义一个名为 bt1 的按钮,该按钮将显示一个前面导入的名为 “A.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 xz 的函数。
image = Image.open("A.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=xz)
bt1.place(x=30, y=30)
8.2开始提取按钮
定义一个名为 bt2 的按钮,该按钮将显示一个前面导入的名为 “F3.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 tq的函数。
image = Image.open("F3.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=tq)
bt2.place(x=275, y=30)
8.3返回按钮
定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb 的函数。
image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)
用法:close函数通常这个函数用来关闭应用程序窗口。
9.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
10. 多人脸提取页面运行结果图
11.多人脸提取页面功能展示图
多人脸提取页面完整代码
import tkinter as tk
from tkinter import filedialog
import face_recognition
from PIL import Image, ImageTk
import subprocesswin = tk.Tk()
win.title('Welcome')
win.geometry('750x600')# 背景设计
canvas = tk.Canvas(win, width=750, height=600, bg="white")
canvas.pack()file_path = None
face_image_labels = []def xz():global file_pathfile_path = filedialog.askopenfilename(title="选择图片",filetypes=(("图片文件", "*.png *.jpg *.jpeg *.bmp"),("所有文件", "*.*")))if file_path:image = Image.open(file_path)image = image.resize((370, 450))photo = ImageTk.PhotoImage(image)image_label = tk.Label(win, image=photo)image_label.image = photoimage_label.place(x=10, y=100)def tq():global file_path, face_image_labels, canvasif file_path:img = face_recognition.load_image_file(file_path)face_locations = face_recognition.face_locations(img, model='hog')for face_image_label in face_image_labels:face_image_label.destroy()face_width = 100spacing = 10canvas_width = (face_width + spacing) * len(face_locations) - spacingcanvas_height = len(face_locations) * 100canvas.config(width=canvas_width, height=canvas_height)scrollbar = tk.Scrollbar(win, orient="vertical", command=canvas.yview)scrollbar.place(x=730, y=100, height=500)canvas.configure(yscrollcommand=scrollbar.set)face_image_labels = []x_p = 430y_p = 90count = 0for i, face_location in enumerate(face_locations):top, right, bottom, left = face_locationface_img = img[top:bottom, left:right]face_name = f"face_{i}.jpg"face_image = Image.fromarray(face_img)face_image = face_image.resize((100, 100))face_photo = ImageTk.PhotoImage(face_image)face_image_label = tk.Label(canvas, image=face_photo)face_image_label.image = face_photocanvas.create_window(x_p, y_p, anchor='nw', window=face_image_label)face_image_labels.append(face_image_label)count += 1if count == 2: # 每放两张图片后增加间距x_p = 430 # 重置x_py_p += 130 # 设置第一行和第二行之间的垂直间距为50像素count = 0else:x_p += 110def on_mouse_wheel(event):canvas.yview_scroll(-1 * (event.delta // 120), "units") # 根据鼠标滚轮事件滚动Canvascanvas.bind_all("<MouseWheel>", on_mouse_wheel) # 绑定鼠标滚轮事件def close():win.destroy() # 先关闭当前窗口subprocess.Popen(["python", "提取.py"]) # 再打开新的脚本# 按钮设计
image = Image.open("A.gif")
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32, command=xz)
bt1.place(x=30, y=30)image = Image.open("F3.gif")
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32, command=tq)
bt2.place(x=275, y=30)image = Image.open("B.gif")
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32, command=close)
bt3.place(x=520, y=30)win.mainloop()
相关文章:

OpenCv之简单的人脸识别项目(人脸提取页面)
人脸识别 准备五、人脸提取页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义单人脸提取脚本4.定义多人脸提取脚本5.创建一个退出对话框6.按钮设计6.1单人脸提取按钮6.2多人脸提取按钮6.3返回按钮 7.定义关键函数8…...

linux 内核映像差异介绍:vmlinux、zImage、zbImage、image、uImage等
一、背景 Linux内核是整个Linux操作系统的核心部分,它是一个负责与硬件直接交互的软件层,并且提供多种服务和接口,让用户程序能够方便地使用硬件资源。 当我们编译自定义内核时,可以将其生成为以下内核映像之一:vmli…...

【Linux-INPUT输入的子系统】
Linux-INPUT输入的子系统 ■ input 子系统简介■ input 驱动编写流程■ 事件类型 ■ ■ input 子系统简介 input 子系统就是管理输入的子系统, input 子系统分为 input 驱动层、 input 核心层、 input 事件处理层,最终给用户空间提供可访问的设备节点 …...

密码加密及验证
目录 为什么需要加密? 密码算法分类 对称密码算法 非对称密码算法 摘要算法 DigestUtils MD5在线解密工具原理 实现用户密码加密 代码实现 为什么需要加密? 在MySQL数据库中,我们常常需要对用户密码、身份证号、手机号码等敏感信息进…...

找出字符串中出现最多次数的字符以及出现的次数
str.charAt(i) 是JavaScript中获取字符串中特定位置字符的方法,表示获取当前的字符。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...

如何看待央行买卖长期国债?
央行远比大家想象中的要渴求货币宽松。 引子 今年以来,有不少关于“央行买卖长期国债”的讨论,前些时候关注点在“买”,最近关注点在“卖”。 然而,市场上的讨论采用了十分粗糙和松散的“自然语言”,所以࿰…...

MATLAB算法实战应用案例精讲-【数模应用】Turf组合模型(附MATLAB、python和R语言代码实现)
目录 几个高频面试题目 如何以最小的成本覆盖到最大的消费群体? 应用场景 TURF举例...

android源码下载编译模拟器运行
安卓aosp源码下载,编译,模拟器运行 virtualbox7 安装ubuntu20.04,ubuntu22.04 编译android aosp 源码可以,但是模拟器跑不了,哪个版本都是要么黑屏,要么整个vbox虚拟机闪退。解决方案使用vmware17 ##拯救…...

Golang:Sirupsen/logrus是一个日志库
Sirupsen/logrus是一个日志库 文档 https://github.com/Sirupsen/logrus 安装 go get github.com/sirupsen/logrus代码示例 package mainimport ("github.com/sirupsen/logrus" )func main() {var log logrus.New()log.Trace("Something very low level.&…...

Android Studio插件开发 - Dora SDK的IDE插件
IDE插件开发简介 Android Studio是一种常用的集成开发环境(IDE),用于开发Android应用程序。它提供了许多功能和工具,可以帮助开发人员更轻松地构建和调试Android应用程序。 如果你想开发Android Studio插件,以下是一…...

【mybatis】缓存
一级缓存和二级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从一级缓存中直接获取,不会从数据库重新查询。一级缓存默认是开启 使一级缓存失效的四种情况: 11.1…...

自定义类型:结构体类型
在学习完指针相关的知识后将进入到c语言中又一大重点——自定义类型,在之前学习操作符以及指针时我们对自定义类型中的结构体类型有了初步的了解,学习了结构体类型的创建以及如何创建结构体变量,还有结构体成员操作符的使用,现在我…...

C++对象移动
在某些情况下,对象拷贝后就立即被销毁了,这时利用新标准(C11)提供的对象移动而非拷贝将大幅提升性能. 1.右值引用 为了支持移动操作,c11新增了一种引用 - 右值引用(rvalue reference)。这种引用必须指向右值,使用&&声明。 右值引用只能引用临时变量或常量值. 右值引用…...

“华为杯”第十三届中国研究生 数学建模竞赛-E题:粮食最低收购价政策问题研究(续)
目录 4.3 问题三:粮食价格的特殊规律性模型 4.3.1 分析和建模 4.3.2 求解和结果...

(一)django目录介绍
1、生成django项目,得到的目录如下 manage.py:命令行工具,内置多种方式与项目进行交互。在命令提示符窗口下,将路径切换到项目并输入python manage.py help,可以查看该工具的指令信息。 默认的数据库工具,sqlite 在…...

leetcode5 最长回文子串
给你一个字符串 s,找到 s 中最长的 回文 子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s "cbbd" 输…...

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023
《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023 前言 相关个性化生成论文推荐简介问题定义方法损失函数实验结果 前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手…...

python采集汽车价格数据
python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…...

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第四周) - 语言建模
语言建模 1. 统计语言模型2. N-gram语言建模 2.1. N-gram语言模型中的平滑处理 3. 语言模型评估4. 神经语言模型5. 循环神经网络 5.1. Vanilla RNN5.2. LSTM 1. 统计语言模型 统计语言模型旨在量化自然语言文本中序列的概率分布,即计算一个词序列(如一…...

Jitsi meet 退出房间后,用户还在房间内
前言 Jitsi Meet 如果客户端非正常退出会议,会产生用户还在房间内,实际用户已经退出的情况,需要一段时间内,才会在UI离开房间,虽然影响不大,但是也容易导致体验不好。 保活 Jitsi Meet 会和前端做一个保…...

Java 18 新特性
Java 作为一门广泛应用于企业级开发和系统编程的编程语言,一直以来都在不断进化和改进。2022 年发布的 Java 18 版本为开发者带来了一些新的特性和改进,这些特性不仅提升了开发效率,还进一步增强了 Java 语言的功能和灵活性。本文将深入探讨 …...

c++基础创建对象
在C中,test a; 和 test a new test(); 是两种不同的初始化或创建对象的方式,而且它们之间存在根本的区别。 test a; 这是对象a的栈上分配。在声明test a;时,编译器会在栈上为a分配内存,并调用test类的默认构造函数(…...

WHAT - 容器化系列(二)- docker
目录 一、前言二、Docker镜像:可运行软件包三、Docker容器:可执行环境四、容器和镜像的关系五、创建镜像的过程5.1 编写Dockerfile5.2 构建Docker镜像5.3 查看构建的镜像5.4 运行Docker容器5.5 验证容器运行状态5.6 推送镜像到镜像仓库(可选&…...

力扣 19题 删除链表的倒数第 N 个结点 记录
题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&am…...

渗透测试之Web安全系列教程(二)
今天,我们来讲一下Web安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。Web…...

【算法】在?复习一下快速排序?
基本概念 快速排序是一种基于交换的排序算法,该算法利用了分治的思想。 整个算法分为若干轮次进行。在当前轮次中,对于选定的数组范围[left, right],首先选取一个标志元素pivot,将所有小于pivot的元素移至其左侧,大于…...

matlab安装及破解
一、如何下载 软件下载链接,密码:98ai 本来我想自己生成一个永久百度网盘链接的,但是: 等不住了,所以大家就用上面的链接吧。 二、下载花絮 百度网盘下载速度比上载速度还慢,我给充了个会员,…...

Tree——输出项目的文件结构(Linux)
输出项目中的文件结构可以使用tree命令。tree是一个用于以树状结构显示目录内容的命令行工具。它非常适合快速查看项目的文件结构。安装: sudo apt-get install tree 使用: 在命令行中导航到项目的根目录,输出文件结构。 tree 也可以将结构输…...

UE5 读取本地图片并转换为base64字符串
调试网址:在线图像转Base64 - 码工具 (matools.com) 注意要加(data:image/png;base64,) FString UBasicFuncLib::LoadImageToBase64(const FString& ImagePath) {TArray<uint8> ImageData;// Step 1: 读取图片文件到字节数组if (!…...

【NOIP普及组】税收与补贴问题
【NOIP普及组】税收与补贴问题 💖The Begin💖点点关注,收藏不迷路💖 每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),…...