当前位置: 首页 > news >正文

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操作系统的核心部分&#xff0c;它是一个负责与硬件直接交互的软件层&#xff0c;并且提供多种服务和接口&#xff0c;让用户程序能够方便地使用硬件资源。 当我们编译自定义内核时&#xff0c;可以将其生成为以下内核映像之一&#xff1a;vmli…...

【Linux-INPUT输入的子系统】

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

密码加密及验证

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

找出字符串中出现最多次数的字符以及出现的次数

str.charAt(i) 是JavaScript中获取字符串中特定位置字符的方法&#xff0c;表示获取当前的字符。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...

如何看待央行买卖长期国债?

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

MATLAB算法实战应用案例精讲-【数模应用】Turf组合模型(附MATLAB、python和R语言代码实现)

目录 几个高频面试题目 如何以最小的成本覆盖到最大的消费群体? 应用场景 TURF举例...

android源码下载编译模拟器运行

安卓aosp源码下载&#xff0c;编译&#xff0c;模拟器运行 virtualbox7 安装ubuntu20.04&#xff0c;ubuntu22.04 编译android aosp 源码可以&#xff0c;但是模拟器跑不了&#xff0c;哪个版本都是要么黑屏&#xff0c;要么整个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是一种常用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Android应用程序。它提供了许多功能和工具&#xff0c;可以帮助开发人员更轻松地构建和调试Android应用程序。 如果你想开发Android Studio插件&#xff0c;以下是一…...

【mybatis】缓存

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

自定义类型:结构体类型

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

C++对象移动

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

“华为杯”第十三届中国研究生 数学建模竞赛-E题:粮食最低收购价政策问题研究(续)

目录 4.3 问题三:粮食价格的特殊规律性模型 4.3.1 分析和建模 4.3.2 求解和结果...

(一)django目录介绍

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

leetcode5 最长回文子串

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

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023

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

python采集汽车价格数据

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

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第四周) - 语言建模

语言建模 1. 统计语言模型2. N-gram语言建模 2.1. N-gram语言模型中的平滑处理 3. 语言模型评估4. 神经语言模型5. 循环神经网络 5.1. Vanilla RNN5.2. LSTM 1. 统计语言模型 统计语言模型旨在量化自然语言文本中序列的概率分布&#xff0c;即计算一个词序列&#xff08;如一…...

Jitsi meet 退出房间后,用户还在房间内

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

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...