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


    人脸识别系统

    一. 静态人脸识别

    1. 人脸提取

    1.1. 导入资源包
    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. 图像识别
    #定义一个人脸识别的函数
    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.创建返回功能
    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.创建人脸提取界面窗口
    # 创建主窗口
    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.创建按钮
    # 创建按钮并添加到窗口中
    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.显示窗口
    # 显示窗口
    root.mainloop()
    

    运行结果
    在这里插入图片描述

    2.人脸识别

    2.1.导入资源包
    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.识别图片中人脸的位置
    # 人脸识别函数
    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.允许用户上传图片,然后显示选中的图像
    # 选择图片函数
    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.开始识别过程并显示识别结果
    # 开始识别函数
    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.运行返回功能
    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.创建窗口及相应的按钮
    # 创建主窗口
    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.导入资源包
    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.识别并绘制五官
    # 人脸识别函数
    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.打开文件夹选择图片
    # 选择图片函数
    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.开始识别并显示识别结果
    # 开始识别函数
    def start_recognition():
    #获取图片路径
        image_path = image_label.cget("text")
    #检查是否选择了文件
        if image_path:
    调用recognize_faces(image_path)函数以识别人脸五官位置,并在图片上绘制人脸框和五官点
            recognize_faces(image_path)
    

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

    3.5.返回主界面
    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.创建窗口和按钮
    # 创建主窗口
    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.导入资源包
    import tkinter as tk
    from tkinter import messagebox
    import subprocess
    from PIL import Image, ImageTk
    import os
    

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

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

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

    4.3.创建按钮和加载背景图片
    # 创建标题并居中
    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.定义退出程序,可以实现返回功能
    # 定义退出程序函数
    def on_closing():
        if messagebox.askokcancel("退出", "确定要退出吗?"):
            root.destroy()
    
    # 设置窗口关闭事件
    root.protocol("WM_DELETE_WINDOW", on_closing)
    
    # 显示窗口
    root.mainloop()
    

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

  • 相关阅读:
    利用pandoc实现latex文件转word文件 公式全部转换
    org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
    【excel密码】excel文件加密的三种方式
    移动端ViT新利器!苹果提出稀疏专家混合模型Mobile V-MoEs
    python requests爬虫 POST无参请求一直在请求中,没有响应的原因
    springboot整合redis+lua实现getdel操作保证原子性
    Samb共享用户的设置和修改Linux用户的id号,修改Linux组的id号,加入组,删除组成员等
    “蔚来杯“2022牛客暑期多校训练营9 补题题解(A)
    LEEDCODE 283移动零
    RK3399平台开发系列讲解(FLASH篇)内核MTD层数据结构体
  • 原文地址:https://blog.csdn.net/2401_83576060/article/details/139402847