首页 > 其他分享 >OpenCv之简单的人脸识别项目(人脸识别页面以及人脸比对页面)

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

时间:2024-05-30 14:30:08浏览次数:23  
标签:人脸识别 win image label OpenCv 人脸 图像 save 页面

人脸识别

准备

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

三、人脸识别页面

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, image=photo3, width=198, height=32,command=sb)
bt2.place(x=275, y=30)

7.3返回按钮

定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 close的函数。

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 subprocess
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import face_recognition
from PIL import ImageDraw

win = tk.Tk()
win.title('Welcome')
win.geometry('750x600')

#背景设计
image = Image.open("7.gif")
image = image.resize((750, 600))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()

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

#选择图片
def xz():
    global save_image, image_label
    file_path = filedialog.askopenfilename(title="选择图片",
                                           filetypes=(("图片文件", "*.png;*.jpg;*.jpeg;*.bmp"),
                                                      ("所有文件", "*.*")))
    if file_path:
        image = Image.open(file_path)
        image = image.resize((300, 400))  # 调整图像大小
        photo = ImageTk.PhotoImage(image)

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

#识别图片
def sb():
    global save_image, image_label
    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像素

        # 转换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)

def close():
    subprocess.Popen(["python","登录页面.py"])
    win.destroy()

#按钮设计
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("F2.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=sb)
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一起使用来创建文件选择器。

Label:

Label 是 Tkinter 中的一个组件,用于在窗口中显示文本或图像。在这个上下文中,它可能被用来显示图像或相关的文本信息。

Button:

Button 是 Tkinter 中的一个组件,用于创建按钮。用户可以通过点击按钮来触发某些操作,如打开文件对话框或执行特定的功能。

PIL (Python Imaging Library):

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

ImageTk:

ImageTk是PIL库中用于与Tkinter一起使用的模块,它提供了在Tkinter中显示图像的功能。它通常与Tkinter的PhotoImage类一起使用,以在Tkinter应用程序中显示PIL的Image对象。

face_recognition:

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

subprocess:

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

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

2.设置窗口

2.1定义窗口外观和大小

实例化窗口,设置窗口标题,尺寸。

# 创建Tkinter窗口
win = tk.Tk()
win.title('人脸对比')
win.geometry('700x600')

2.2设置窗口背景

2.2.1设置背景图片

调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。

#背景设计
image = Image.open("13.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_image1 = None
save_image2 = None
image_label1 = None
image_label2 = None

用法:
save_image1:这个变量被用来保存用户选择的第一个图片文件的路径。在图像处理或显示图像的应用程序中,您可能需要存储用户选择的图像文件的路径,以便之后进行操作,如加载、显示或处理图像。

save_image2:这个变量被用来保存用户选择的第二个图片文件的路径。与 save_image1 类似,它用于存储第二个图片文件的路径。

image_label1:这个变量通常用于在Tkinter应用程序中显示第一个图片。在Tkinter中,Label 组件可以用来显示文本或图像。image_label1可能被用来引用一个Label组件,该组件被配置为显示一个图像。这个标签可以放置在窗口中,并且可以根据需要更新以显示不同的图像。

image_label2:这个变量通常用于在Tkinter应用程序中显示第二个图片。与 image_label1 类似,它可能被用来引用一个Label组件,该组件被配置为显示一个图像。

4.提取和比较人脸编码相似度

4.1函数定义和条件判断

首先检查 save_image1 和 save_image2 是否都包含有效的图片路径。如果两个变量都非空,条件为真,执行大括号内的代码;如果其中一个变量为空,条件为假,大括号内的代码不会执行。

# 定义比较人脸相似度的函数
def compare_faces():
    if save_image1 and save_image2:
        # 加载图片并转换为RGB
        img1 = face_recognition.load_image_file(save_image1)
        img2 = face_recognition.load_image_file(save_image2)

4.2提取人脸编码

使用 face_recognition 库的 face_encodings 函数来提取两个图片中的人脸编码。face_encodings 函数返回一个列表,其中包含每个图片中检测到的人脸的编码。

# 提取人脸编码
face1_encodings = face_recognition.face_encodings(img1)
face2_encodings = face_recognition.face_encodings(img2)

4.3检查是否检测到人脸

检查 face1_encodings 和 face2_encodings 是否都为空。如果两个列表都为空,意味着没有检测到人脸,则返回相似度为0。

# 如果没有检测到人脸,返回相似度为0
if not face1_encodings or not face2_encodings:
    return 0.0

4.4提取第一个编码进行比较

从 face1_encodings 和 face2_encodings 列表中提取第一个元素,因为通常只处理图像中第一个检测到的人脸。

# 比较人脸编码
face1_encoding = face1_encodings[0]
face2_encoding = face2_encodings[0]

4.5计算相似度

使用 face_recognition 库的 compare_faces 函数来比较两个编码的相似度。compare_faces 函数返回一个布尔值列表,表示每个编码与目标编码的相似度。由于我们只比较两张图片,我们只需要第一个元素,即两个编码是否相似的布尔值。

# 计算相似度
similarity = face_recognition.compare_faces([face1_encoding], face2_encoding)[0]

注意:compare_faces返回的是布尔值,我们需要计算相似度分数(如果需要的话)
这里使用compare_faces的默认行为,即返回是否相似的布尔值
若要计算具体相似度分数,则需要使用其他方法(如余弦相似度等)

4.6更新 Tkinter 组件的文本

检查 similarity 是否为真。如果 similarity 为真,意味着两个编码相似,则更新一个名为 b5 的 Tkinter 组件的文本为 “人脸相似”;如果不相似,则更新文本为 “人脸不相似”。

if similarity:
    b5.config(text="人脸相似")
else:
    b5.config(text="人脸不相似")

4.7函数外部条件

如果 save_image1 和 save_image2 都不包含有效的图片路径,则更新 b5 组件的文本为 “请先选择两张图片。

else:
    b5.config(text="请先选择两张图片!")

5.定义选择并显示的函数

创建一个内部函数 select_image,该函数允许用户选择一个图片文件,并指示应该使用哪个全局变量来存储这个图片路径。当 select_image 函数被调用时,它会弹出文件选择对话框,让用户选择图片,并调用 display_image 函数来显示选择的图片。

def s1(label_var):
    def select_image():
        nonlocal label_var
        file_path = filedialog.askopenfilename(title="选择图片",
                                               filetypes=(("图片文件", "*.png;*.jpg;*.jpeg;*.bmp"),
                                                          ("所有文件", "*.*")))
        if file_path:
            global save_image1, save_image2
            if label_var == 1:
                save_image1 = file_path
            else:
                save_image2 = file_path
            display_image(file_path, label_var)

    return select_image

6.定义显示图片的函数

使用 PIL 的 Image 模块打开传入的 image_path 对应的图片文件,并将其调整到 250x300 像素的大小。然后,它将调整后的图片转换为 Tkinter 可以显示的 PhotoImage 对象。接着,它创建一个新的 Label 组件来显示这个图像,并将其放置在主窗口的 (60, 150) 位置。最后,它根据 label_var 的值,更新相应的全局变量 image_label1 或 image_label2。

def display_image(image_path, label_var):
    global image_label1, image_label2

    # 根据传入的label_var来设置正确的标签
    if label_var == 1:
        current_label = image_label1
    else:
        current_label = image_label2

        # 如果之前已经有一个标签,先销毁它
    if current_label:
        current_label.destroy()

    image = Image.open(image_path)
    image = image.resize((250, 300), Image.Resampling.LANCZOS)
    photo = ImageTk.PhotoImage(image)

    # 创建新的标签并显示图片
    current_label = Label(win, image=photo)
    current_label.image = photo  # 保持对PhotoImage对象的引用,防止被垃圾回收
    current_label.place(x=60 if label_var == 1 else 360, y=150)

    # 更新全局变量
    if label_var == 1:
        image_label1 = current_label
    else:
        image_label2 = current_label

7.定义关闭窗口的函数

当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。

def close():
    subprocess.Popen(["python","登录页面.py"])
    win.destroy()

用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。

8.按钮设计

8.1 选择第一张图片按钮

定义一个名为 bt1 的按钮,该按钮将显示一个前面导入的名为 “F11.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 s1(1)的函数。

image = Image.open("F11.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=s1(1))
bt1.place(x=100, y=30)

8.2选择第二张图片按钮

定义一个名为 bt2 的按钮,该按钮将显示一个前面导入的名为 “F12.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 s1(2)的函数。

image = Image.open("F13.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=175, height=32,command=compare_faces)
bt3.place(x=270, y=510)

8.3返回按钮

定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 的函数。

image = Image.open("B.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=550, y=510)

用法:close函数通常这个函数用来关闭应用程序窗口。

9.设置Label组件

b5 = Label(win, text="",width=20,font=22,bg="white")
b5.place(x=260, y=475)

10.定义关键函数

win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。

win.mainloop()

注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。

11. 人脸比对页面运行结果图

在这里插入图片描述

12.人脸比对页面功能展示图

在这里插入图片描述

人脸比对页面完整代码

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

# 创建Tkinter窗口
win = tk.Tk()
win.title('人脸对比')
win.geometry('700x600')

#背景设计
image = Image.open("13.gif")
image = image.resize((700, 600))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()



# 定义全局变量来存储选择的图片路径和标签
save_image1 = None
save_image2 = None
image_label1 = None
image_label2 = None


# 定义比较人脸相似度的函数
def compare_faces():
    if save_image1 and save_image2:
        # 加载图片并转换为RGB
        img1 = face_recognition.load_image_file(save_image1)
        img2 = face_recognition.load_image_file(save_image2)

        # 提取人脸编码
        face1_encodings = face_recognition.face_encodings(img1)
        face2_encodings = face_recognition.face_encodings(img2)

        # 如果没有检测到人脸,返回相似度为0
        if not face1_encodings or not face2_encodings:
            return 0.0

        # 比较人脸编码
        face1_encoding = face1_encodings[0]
        face2_encoding = face2_encodings[0]

        # 计算相似度
        similarity = face_recognition.compare_faces([face1_encoding], face2_encoding)[0]

        # 注意:compare_faces返回的是布尔值,我们需要计算相似度分数(如果需要的话)
        # 这里使用compare_faces的默认行为,即返回是否相似的布尔值
        # 若要计算具体相似度分数,则需要使用其他方法(如余弦相似度等)

        if similarity:
            b5.config(text="人脸相似")
        else:
            b5.config(text="人脸不相似")
    else:
        b5.config(text="请先选择两张图片!")

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


def s1(label_var):
    def select_image():
        nonlocal label_var
        file_path = filedialog.askopenfilename(title="选择图片",
                                               filetypes=(("图片文件", "*.png;*.jpg;*.jpeg;*.bmp"),
                                                          ("所有文件", "*.*")))
        if file_path:
            global save_image1, save_image2
            if label_var == 1:
                save_image1 = file_path
            else:
                save_image2 = file_path
            display_image(file_path, label_var)

    return select_image


def display_image(image_path, label_var):
    global image_label1, image_label2

    # 根据传入的label_var来设置正确的标签
    if label_var == 1:
        current_label = image_label1
    else:
        current_label = image_label2

        # 如果之前已经有一个标签,先销毁它
    if current_label:
        current_label.destroy()

    image = Image.open(image_path)
    image = image.resize((250, 300), Image.Resampling.LANCZOS)
    photo = ImageTk.PhotoImage(image)

    # 创建新的标签并显示图片
    current_label = Label(win, image=photo)
    current_label.image = photo  # 保持对PhotoImage对象的引用,防止被垃圾回收
    current_label.place(x=60 if label_var == 1 else 360, y=150)

    # 更新全局变量
    if label_var == 1:
        image_label1 = current_label
    else:
        image_label2 = current_label

        # 创建选择图片的按钮
def close():
    subprocess.Popen(["python","登录页面.py"])
    win.destroy()


#按钮设计

image = Image.open("F11.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=s1(1))
bt1.place(x=100, y=30)


image = Image.open("F12.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=s1(2))
bt2.place(x=410, y=30)


image = Image.open("F13.gif")  # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=175, height=32,command=compare_faces)
bt3.place(x=270, y=510)

image = Image.open("B.gif")  # 加载一张图片
photo5 = ImageTk.PhotoImage(image)
bt4 = tk.Button(win, image=photo5, width=110, height=32,command=close)
bt4.place(x=550, y=510)

b5 = Label(win, text="",width=20,font=22,bg="white")
b5.place(x=260, y=475)


# 运行Tkinter事件循环
win.mainloop()

标签:人脸识别,win,image,label,OpenCv,人脸,图像,save,页面
From: https://blog.csdn.net/2301_78972534/article/details/139289125

相关文章

  • 微信小程序之实现弹窗组件及点击弹窗按钮实现页面跳转
    创建一个名为PopupWindow的弹窗组件:   1、创建组件目录结构:    在项目的components目录下新建一个名为PopupWindow的文件夹,里面包含四个核心文件: PopupWindow.wxml 、PopupWindow.wxss、PopupWindow.js 、PopupWindow.json   2、编写组件文件......
  • 对于一个页面的两个更新方法,我们到底该写成一个通用的还是两个单独的?
    如果一个页面有两个更新方法的话,分别是通过不同的功能点点击过去的,比如分别更新一个页面的上半部分内容(业务实体A),一个是只是更新其中的发票信息的(发票实体B),虽然在一个页面,但是也不应该写成一个更新请求这种的因为两个更新没什么关联的关系,而且更新的是实体不是一个,所以就可以整成......
  • 使用opencv 进行车牌位置检测的源代码
    效果:这一个车牌识别系统中的预处理函数,其主要目的是对输入的车牌图片进行一系列的图像处理操作,以便后续的车牌识别算法能够更准确地识别出车牌。整个函数的流程是:读取图像->缩放->灰度化->去噪->边缘检测->形态学操作->轮廓检测->筛选可能的车牌轮廓->......
  • 一个python文件做图像 灰度化 反转 通道分离 噪声、滤波 高斯双边滤波 均值偏移滤波
    代码测试可以正常运行。灰度化反转通道分离噪声、滤波高斯双边滤波均值偏移滤波图像二值化Canny边缘检测直线检测圆检测轮廓发现人脸检测测试可以运行代码如下:'''file:ImageMiniLab.pydate:2019/04/1920:00author:itisyan......
  • 当通过 target="_blank" 链接打开新页面时,Playwright 会截取错误页面的截图
    我在使用Playwright时遇到了一个问题,它截取了错误页面的屏幕截图。当通过target="_blank"链接打开新页面时,它不会截取最新页面,而是截取旧页面的屏幕截图。我的应用程序的业务逻辑主要包含在一个while循环中,而且我没有使用Playwright进行测试。我尝试了两种方法来解决这个......
  • Azure DevOps Wiki:如何在页面内进行链接?
    在我的DevOpsWiki中,我有一个页面,并希望创建一个包含文章链接的索引。我主要是找到了这本手册来实现这一目标:learn.microsoft.com...但是我没有成功。如何在Wiki页面内进行链接?您能举例说明吗?我想我必须在页眉处设置一个锚点,然后将索引项链接到该锚点。下面是一个示例:索......
  • Python-使用OpenCV(二)_第一个示例程序
    1、创建项目2、创建代码importcv2#加载图片image=cv2.imread("C:\\Users\\Administrator\\Pictures\\Screenshots\\20240311220733.png")#显示图片cv2.imshow("Image",image)#等待任意键被敲击cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()3、结......
  • WPF使用事件聚合器,实现任意页面跨页通信
    前言:最近几天有好几个小伙伴玩WPF,遇到不同页面,不知道要怎么传递消息。于是,我今天就来演示一个事件聚合器的玩法,采用prism框架来实现。作为福利,内容附带了主页面打开对话框时候直接通过参数传递消息的一个小例子,具体请自行围观。以下内容,创建wpf项目以及引用prism和实现依赖注入......
  • HarmonyOS实战开发:@ohos.router (页面路由)
    本模块提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、同应用内的某个页面替换当前页面、返回上一页面或指定的页面等。说明本模块首批接口从APIversion8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。页面路由需要在页面渲染完成之后......
  • 使用 opencv 实现模板匹配功能前的预处理要求
    我使用opencv.TM_CCOEFF_NORMED函数来匹配发票模板。但是,模板匹配功能并没有产生准确的结果。匹配准确率相当低,只有50%。您能否建议我在流程中应包含或更改哪些内容以提高准确性?templateMap=cv.matchTemplate(img_r,resized_template,cv.TM_CCOEFF_NORMED)m......