OpenCv之简单的人脸识别项目(人脸识别页面以及人脸比对页面)

准备

本篇将展示人脸识别页面和人脸比对页面,并与上一篇登录页面连接起来。

三、人脸识别页面

1.导入所需的包

subprocess:

这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。

tkinter:

Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。

filedialog:

这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。

PIL (Python Imaging Library):

PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。

face_recognition:

这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。

ImageDraw:

ImageDraw是PIL库的一个模块,它提供了一些简单的图形绘制功能,如绘制线条、矩形、椭圆形、文字等。这个模块通常用于在图像上绘制图形或标注。

import subprocess
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import face_recognition
from PIL import ImageDraw

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("7.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来初始化它们,这意味着在程序开始时,它们不指向任何具体的图像路径或标签对象。在实际的应用程序中,将会通过用户的操作或程序的逻辑来更新这些变量,以便它们能够存储图像路径和显示图像。

# 定义一个全局变量来保存图像路径
save_image = None
image_label = None

用法:save_image: 这个变量被用来保存图像的路径。
image_label: 这个变量通常用于在Tkinter应用程序中显示图像。

4.定义选择并显示图片的函数

定义了一个名为 xz 的函数,用于选择图片文件并将其显示在 Tkinter 窗口中。

def xz():

4.1声明全局变量

函数内部对这些变量的修改将会影响函数外部的同名变量。

global save_image, image_label

4.2设置文件选择对话框

使用 tkinter 的 filedialog 模块来弹出一个文件选择对话框,让用户选择一个图片文件。

file_path = filedialog.askopenfilename(title="选择图片",
                                    filetypes=(("图片文件", "*.png;*.jpg;*.jpeg;*.bmp"),
                                             ("所有文件", "*.*")))

用法:title=“选择图片”:设置文件选择对话框的标题为“选择图片”。

filetypes=((“图片文件”, “.png;.jpg;.jpeg;.bmp”), (“所有文件”, “.”)):设置文件选择对话框的文件类型过滤选项。第一个元组表示图片文件类型,包括 .png, .jpg, .jpeg, .bmp 格式;第二个元组表示所有文件类型。

4.3设置条件语句

打开用户选择的图片文件,调整其大小,并将其转换为 Tkinter 可以显示的格式。

if file_path:
      image = Image.open(file_path)
      image = image.resize((300, 400))  # 调整图像大小
      photo = ImageTk.PhotoImage(image)

4.4创建一个标签显示图像

创建一个组件,将这张图片显示在 Tkinter 窗口中,并保存图片的路径到一个全局变量中。

# 创建一个标签用于显示图像
image_label = tk.Label(win, image=photo)
image_label.image = photo  # 保持对图像的引用,避免被垃圾回收
image_label.place(x=10, y=100)
save_image = file_path

5.定义检测人脸并画框的函数

5.1定义函数和声明全局变量

函数内部对这些变量的修改将会影响函数外部的同名变量。

def sb():
    global save_image, image_label

5.2加载和处理图像

首先检查 save_image 是否有值,如果有,则加载该图像,并使用 face_recognition 库来检测图像中的人脸位置。然后,它创建一个 PIL 图像,并在每个检测到的人脸周围画一个红色矩形框。最后,它调整图像的大小到 300x400 像素。

if save_image:
    # 加载图像并转换为RGB
    rgb_image = face_recognition.load_image_file(save_image)

    # 查找图像中的人脸位置
    face_locations = face_recognition.face_locations(rgb_image)

    # 创建一个PIL Image对象并在每个检测到的人脸周围画框
    pil_image = Image.fromarray(rgb_image)
    draw = ImageDraw.Draw(pil_image)
    for top, right, bottom, left in face_locations:
        draw.rectangle([(left, top), (right, bottom)], outline=(255, 0, 0), width=2)

    # 在这里调整图像到固定大小
    pil_image = pil_image.resize((300, 400))  # 调整图像到300x400像素

5.3显示处理后的图像

将处理后的 PIL 图像转换为 Tkinter 可以显示的 PhotoImage 对象。然后,它创建一个新的 Label 组件来显示这个图像,并将其放置在主窗口的 (400, 100) 位置。

# 转换PIL Image为tkinter可以显示的PhotoImage
photo = ImageTk.PhotoImage(pil_image)

image_labe2 = tk.Label(win, image=photo)
image_labe2.image = photo  # 保持对图像的引用,避免被垃圾回收
image_labe2.place(x=400, y=100)

说明:sb 函数的作用是加载用户选择的图片,检测其中的人脸,然后在每个检测到的人脸周围画框,并将处理后的图片显示在 GUI 窗口中。这个函数通常会被绑定到一个按钮的点击事件上,当用户点击按钮时,会调用这个函数来执行人脸检测和显示处理后的图像。

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 的按钮,该按钮将显示一个前面导入的名为 “F12.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb 的函数。

image = Image.open("F2.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值