人脸识别系统之静态人脸识别

人脸识别系统

一. 静态人脸识别

1. 人脸提取

1.1. 导入资源包
javascript 复制代码
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import face_recognition
import os
import subprocess
import sys

:进行人脸识别像目前我们要先进行导入资源包,在python环境和中打开终端,安装命令例如:pip install tkinter。

Filedialog:一个与tkinter一起使用的模块,它提供了打开文件和保存文件的功能。

Messagebox:一个与tkinter一起使用的模块,它提供了显示消息框的功能,如警告、信息、询问等。

PIL (Pillow):一个图像处理库,用于打开、编辑和保存图像。它提供了广泛的图像处理功能,包括缩放、旋转、裁剪、添加文本等。

face_recognition:这是一个用于检测和识别图像中的人脸的库。它使用深度学习模型来执行这些任务,并提供了易于使用的API。

Subprocess:这是一个内置的Python库,用于启动和管理子进程。它允许您运行外部命令和脚本,并将它们的结果返回给Python。

1.2. 图像识别
javascript 复制代码
#定义一个人脸识别的函数
def recognize_faces():
    image_path = image_label.cget("text")
    if image_path:
        # 加载图片
        image = face_recognition.load_image_file(image_path)
        # 识别图片上所有人脸的位置
        face_locations = face_recognition.face_locations(image)

        # 读取图片用于PIL显示
        img = Image.open(image_path)
        # 创建一个可以在PIL中绘制的图像
        draw = ImageDraw.Draw(img)

        # 在每个人脸周围画框
        for face_location in face_locations:
            top, right, bottom, left = face_location
            draw.rectangle(((left, top), (right, bottom)), outline=(255, 255, 255))

        # 如果识别到人脸
        if face_locations:
            # 裁剪人脸区域
            face_imgs = []
            for face_location in face_locations:
                top, right, bottom, left = face_location
                face_img = img.crop((left, top, right, bottom))
                face_imgs.append(face_img)

            # 显示第一个识别到的人脸
            if face_imgs:
                face_img = face_imgs[0]
                # 调整图片大小以适应窗口
                face_img=face_img.resize((400,300), Image.LANCZOS)
                # 创建ImageTk对象
                face_imgTk = ImageTk.PhotoImage(face_img)
                # 更新图像标签
                processed_image_label.config(image=face_imgTk)
                processed_image_label.image = face_imgTk
        else:
            # 弹窗提示
            messagebox.showinfo("提示", "未识别到人脸,请更换照片")

:函数recognize_faces的作用是加载一个图片,使用face_recognition库来识别图片中的人脸位置,并在图片上画出这些人脸的矩形框。如果识别到人脸,它还会裁剪出这些人脸区域,调整图片大小以适应窗口,并将裁剪后的图片显示在另一个标签上。如果未识别到人脸,它会弹出一个消息框提示用户更换照片。

1.3.创建返回功能
javascript 复制代码
def return_to_rlsb():
    # 获取当前Python解释器的路径
    python_exe = sys.executable
    # 使用subprocess.Popen启动rlsb.py脚本
    subprocess.Popen([python_exe, "C:/Users/HUAWEI/PycharmProjects/pythonProject1/人脸识别/机器学习的人脸识别/rlsb.py"])
    # 销毁当前窗口
    root.destroy()

:这段代码定义了一个函数return_to_rlsb,其作用是关闭当前的Tkinter窗口,并启动一个新的Python解释器来运行另一个脚本rlsb.py,用于创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。

1.4.创建人脸提取界面窗口
javascript 复制代码
# 创建主窗口
root = tk.Tk()
root.title('人脸提取')

# 设置窗口大小
root.geometry('700x400')

# 加载背景图
background_image = Image.open('人脸提取background.jpg')
background_image=background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

:这段代码的作用是创建一个Tkinter主窗口,并设置窗口标题和大小。然后,它加载了一个背景图片,调整了图片的大小以适应窗口,并将调整后的图片作为背景添加到窗口中。
背景图片

1.5.创建按钮
javascript 复制代码
# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=120, y=10)
start_button= tk.Button(root, text='开始提取', command=recognize_faces, width=10, height=1, bg='gray').place(x=530, y=10)
back_button = tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=330, y=365)

# 原始图像标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, padx=10, pady=10)

# 处理后的图像标签
processed_image_label = tk.Label(root, text="", image="")
processed_image_label.pack(side=tk.RIGHT, padx=10, pady=10)

:这段代码的作用是在Tkinter主窗口中添加三个按钮和一个标签,用于选择图片、开始提取人脸、返回上一个界面,以及显示原始图像和处理后的图像。

1.6.显示窗口
javascript 复制代码
# 显示窗口
root.mainloop()

运行结果

2.人脸识别

2.1.导入资源包
javascript 复制代码
Import tkinter as tk
from tkinter import filedialog
import face_recognition
import os
from PIL import Image, ImageTk
import subprocess
import sys

:导入了Tkinter库以及与图像处理和人脸识别相关的其他库,可以帮助我们处理图形界面、图像处理、操作系统交互等多种任务。

2.2.识别图片中人脸的位置
javascript 复制代码
# 人脸识别函数
def recognize_faces(image_path):
    # 加载图片
    image = face_recognition.load_image_file(image_path)
    # 识别图片上所有人脸的位置
    face_locations = face_recognition.face_locations(image)
    return face_locations

:函数recognize_faces的作用是加载一个图片,并使用face_recognition库来识别图片中的人脸位置。

2.3.允许用户上传图片,然后显示选中的图像
javascript 复制代码
# 选择图片函数
def select_image():
    # 打开文件对话框,让用户选择图像文件
    image_path=filedialog.askopenfilename(initialdir="faceimage", filetypes=[("Image Files", "*.png *.jpg *.jpeg *.bmp")])
    if image_path:
        img = Image.open(image_path)
        img = img.resize((300, 250), Image.LANCZOS)  # 调整图片大小
        img = ImageTk.PhotoImage(img)
        image_label.config(image=img)
        image_label.image = img  # 保留对图像的引用
        image_label_path.config(text=image_path)

:函数select_image的作用是打开一个文件对话框,让用户选择一个图像文件,然后将选中的图像显示在一个标签上。

2.4.开始识别过程并显示识别结果
javascript 复制代码
# 开始识别函数
def start_recognition():
    image_path = image_label_path.cget("text")
    if image_path:
        face_locations = recognize_faces(image_path)
        if face_locations:
            # 获取图片名字作为人脸信息
            image_name = os.path.basename(image_path)
            # 更新识别结果文本
            recognized_label.config(text=f"检测到人脸!!!")

            recognized_label.config(text=f"检测到人脸!!!\n人脸属于:{image_name}")
        else:
            recognized_label.config(text="未检测到人脸")

:定义了一个函数start_recognition,其作用是开始人脸识别过程,并在图形用户界面中显示识别结果。

2.5.运行返回功能
javascript 复制代码
def return_to_rlsb():
    # 获取当前Python解释器的路径
    python_exe = sys.executable
    # 使用subprocess.Popen启动rlsb.py脚本
    subprocess.Popen([python_exe, "C:/Users/HUAWEI/PycharmProjects/pythonProject1/人脸识别/机器学习的人脸识别/rlsb.py"])
    # 销毁当前窗口
    root.destroy()

:创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。

2.6.创建窗口及相应的按钮
javascript 复制代码
# 创建主窗口
root = tk.Tk()
root.title('人脸识别系统')

# 设置窗口大小
root.geometry('700x500')

# 加载背景图
background_image = Image.open('人脸识别background.jpg')
background_image=background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=150, y=10)

start_button=tk.Button(root, text='开始识别', command=start_recognition, width=10, height=1, bg='gray').place(x=500, y=10)

back_button=tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=300, y=400)

# 图像路径标签
image_label_path = tk.Label(root, text="")
image_label_path.pack(side=tk.BOTTOM, anchor=tk.CENTER, pady=10)

# 图像显示标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, anchor=tk.CENTER, padx=10)

# 识别结果标签
recognized_label = tk.Label(root, text="", font=("Helvetica", 16))
recognized_label.pack(side=tk.RIGHT, anchor=tk.CENTER, padx=10)

# 显示窗口
root.mainloop()

:这段代码创建了一个Tkinter主窗口,用于人脸识别系统。它包含一个背景图片、三个按钮、三个标签,以及用于显示图片的标签。
运行结果

3.特征标注

3.1.导入资源包
javascript 复制代码
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import face_recognition
import os
import subprocess
import sys

Image模块用于打开、编辑和保存图像。

ImageTk模块用于将PIL的Image对象转换为Tkinter可以使用的PhotoImage对象。

ImageDraw模块用于在图像上绘制形状和文本。

filedialog模块提供了文件对话框的功能,允许用户选择文件或文件夹。

3.2.识别并绘制五官
javascript 复制代码
# 人脸识别函数
def recognize_faces(image_path):
    # 加载图片
    image = face_recognition.load_image_file(image_path)
    # 识别图片上所有人脸的位置
    face_locations = face_recognition.face_locations(image)
    # 识别图片上所有人脸的五官位置
    face_landmarks_list = face_recognition.face_landmarks(image)

    # 读取图片用于PIL显示
    img = Image.open(image_path)
    # 创建一个可以在PIL中绘制的图像
    draw = ImageDraw.Draw(img)

    # 在每个人脸周围画框并在五官位置画点
    forface_location,face_landmarks in zip(face_locations, face_landmarks_list):
        top, right, bottom, left = face_location
        draw.rectangle(((left, top), (right, bottom)), outline=(255, 0, 0))

        # 在五官位置画点
        for facial_feature in face_landmarks.keys():
            for point in face_landmarks[facial_feature]:
                draw.ellipse((point[0], point[1], point[0]+2, point[1]+2), fill=(0, 255, 0))

    # 如果没有识别到人脸
    if not face_locations:
        # 弹窗提示
        messagebox.showinfo("提示", "未识别到人脸,请更换照片")

    else:
        # 调整图片大小以适应窗口
        img = img.resize((480, 330), Image.LANCZOS)
        # 创建ImageTk对象
        imgTk = ImageTk.PhotoImage(img)
        # 更新图像标签
        image_label.config(image=imgTk)
        image_label.image = imgTk

:函数recognize_faces的作用是加载一个图片,使用face_recognition库来识别图片中的人脸位置和五官位置,并在图片上绘制人脸框和五官点。如果图片中没有人脸,它会弹出一个提示框。
背景颜色

3.3.打开文件夹选择图片
javascript 复制代码
# 选择图片函数
def select_image():
    # 打开文件对话框,让用户选择图像文件
    image_path = filedialog.askopenfilename(initialdir="faceimage")
    if image_path:
        # 确保图像路径正确
        if os.path.isfile(image_path):
            # 显示图片路径
            image_label.config(text=image_path)
            # 使用PIL读取图片
            img = Image.open(image_path)
            # 调整图片大小以适应窗口
            img = img.resize((480, 330), Image.LANCZOS)
            # 创建ImageTk对象
            imgTk = ImageTk.PhotoImage(img)
            # 更新图像标签
            image_label.config(image=imgTk)
            image_label.image = imgTk
        else:
            messagebox.showerror("错误", "无法打开文件。请确认文件路径正确。")

:函数select_image的作用是打开一个文件对话框,让用户选择一个图像文件,并确保图像路径正确。如果用户选择了正确的文件,它会显示图片路径并显示图片。如果文件路径不正确,它会弹出一个错误消息框。

3.4.开始识别并显示识别结果
javascript 复制代码
# 开始识别函数
def start_recognition():
#获取图片路径
    image_path = image_label.cget("text")
#检查是否选择了文件
    if image_path:
调用recognize_faces(image_path)函数以识别人脸五官位置,并在图片上绘制人脸框和五官点
        recognize_faces(image_path)

:函数start_recognition的作用是开始人脸识别过程,并在图形用户界面中显示识别结果。

3.5.返回主界面
javascript 复制代码
def return_to_rlsb():
    # 获取当前Python解释器的路径
    python_exe = sys.executable
    # 使用subprocess.Popen启动rlsb.py脚本
    subprocess.Popen([python_exe, "D:/python lesson/机器学习的人脸识别/rlsb.py"])
    # 销毁当前窗口
    root.destroy()

:这个函数通常用于创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。

3.6.创建窗口和按钮
javascript 复制代码
# 创建主窗口
root = tk.Tk()
root.title('特征标注')

# 设置窗口大小
root.geometry('500x400')

# 加载背景图
background_image = Image.open('特征标注background.png')
background_image = background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=80, y=1)
start_button=tk.Button(root, text='开始识别', command=start_recognition, width=10, height=1, bg='gray').place(x=350, y=1)
back_button = tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=218, y=365)

# 图像路径标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, padx=10, pady=10)

# 显示窗口
root.mainloop()

:这个代码片段创建了一个Tkinter主窗口,用于进行特征标注。它定义了窗口的标题、大小、背景图片、按钮以及图像路径标签。当用户点击按钮时,相应的函数会被调用。
运行结果

4.创建人脸识别系统的主界面

4.1.导入资源包
javascript 复制代码
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import Image, ImageTk
import os

:这个代码片段是Python脚本的导入部分,它导入了多个库和模块,以便在后续的代码中使用它们的功能。

4.2.创建窗口大小
javascript 复制代码
# 创建主窗口
root = tk.Tk()
root.title('人脸识别系统')

:这个代码片段通常用于创建一个Tkinter窗口,并为其设置一个标题和一个初始大小。在后续的代码中,您可以添加更多的组件,如按钮、标签、图像等,来构建图形用户界面。

4.3.创建按钮和加载背景图片
javascript 复制代码
# 创建标题并居中
title_label = tk.Label(root, text='动态人脸识别', font=('Arial', 16))
title_label.pack(pady=10)

# 加载背景图
background_image = Image.open('rlsbbackground.jpg')
background_image = background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)

# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# 构建人脸识别脚本的相对路径
face_recognition_script = os.path.join('机器学习的人脸识别', '静态人脸识别', '人脸识别.py')

button1 = tk.Button(root, text='人脸识别', command=lambda: [subprocess.Popen(["python", "静态人脸识别/人脸提取.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button1.pack(padx=5, pady=1, anchor='center')

button2 = tk.Button(root, text='人脸提取', command=lambda: [subprocess.Popen(["python", "静态人脸识别/人脸提取.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button2.pack(padx=5, pady=1, anchor='center')

button3 = tk.Button(root, text='特征标注', command=lambda: [subprocess.Popen(["python", "静态人脸识别/特征标注.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button3.pack(padx=5, pady=1, anchor='center')

button4 = tk.Button(root, text='摄像头识别', command=lambda: [subprocess.Popen(["python", "动态人脸识别/摄像头人脸识别/aisb3.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button4.pack(padx=5, pady=1, anchor='center')

button5 = tk.Button(root, text='视频流识别', command=lambda: [subprocess.Popen(["python", "动态人脸识别/视频流人脸识别/视频流.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button5.pack(padx=5, pady=1, anchor='center')

button6 = tk.Button(root, text='退出', command=lambda: on_closing(), width=10, height=2)
button6.pack(padx=5, pady=5, anchor='center')

:这个代码片段通常用于创建一个具有标题、背景图片和按钮的Tkinter窗口,用户可以选择执行不同的人脸识别任务,如人脸识别、人脸提取、特征标注等。当用户点击"退出"按钮时,窗口会被关闭。
背景图片

4.4.定义退出程序,可以实现返回功能
javascript 复制代码
# 定义退出程序函数
def on_closing():
    if messagebox.askokcancel("退出", "确定要退出吗?"):
        root.destroy()

# 设置窗口关闭事件
root.protocol("WM_DELETE_WINDOW", on_closing)

# 显示窗口
root.mainloop()

:这个代码片段通常用于创建一个具有退出功能的Tkinter窗口,当用户尝试关闭窗口时,会弹出一个确认对话框,询问是否确定要退出。如果用户确认,窗口将被关闭。
运行结果

相关推荐
BestSongC38 分钟前
基于YOLOv8模型的安全背心目标检测系统(PyTorch+Pyside6+YOLOv8模型)
人工智能·pytorch·深度学习·yolo·目标检测·计算机视觉
Ws_39 分钟前
leetcode LCR 068 搜索插入位置
数据结构·python·算法·leetcode
冻感糕人~41 分钟前
大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
人工智能·程序人生·金融·llm·大语言模型·ai大模型·大模型研究报告
谈谈叭1 小时前
Javascript中的深浅拷贝以及实现方法
开发语言·javascript·ecmascript
lx学习1 小时前
Python学习26天
开发语言·python·学习
qq_273900232 小时前
pytorch register_buffer介绍
人工智能·pytorch·python
大今野2 小时前
python习题练习
开发语言·python
爱编程的鱼2 小时前
javascript用来干嘛的?赋予网站灵魂的语言
开发语言·javascript·ecmascript
q567315233 小时前
用 PHP或Python加密字符串,用iOS解密
java·python·ios·缓存·php·命令模式
捕鲸叉3 小时前
C++设计模式和编程框架两种设计元素的比较与相互关系
开发语言·c++·设计模式