OpenCv之简单的人脸识别项目(特征标注页面)

人脸识别

  • 准备
  • 八、特征标注页面
    • 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加载dlib的人脸检测器和预测器
      • 5.4读取图片和检测人脸
      • 5.5标注关键点和显示标注后的图像
    • 6.定义关闭窗口的函数
    • 7.按钮设计
      • 7.1选择图片按钮
      • 7.2开始标注按钮
      • 7.3返回按钮
    • 10.定义关键函数
    • 10. 人脸标注运行结果图
    • 11. 人脸标注功能展示图
  • 特征标注页面完整代码

准备

本篇将展示特征标注页面,并与登录页面连接起来。

八、特征标注页面

1.导入所需的包

tkinter:

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

filedialog:

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

PIL (Python Imaging Library):

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

ImageTk:

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

dlib:

dlib是一个C++库,它提供了大量机器学习和计算机视觉功能。dlib模块是dlib库的Python接口,它允许您在Python中使用dlib的功能。在图像处理和机器学习领域,dlib被广泛用于人脸识别、物体检测、图像分割等任务。

cv2 (OpenCV):

OpenCV是一个开源的计算机视觉库,它提供了大量用于图像和视频处理的功能。cv2模块是OpenCV的Python接口,它允许您在Python中使用OpenCV的功能。OpenCV广泛用于图像识别、图像处理、物体检测、视频分析等任务。

subprocess:

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

os:

os模块提供了与操作系统交互的功能。它提供了用于文件和目录操作的函数,如文件读写、目录遍历、文件路径处理等。

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import dlib
import cv2
import subprocess
import os

2.设置窗口

2.1定义窗口外观和大小

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

# 创建Tkinter窗口
win = tk.Tk()
win.title('欢迎')
win.geometry('780x650')

2.2设置窗口背景

2.2.1设置背景图片

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

#背景设计
image = Image.open("8.gif")
image = image.resize((780, 650))  # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
2.2.2创建label控件

Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。

canvas = tk.Label(win, image=photo1)
canvas.pack()

3.定义两个全局变量

定义全局变量时,使用None来初始化它们,这意味着在程序开始时,它们不指向任何具体的图像路径或标签对象。在实际的应用程序中,将会通过用户的操作或程序的逻辑来更新这些变量,以便它们能够存储图像路径和显示图像。

file_path = None
image_label_original = None
image_label_annotated = None

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

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

image_label_annotated:这个变量通常用于在Tkinter应用程序中显示处理后的图片。与 image_label_original 类似,它可能被用来引用一个Label组件,该组件被配置为显示一个图像。

4.定义选择图片的函数

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

定义一个名为 xz 的函数,并在函数内部声明了两个全局变量 file_path 和 image_label_original。这意味着函数内部对这些变量的修改将会影响函数外部的同名变量。

def xz():
    global file_path, image_label_original

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 对象。如果之前已经有一个图像标签,它将销毁这个标签。最后,它创建一个新的图像标签,用于显示调整后的图片。

if file_path:
    image = Image.open(file_path)
    image = image.resize((370, 450))
    photo = ImageTk.PhotoImage(image)

    # 创建一个标签用于显示原始图像
    if image_label_original:
        image_label_original.destroy()  # 销毁之前的图像标签

    image_label_original = tk.Label(win, image=photo)
    image_label_original.image = photo

4.4显示图像

将图像标签放置在主窗口的 (10, 100) 位置。这是图像在窗口中的左上角坐标。

image_label_original.place(x=10, y=100)

5.定义标注函数

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

定义一个名为 bz 的函数,并在函数内部声明了两个全局变量 file_path 和 image_label_annotated。这意味着函数内部对这些变量的修改将会影响函数外部的同名变量。

def bz():
    global file_path, image_label_annotated

5.2条件判断和关键点预测器文件检查

首先检查 file_path 是否有值,如果有,则定义 predictor_path 为 “bz.dat”。然后,它检查这个文件是否存在。如果文件不存在,它会打印一条错误消息并返回。

if file_path:
    # 检查人脸关键点预测器文件是否存在
    predictor_path = "bz.dat"
    if not os.path.exists(predictor_path):
        print(f"文件不存在:{predictor_path}")
        return

5.3加载dlib的人脸检测器和预测器

使用 dlib 库的 get_frontal_face_detector 函数创建了一个人脸检测器,并使用 shape_predictor 函数创建了一个人脸关键点预测器,它使用 predictor_path 指定的文件。

# 加载dlib的人脸检测器和预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)

5.4读取图片和检测人脸

使用 OpenCV 库的 imread 函数读取 file_path 指定的图片文件,并将其转换为灰度图像。然后,它使用人脸检测器在灰度图像中检测人脸。

# 读取图片
img = cv2.imread(file_path)
# 检查图片是否正确加载
if img is None:
    print("无法加载图片,请检查文件路径或文件完整性。")
    return

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = detector(gray)

5.5标注关键点和显示标注后的图像

遍历检测到的人脸,并为每个人脸预测关键点。它使用这些关键点在原始图像上绘制红色圆圈。然后,它将标注了关键点的图像转换为 PIL 格式,并调整其大小。最后,它创建一个新的图像标签来显示标注后的图像,并将其放置在主窗口的 (400, 100) 位置。

for face in faces:
    # 标注关键点
    landmarks = predictor(gray, face)
    for n in range(0, 68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        cv2.circle(img, (x, y), 4, (255, 0, 0), -1)


# 转换为PIL格式并显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
image = Image.fromarray(img)
image = image.resize((370, 450))
photo = ImageTk.PhotoImage(image)

# 创建一个标签用于显示标注后的图像
if image_label_annotated:
    image_label_annotated.destroy()  # 销毁之前的图像标签

image_label_annotated = tk.Label(win, image=photo)
image_label_annotated.image = photo
image_label_annotated.place(x=400, 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=40, y=30)

7.2开始标注按钮

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

image = Image.open("F1.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=tq)
bt2.place(x=285, 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=530, y=30)

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

10.定义关键函数

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
from PIL import Image, ImageTk
import dlib
import cv2
import subprocess
import os

win = tk.Tk()
win.title('欢迎')
win.geometry('780x650')


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



file_path = None
image_label_original = None
image_label_annotated = None

# 用于显示原始图像的标签
def xz():
    global file_path, image_label_original
    file_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)

        # 创建一个标签用于显示原始图像
        if image_label_original:
            image_label_original.destroy()  # 销毁之前的图像标签

        image_label_original = tk.Label(win, image=photo)
        image_label_original.image = photo
        image_label_original.place(x=10, y=100)

# 标注人脸关键点
def bz():
    global file_path, image_label_annotated
    if file_path:
        # 检查人脸关键点预测器文件是否存在
        predictor_path = "bz.dat"
        if not os.path.exists(predictor_path):
            print(f"文件不存在:{predictor_path}")
            return

        # 加载dlib的人脸检测器和预测器
        detector = dlib.get_frontal_face_detector()
        predictor = dlib.shape_predictor(predictor_path)

        # 读取图片
        img = cv2.imread(file_path)

        # 检查图片是否正确加载
        if img is None:
            print("无法加载图片,请检查文件路径或文件完整性。")
            return

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # 检测人脸
        faces = detector(gray)
        for face in faces:
            # 标注关键点
            landmarks = predictor(gray, face)
            for n in range(0, 68):
                x = landmarks.part(n).x
                y = landmarks.part(n).y
                cv2.circle(img, (x, y), 4, (255, 0, 0), -1)

        # 转换为PIL格式并显示
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        image = Image.fromarray(img)
        image = image.resize((370, 450))
        photo = ImageTk.PhotoImage(image)

        # 创建一个标签用于显示标注后的图像
        if image_label_annotated:
            image_label_annotated.destroy()  # 销毁之前的图像标签

        image_label_annotated = tk.Label(win, image=photo)
        image_label_annotated.image = photo
        image_label_annotated.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=40, y=30)

image = Image.open("F1.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=bz)
bt2.place(x=285, 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=530, y=30)

win.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/677330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Window11端口开放防火墙

(1)打开控制面板,进入【控制面板\系统和安全\Windows Defender 防火墙】 (2)点击左侧菜单【高级设置】,进入防火墙设置页面 (3)根据需要选择【入站规则】或者【出站规则】&#xff…

【深度好文】到底什么是质量意识?如何衡量,如何提升?

大家好,我是狂师! 在软件测试中,质量意识是一个核心且至关重要的概念。相信大家,经常会听到:"这个家伙质量意识很强,某某某要提升质量意识“之类的话语。 在企业中,“质量意识”不仅关乎…

NoSQL实战(MongoDB搭建主从复制)

什么是复制集? MongoDB复制是将数据同步到多个服务器的过程; 复制集提供了数据的冗余备份并提高了数据的可用性,通常可以保证数据的安全性; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…

day30--mybatis(三)高级

一.Mybatis注解开发单表操作 1.1 MyBatis的常用注解 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。 Insert&#xff1…

【数据结构】从前序与中序遍历,或中序与后序遍历序列,构造二叉树

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 首先,根据先序遍历可以确定根节点E,再在中序遍历中通过E确定左树和右数 ; 设立inBegin和inEnd,通过这两个参数的游走,来进行子树的创建&a…

springboot配置集成RedisTemplate和Redisson,使用分布式锁案例

文章要点 自定义配置属性类集成配置RedisTemplate集成配置分布式锁Redisson使用分布式锁简单实现超卖方案 1. 项目结构 2. 集成RedisTemplate和Redisson 添加依赖 依赖的版本与继承的spring-boot-starter-parent工程相对应&#xff0c;可写可不写 <!--spring data redis…

SylixOS网卡多 IP 配置

概述 网卡多 IP 是指在同一个网络接口上配置和绑定多个 IP 地址。 引进网卡多 IP 的目的主要有以下几个&#xff1a; 提供服务高可用性。通过在同一接口绑定多个 IP 地址&#xff0c;然后在服务端使用这些 IP 地址启动多个服务实例。这样在任意一 IP 出现问题时&#xff0c;可…

Ollama教程——使用Ollama与LangChain实现Function Calling(函数调用)的详细教程(一)

@[toc](Ollama教程——使用Ollama与LangChain实现Function Calling(函数调用)的详细教程(一)) 在本教程中,我们将介绍如何使用Ollama和LangChain实现函数调用任务。这种方法可以大大提高AI模型在特定任务上的性能。本文将详细解释如何设置、使用OllamaFunctions,并通过多个…

openEuler Embedded 系统 实时性

openEuler Embedded 系统 & 实时性 1 介绍1.1 概述1.2 openEuler 23.09 Embedded1.3 openEuler 重要节点1.4 系统构建工具1.5 openEuler Embedded 诞生的需求背景运动控制系统实时性需求高嵌入式OS主要供应商来自老美&#xff0c;市场碎片化严重 1.6 总体架构1.7 openEuler…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试6月3日预测第10弹

昨天的第二套方案已命中&#xff01;今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;6,4,7,8,2,9,1,0 十位&#xff1a;2,3,4,1,6,7,8,…

000002 - Hadoop环境安装

Hadoop及其大数据生态圈 1. 背景2. 实践2.1 Linux服务器准备2.2 在其中一台服务器上安装JDK2.3 在其中一台服务器上安装HADOOP2.4 本地模式运行一个hadoop案例 3. 自动化部署 1. 背景 要搭建Hadoop集群环境&#xff0c;我们需要执行如下 准备三台Linux服务器&#xff0c;服务…

基于三元组一致性学习的单目内窥镜里程计估计

文章目录 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope摘要方法实验结果 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope 摘要 单目图像中深度和姿态的估计对于计算机辅助导航至关重要。由于很难获…

Rye一个强大的Python包管理工具

这是一个由Flask框架作者用rust开发并维护的一个python包管理工具&#xff0c;经过个人体验和使用还是非常不错的&#xff0c;尽管它还并非正式版本&#xff0c;但其易用性和便捷性均值得我们来体验&#xff01; 其中他对python各版本的管理比其他同类工具要好&#xff0c;安装…

Cognita:一款面向生产环境的开源、模块化 RAG 框架

一、引言&#xff1a;RAG 技术的兴起和挑战 1.1、从关键词搜索到 RAG 在大模型技术火起来之前&#xff0c;我们处理海量数据中的信息检索问题&#xff0c;往往依靠的是传统的关键词搜索和全文检索方法。这些方法虽然在一定程度上帮助我们找到了信息&#xff0c;但它们在语义理…

SpringBoot——全局异常处理

目录 异常 项目总结 新建一个SpringBoot项目 pom.xml Result&#xff08;通用的响应结果类&#xff09; MyBusinessException自定义异常类 GlobalExceptionHandler全局异常处理类 ExceptionController控制器 SpringbootExceptionApplication启动类 参考文章&#xff1a…

【计算机-ARM】

计算机-ARM ■ 指令集■ 1. RISC■ 2. CISC ■ ARM简介■ 1.■ 2. ■ ARM-CPU体系架构■ 1. M0■ 2. M3■ 3. M4■ 4. M7■ 5. M7■ 6. M7 ■ ARM-寄存器■ 1. 通用寄存器■ 2.■ 3.■ 4. ■ ARM-工作模式■ ARM-寄存器组■ ARM-异常向量表■ 由于soc0x00000000 是存放IROM芯片…

基于.NetCore和ABP.VNext的项目实战七:全局异常处理并日志记录

ABP框架已经默认为我们实现了全局的异常模块,这里我们自定义全局异常模块,先在HelloWorldController中写一个异常接口,测试下ABP的默认全局异常: [HttpGet][Route("Exception")]public string Exception(){throw new NotImplementedException("这是一个未实…

常用技巧-PPT时你真的做对了吗?

常用技巧-PPT时你真的做对了吗&#xff1f; PPT时通常会通过多种表现手法将信息转化为图表&#xff0c;更好的凸显自己的专业素养。将数据转化为图表是对的&#xff0c;那么你真的用对了图表了吗&#xff1f; 话不多说&#xff0c;直接上干货&#xff1a; 时间线图 时间线是…

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…

突破性技术: 大语言模型LLM量化激活outliers异常值抑制

LLM过去有两种突破性技术大大提升了量化精度&#xff0c;分别是group-wise量化和GPTQ/AWQ量化。前者相比于过去的per-tensor和per-channel/per-axis量化提出了更细粒度的对channel拆分为更小单元的量化方式&#xff0c;后者通过巧妙的算法明显提升了4bit量化的精度。 LLM量化存…