人脸识别——OpenCV

人脸识别

    • 创建窗口
    • 创建按钮
    • 设置字体
    • 定义标签用于显示图片
    • 选择并显示图片
    • 检测图片中的人脸
    • 退出程序
    • 返回主界面

创建窗口

导入tkinter库,创建窗口,设置窗口标题和窗口大小。

import tkinter as tk

win = tk.Tk()
win.title("人脸识别")
win.geometry("1000x800")

win.mainloop()

创建按钮

创建选择图片和识别人脸,退出系统,返回系统的按钮

button_select = tk.Button(win, text="选择图片",fg='red')
button_select.place(x=333,y=12)

button_detect = tk.Button(win, text="识别人脸", fg='red')
button_detect.place(x=666,y=12)

esc = tk.Button(win,text='退出系统',fg='red')
esc.place(x=10,y=10)

t = tk.Button(win,text='返回系统',fg='red')
t.place(x=900,y=10)

设置字体

“Times New Roman”:这是字体名称。20:这是字体大小。

my_font = ("Times New Roman", 20)

并添加在按钮中
在这里插入图片描述
代码位置:
在这里插入图片描述

定义标签用于显示图片

两个标签控件用于显示图片,并将它们放置在窗口中。image_label_originalimage_label_detected,分别用于显示原始图像和检测到人脸的图像。将这两个标签放置在窗口的左侧,并设置内边距。

image_label_original = tk.Label(win)
image_label_original.pack(side=tk.LEFT, padx=10, pady=80)

image_label_detected = tk.Label(win)
image_label_detected.pack(side=tk.LEFT, padx=10, pady=80)

代码位置:
在这里插入图片描述
在这里插入图片描述

选择并显示图片

定义全局变量用于存储用户选择的图片路径

selected_image_path = None

导入所需要的包
filedialog: 这是tkinter的一个扩展模块,它提供了一个对话框,允许用户选择文件或目录。在您的程序中,它用于打开一个文件选择对话框,让用户可以选择一张图片。
cv2: 这是OpenCV库的Python接口。OpenCV是一个强大的计算机视觉库,支持各种图像和视频处理功能。在您的程序中,它用于加载和处理图像,以及进行人脸检测。
PIL.ImagePIL.ImageTk: 这些是Python Imaging Library (PIL)的一部分,现在被称为Pillow。PIL是一个用于处理图像的库,而PIL.ImageTk是一个将PIL图像转换为tkinter兼容的PhotoImage对象的模块。在您的程序中,它们用于将OpenCV的图像转换为可以在tkinter中显示的格式。

from tkinter import filedialog
import cv2
from PIL import Image, ImageTk

定义一个函数来打开文件选择对话框,加载用户选择的图片,并将其显示在标签上。

def select_image():
    global selected_image_path

# filedialog.askopenfilename() 打开一个文件选择对话框,允许用户选择一个图片文件。
    selected_image_path = filedialog.askopenfilename()

        # 使用OpenCV的 imread 函数加载用户选择的图片。
    img = cv2.imread(selected_image_path)

         #将OpenCV加载的BGR格式图片转换为RGB格式,因为PIL和Tkinter只支持RGB格式。
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    #使用PIL的 fromarray 函数将RGB格式的图片转换为PIL图像
    img_pil = Image.fromarray(img_rgb)

        #使用Tkinter的 PhotoImage 函数将PIL图像转换为Tkinter可以识别的格式。
    img_tk = ImageTk.PhotoImage(image=img_pil)

    # 显示原始图片
    # config 方法用于修改控件的配置
    image_label_original.config(image=img_tk)
    #将Tkinter的 PhotoImage 对象绑定到标签上。
    image_label_original.image = img_tk

在选择图片的按钮上调用此函数
在这里插入图片描述
代码位置:在这里插入图片描述
在这里插入图片描述

检测图片中的人脸

导入所需要的库:
messagebox: 这是tkinter的一个模块,用于显示消息框。消息框可以用于显示信息、警告或错误提示。在您的程序中,它用于在未检测到人脸时显示提示信息。

from tkinter import messagebox

定义一个函数来检测图片中的人脸,如果检测到人脸,就在人脸周围画矩形框,并显示检测结果。

def detect_faces():
    global selected_image_path
#检查是否已经被赋值。如果已经选择了图片,这个变量将包含图片的路径。
    if selected_image_path:

        # 使用OpenCV的imread函数加载用户选择的图片
        img = cv2.imread(selected_image_path)
#cvtColor函数将加载的图片从BGR颜色空间转换为灰度颜色空间
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#haarcascade_frontalface_default.xml是OpenCV提供的一个预训练的人脸检测模型,用于检测图像中的人脸。
        face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

#人脸检测模型在灰度图像上检测人脸。detectMultiScale函数返回一个包含检测到的脸部位置的矩形列表。
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)

        # 判断是否检测到人脸
        if len(faces) > 0:
            # 在人脸周围画矩形框
            for (x, y, w, h) in faces:

#原始图像上画一个矩形框,表示检测到的人脸位置。矩形的坐标是(x, y),宽度和高度分别是w和h,矩形的颜色是蓝色(RGB值255, 0, 0),线宽为2。
                cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

            # 转换为PIL格式并显示
#检测到人脸后的图像从BGR颜色空间转换为RGB颜色空间。因为Tkinter和PIL库不支持BGR颜色空间。
            img_rgb_detected = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#将转换后的图像从NumPy数组转换为PIL图像对象。
            img_pil_detected = Image.fromarray(img_rgb_detected)
#将PIL图像对象转换为Tkinter可以显示的格式。
            img_tk_detected = ImageTk.PhotoImage(image=img_pil_detected)
#显示转换后的图像。
            image_label_detected.config(image=img_tk_detected)
#将Tkinter的PhotoImage对象绑定到标签上,以保持图片的引用。这样,即使图片被更新,标签仍然会显示最新的图片。
            image_label_detected.image = img_tk_detected  # keep a reference
        else:
            # 提示未检测到人脸
            messagebox.showinfo("提示", "未检测到人脸")
    else:
        messagebox.showinfo("提示", "请先选择一张图片")

在识别人脸的按钮上调用此函数
在这里插入图片描述
在这里插入图片描述

退出程序

def Esc():
    win.destroy()

在退出系统的按钮上调用此函数
在这里插入图片描述
代码位置:在这里插入图片描述

返回主界面

导入所需要的库:
subprocess: 这个模块允许你创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回值。在您的程序中,它用于启动一个新的Python进程来运行另一个脚本main.py。

import subprocess

def one():
    subprocess.Popen(["python", "main.py"])
    win.destroy()

在返回系统的按钮上调用此函数
在这里插入图片描述
代码位置:
在这里插入图片描述

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

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

相关文章

大模型时代的具身智能系列专题(十)

Sergey Levine团队 Sergey Levine目前是UC Berkeley电气工程与计算机科学系的副教授,同时是RAIL(Robotic AI&Learning LabBAIR)实验室主任。除了在Berkeley的教职,Levine也是Google Brain的研究员,他也参与了Google知名的机器人大模型PA…

VMD-PSO-LSTM单维时序预测模型(单输入单输出)-附代码

VMD-PSO-LSTM单维时序预测模型(单输入单输出) 1)首先对原始单维数据进行VMD分解,分解为K个模态分量和1个残差分量 2)将各个模态分量输入模型,建立模型进行预测 3)将各个预测结果相加得到最终…

MCU 的最佳存储方案 CS 创世 SD NAND

MCU 的最佳存储方案 CS 创世 SD NAND 【SD NAND】大家都知道 MCU 是一种 “麻雀” 虽小,却 “五脏俱全” 的主控。 大家都知道 MCU 是一种 “麻雀” 虽小,却 “五脏俱全” 的主控。它的应用领域非常广泛,小到手机手表,大到航空航…

【堡垒机小知识】堡垒机审计日志的定义以及作用概述

随着数字化进程的加速,企业对于IT信息系统的依赖程度不断加深,而保障IT系统的网络安全至关重要,因此不少企业纷纷购买了堡垒机。今天我们就来简单概述一下堡垒机审计日志的定义以及作用。 堡垒机审计日志定义 堡垒机审计日志是记录堡垒机上所…

xml 取值错误 #{} boolean 一直为 false

取值时 #{param.msgStatus} 一直是false&#xff0c;java代码里面显示true。 <select id"findPageOaReading" resultType"com.focusin.data.office.func.dto.ProcessMessageInfoDTO">select i.*, t.template_name procdefNamefrom process_message_…

VBA excel 表格将多行拆分成多个表格或 文件 或者合并 多个表格

excel 表格 拆分 合并 拆分工作表按行拆分为工作表工作表按行拆分为工作薄 合并操作步骤 拆分 为了将Excel中的数万行数据拆分成多个个每个固定行数的独立工作表&#xff0c;并且保留每个工作表的表头&#xff0c;你可以使用以下VBA脚本。这个脚本会复制表头到每个新的工作表&…

练习实践-linux启动耗时分析

练习实践-启动耗时整体概览&#xff0c;具体服务的启动细节 参考来源&#xff1a; B站up主林哥讲运维&#xff1a;一分钟学会&#xff1a;可视化查看系统启动时的性能 如何使用Linux命令查看系统的启动进程&#xff08;linux查看启动进程&#xff09; 解决ubuntu开机变慢&…

BitMart 宣布将销毁 264万枚 BMX,为何平台币掀起销毁热潮?

根据 BitMart 2024年4月18日发布的官方公告&#xff0c;BitMart 将于 5 个工作日内销毁 2,637,063 枚 BMX&#xff0c;价值约 94.9 万美元。根据 BitMart 白皮书中关于「回购机制」的规定&#xff0c;BitMart 2024 年第一季度平台手续费收入的 20% 将用于 BMX 的月度回购和销毁…

碳化硅MOSFET短路保护方法

碳化硅MOSFET短路保护方法 1.概述2.IGBT和碳化硅MOSFET器件特性3.短路保护方法比较4.总结 1.概述 碳化硅 (SiC) MOSFET 已成为硅 (Si) IGBT 的潜在替代产品&#xff0c;适用于光伏逆变器、车载和非车载电池充电器、牵引逆变器等各种应用。与 Si IGBT 相比&#xff0c;SiC MOSFE…

C语言基础:字符串函数使用和剖析(2)

strcmp&#xff08;字符串比较,比较两个字符串是否相等&#xff09; int strcmp ( const char * str1, const char * str2 ); int main() {const char* p1 "abcdef";const char* p2 "sqwer";if ("abcdef" "sqwer")//千万不能这么比…

nginx中配置ssl证书(宝塔面板)

首先申请一个SSL证书&#xff0c;这里我申请的joyssl的免费证书。提交订单申请后&#xff0c;按照页面提示在域名解析中将CNAME和记录值配置好。 比如我用的阿里云&#xff0c; 这是好后&#xff0c;需要等几分钟&#xff0c;然后域名检验成功。 然后点击joyssl的左侧菜单的“证…

grep、sed、awk

grep&#xff1a;文本过滤工具 sed: 文本编辑工具 awk: 格式化文本 grep -n 显示行号 -i 忽略大小写 -v 取反 -o 只保留关键消息 # 找出文件的空行 grep ^$ test.txt -n # 找出文件非空行内容 grep ^$ test.txt -n -v # 找出文件非空行内容&#xff0c;并且排除注释&#xff…

大创报名步骤

目录 一、注册 二、创建项目 三、报名 一、注册 进入注册/登录 点击 点击 填写个人信息 二、创建项目 找到解压的文件 随便选一个 项目简介在你选择的文件中截取一段 询问自己寝室的人 被邀请者需要在微信公众号上搜索 “全国大学生创业服务网” 选择我的消息中同意 三、报名…

Facebook商城号怎么做?思路与操作分析

2016 年&#xff0c;Facebook打造了同名平台 Facebook Marketplace。通过利用 Facebook 现有的庞大客户群&#xff0c;该平台取得了立竿见影的成功&#xff0c;每月访问量将超过 10 亿。对于个人卖家和小企业来说&#xff0c;Facebook Marketplace是一个不错的销货渠道&#xf…

金士顿U盘被写保护的解决方法

1.适用的U盘芯片信息 USB设备ID: VID 0951 PID 1666 设备供应商: Kingston 设备名称: DataTraveler 3.0 设备修订版: 0110 产品制造商: Kingston 产品型号: DataTraveler 3.0 产品修订版: PMAP 主控厂商: Phison(群联) 主控型号: PS2251-07(PS2307) - F/W 08.03.50 [2018-…

使用python绘制日历热力图

使用python绘制日历热力图 日历热力图效果代码 日历热力图 日历热力图&#xff08;Calendar Heatmap&#xff09;是一种数据可视化图表&#xff0c;用于展示时间数据的分布和趋势。它将数据按天映射到一个日历中&#xff0c;通过颜色的变化表示每天的数据值大小。这种图表常用…

nginx平滑升级

#平滑升级 kill -USR2 <PID号> //查看nginx版本 [rootl1 logs]# nginx -v //查看nginx版本 nginx version: nginx/1.26.0 [rootl1 logs]# 安装一个1.25版本实验一下 [rootl2 ~]# cd /opt/ [rootl2 opt]# [rootl2 opt]# lsnginx-1.25.5.tar.gz nginx-1.26.0.tar.…

J-Lin烧录

1、J-linK介绍 J-Link是由德国SEGGER公司推出的&#xff0c;主要用于支持仿真ARM内核芯片的JTAG仿真器。它支持JTAG和SWD两种模式&#xff0c;可以配合多种集成开发环境&#xff08;如IAR EWAR, ADS, KEIL, WINARM, RealView等&#xff09;使用&#xff0c;支持ARM7/ARM9/ARM…

【Python编程】【Jupyter Notebook】启动时报错:no available port could be found

一、报错描述 在Jupyter Notebook中编写程序&#xff0c;无法运行&#xff0c;提示由于没有可供监听的端口&#xff0c;无法启动Jupyter服务器&#xff0c;如下图所示&#xff1a; 二、原因分析 通过报错信息&#xff0c;猜测大概是由于网络环境的原因。首先&#xff0c;关闭…

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

一、704. 二分查找 题目链接&#xff1a;https://leetcode.cn/problems/binary-search/description/ 文章讲解&#xff1a;https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1fA4y1o715 1.…