提取人脸——OpenCV

提取人脸

    • 导入所需的库
    • 创建窗口
    • 显示原始图片
    • 显示检测到的人脸
    • 创建全局变量
    • 定义字体对象
    • 定义一个函数select_image
    • 定义了extract_faces函数
    • 设置按钮
    • 运行GUI主循环
    • 运行显示

导入所需的库

tkinter:用于创建图形用户界面。 filedialog:用于打开文件对话框。
cv2:OpenCV库,用于图像处理和计算机视觉。 PIL(Python Imaging Library)和ImageTk:用于处理和显示图像。 messagebox:用于显示消息框。
subprocess:用于执行系统命令。

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

创建窗口

创建一个Tkinter窗口对象win,并设置窗口的标题和大小。

win = tk.Tk()
win.title("人脸提取")
win.geometry("800x650")

显示原始图片

创建一个标签(Label)对象image_label_original,用于显示原始图片。然后使用pack()方法将标签放置在窗口的左侧,并设置一些填充和边距。

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

显示检测到的人脸

创建另一个标签(Label)对象image_label_detected,用于显示检测到的人脸。同样使用pack()方法将标签放置在窗口的左侧,并设置一些填充和边距。

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

创建全局变量

创建一个全局变量selected_image_path,用于存储选择的图片路径。

selected_image_path = None

定义字体对象

定义一个字体对象my_font,用于按钮和其他文本控件。

my_font = ("Times New Roman", 20)

定义一个函数select_image

定义一个函数select_image,当按钮被点击时,它会打开文件选择对话框,让用户选择图片。然后使用OpenCV加载图片,转换颜色空间,使用PIL调整图片大小,并使用Tkinter显示图片。

def select_image(): - 定义一个函数,当按钮被点击时,会执行这个函数。 global selected_image_path :声明selected_image_path是一个全局变量,这样在函数内部可以修改它的值。
selected_image_path = filedialog.askopenfilename()
打开文件选择对话框,让用户选择一个文件。askopenfilename():函数返回用户选择的文件路径。 img = cv2.imread(selected_image_path) : 使用OpenCV的imread函数从选择的文件路径中读取图片。
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
:将图片从BGR颜色空间转换到RGB颜色空间。 img_pil = Image.fromarray(img_rgb)
:将NumPy数组转换为PIL图像。 img_pil = img_pil.resize((300, 300), Image.Resampling.LANCZOS) : 使用LANCZOS插值方法将图像大小调整为300x300像素。 img_tk = ImageTk.PhotoImage(image=img_pil) :将PIL图像转换为Tkinter可以显示的PhotoImage对象。
image_label_original.config(image=img_tk)
配置标签image_label_original以显示新加载的图片。 image_label_original.image = img_tk : 设置标签的image属性,以便在Tkinter中显示图像。

def select_image():global selected_image_path# 打开文件选择对话框selected_image_path = filedialog.askopenfilename()# 使用OpenCV加载图片img = cv2.imread(selected_image_path)img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img_pil = Image.fromarray(img_rgb)img_pil = img_pil.resize((300, 300), Image.Resampling.LANCZOS)  # 调整图片大小为300x300img_tk = ImageTk.PhotoImage(image=img_pil)# 显示原始图片image_label_original.config(image=img_tk)image_label_original.image = img_tk

定义了extract_faces函数

if selected_image_path: - 检查selected_image_path是否已经被设置,即是否已经选择了图片。
img = cv2.imread(selected_image_path) : 使用OpenCV的imread函数加载选择的图片。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) :将图片从BGR颜色空间转换到灰度颜色空间。
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') :加载预训练的人脸检测Haar级联分类器。
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
:使用加载的分类器在灰度图像中检测多个人脸,并返回它们的坐标和大小。
print(f"Detected faces: {len(faces)}") : 打印检测到的人脸数量。
if len(faces) > 0: 检查是否检测到人脸。
(x, y, w, h) = faces[0] : 获取第一个检测到的人脸的坐标和大小。
face_img = img[y:y+h, x:x+w]
:从原始图片中裁剪出人脸区域。
face_img = cv2.cvtColor(face_img, cv2.COLOR_BGR2RGB)
: 将裁剪的人脸图像从BGR颜色空间转换到RGB颜色空间。
face_img = Image.fromarray(face_img)
将裁剪后的图像从NumPy数组转换为PIL图像。 face_img = face_img.resize((300, 300), Image.Resampling.LANCZOS) : 使用LANCZOS插值方法将图像大小调整为300x300像素。
face_img = ImageTk.PhotoImage(face_img) : 将PIL图像转换为Tkinter可以显示的PhotoImage对象。 image_label_detected.config(image=face_img)
配置标签image_label_detected以显示新的人脸图像。
image_label_detected.image = face_img : 设置标签的image属性,以便在Tkinter中显示图像。 else: - 如果未检测到人脸,执行以下代码。
messagebox.showinfo("信息", "没有检测到人脸") : 显示一个消息框,告知用户没有检测到人脸。 else:
如果selected_image_path未设置,执行以下代码。 messagebox.showwarning("警告", "请先选择一张图片") :显示一个警告消息框,告知用户需要先选择一张图片。

def extract_faces():if selected_image_path:# 使用OpenCV的人脸检测img = cv2.imread(selected_image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)# 打印检测到的人脸数量print(f"Detected faces: {len(faces)}")# 如果检测到人脸,裁剪并显示if len(faces) > 0:(x, y, w, h) = faces[0]  # 获取第一个检测到的人脸print(f"Face coordinates: x={x}, y={y}, w={w}, h={h}")face_img = img[y:y+h, x:x+w]  # 裁剪人脸区域# 转换为PIL图像并调整大小face_img = cv2.cvtColor(face_img, cv2.COLOR_BGR2RGB)face_img = Image.fromarray(face_img)face_img = face_img.resize((300, 300), Image.Resampling.LANCZOS)  # 调整人脸图片大小为300x300face_img = ImageTk.PhotoImage(face_img)image_label_detected.config(image=face_img)image_label_detected.image = face_imgelse:messagebox.showinfo("信息", "没有检测到人脸")else:messagebox.showwarning("警告", "请先选择一张图片")

设置按钮

button_select = tk.Button(win, text="选择图片", font=my_font, command=select_image, fg='black'):
创建一个名为button_select的按钮,显示文本为"选择图片",字体样式为my_font,按钮点击时执行select_image函数,文本颜色为黑色。

button_select.place(x=150, y=12):
将button_select按钮放置在窗口win的特定位置,横坐标为150,纵坐标为12。

button_extract = tk.Button(win, text="提取人脸", font=my_font, command=extract_faces, fg='black'):
创建另一个名为button_extract的按钮,显示文本为"提取人脸",字体样式为my_font,按钮点击时执行extract_faces函数,文本颜色为黑色。

button_extract.place(x=450, y=12):
将button_extract按钮放置在窗口win的特定位置,横坐标为450,纵坐标为12。

创建选择图片和识别人脸的按钮
button_select = tk.Button(win, text="选择图片", font=my_font, command=select_image, fg='black')
button_select.place(x=150, y=12)button_extract = tk.Button(win, text="提取人脸", font=my_font, command=extract_faces, fg='black')
button_extract.place(x=450, y=12)

运行GUI主循环

win.mainloop(): 进入窗口win的主事件循环,使窗口显示并等待用户操作,直到用户关闭窗口。

win.mainloop()

运行显示

在这里插入图片描述
全部代码:

import tkinter as tk
from tkinter import filedialog
import cv2
from PIL import Image, ImageTk
from tkinter import messagebox
import subprocesswin = tk.Tk()
win.title("人脸提取")
win.geometry("800x650")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 = Nonemy_font = ("Times New Roman", 20)def select_image():global selected_image_path# 打开文件选择对话框selected_image_path = filedialog.askopenfilename()# 使用OpenCV加载图片img = cv2.imread(selected_image_path)img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img_pil = Image.fromarray(img_rgb)img_pil = img_pil.resize((300, 300), Image.Resampling.LANCZOS)  # 调整图片大小为300x300img_tk = ImageTk.PhotoImage(image=img_pil)# 显示原始图片image_label_original.config(image=img_tk)image_label_original.image = img_tk# 人脸检测函数
def extract_faces():if selected_image_path:# 使用OpenCV的人脸检测img = cv2.imread(selected_image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)# 打印检测到的人脸数量print(f"Detected faces: {len(faces)}")# 如果检测到人脸,裁剪并显示if len(faces) > 0:(x, y, w, h) = faces[0]  # 获取第一个检测到的人脸print(f"Face coordinates: x={x}, y={y}, w={w}, h={h}")face_img = img[y:y+h, x:x+w]  # 裁剪人脸区域# 转换为PIL图像并调整大小face_img = cv2.cvtColor(face_img, cv2.COLOR_BGR2RGB)face_img = Image.fromarray(face_img)face_img = face_img.resize((300, 300), Image.Resampling.LANCZOS)  # 调整人脸图片大小为300x300face_img = ImageTk.PhotoImage(face_img)image_label_detected.config(image=face_img)image_label_detected.image = face_imgelse:messagebox.showinfo("信息", "没有检测到人脸")else:messagebox.showwarning("警告", "请先选择一张图片")# 创建选择图片和识别人脸的按钮
button_select = tk.Button(win, text="选择图片", font=my_font, command=select_image, fg='black')
button_select.place(x=150, y=12)button_extract = tk.Button(win, text="提取人脸", font=my_font, command=extract_faces, fg='black')
button_extract.place(x=450, y=12)win.mainloop()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表OJ--超详细解析

链表OJ 文章目录 链表OJ1. 反转链表2. 返回K值3. 链表的中间节点4. 回文链表5. 相交链表6. 带环链表6.1 为什么一定会相遇,有没有可能会错过,或者出现永远追不上的情况,请证明6.2 slow一次走一步,fast如果一次走3步,走…

Jmeter如何进行分布式测试

使用Jmeter进行性能测试时,有些同学问我如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,怎么办就需要使用分布式压测 1.分布式原理: 1、Jmeter分布式测试时,选择其中一台作…

Selenium IED-控制已打开的Chrome浏览器

本文已收录于专栏 《自动化测试》 目录 背景介绍优势特点操作步骤总结提升 背景介绍 在我们进行自动化测试的过程中有时候会遇见一个很棘手的问题那就是登录的过程中需要图片验证码,图片验证码设计的初衷其实就是为了防自动化,防止一些人利用自动工具恶意…

缓冲区设置

缓冲区设计 一、简介 在网络通讯中,用户态缓冲区和内核态缓冲区的大小设定对于优化网络性能和确保数据传输可靠性至关重要。下图是网路通讯的内核缓冲区使用情况: 数据的读写都需要进行系统调用,从用户态切换到内核态去接收数据&#xff0…

昂科烧录器支持TI德州仪器的超低功耗微控制器MSP430F2013IRSAR

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中TI德州仪器的超低功耗微控制器MSP430F2013IRSAR已经被昂科的通用烧录平台AP8000所支持。 MSP430F2013IRSAR超低功耗微控制器由多种设备组成,这些设备具有针对各种应…

集体爆雷!突发中科院2区(Top) 被标记!新增10本期刊被“On Hold“

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…

Nginx缓存之web缓存配置

Web 缓存可节约网络带宽,有效提高用户打开网站的速度。由于应用服务器被请求次数的降低,也相对使它的稳定性得到了提升。Web 缓存从数据内容传输的方向分为前向位置缓存和反向位置缓存两类。如下图所示。 前向位置缓存既可以是用户的客户端浏览器&#x…

处理耗时任务

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 处理耗时任务 {public partial class Form1 : Form{public Form1(){InitializeComponent();}bool IsRun false;private string path Directory.GetCurrentDirectory() "\\古诗词.txt";private…

Vite+Vue3安装且自动按需引入Element Plus组件库

一,安装Element Plus npm install element-plus //node环境16二,安装插件 npm install unplugin-auto-import unplugin-vue-components -D三,配置vite.config.ts文件 //按需引入element-plus组件 import AutoImport from unplugin-auto-i…

Oracle基本语法

前言: 1.使用的数据库不同,所使用的语法也略有不同 2.SQL对大小写不敏感,无论大小写,sql自动转换为大写 3.用户名、表名、表空间名、文件路径......等需要用单引号将其包含 4.一般引号里面的内容需要大写 准备工作: &a…

0618_QT4

练习: 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和…

性能工具之 JMeter 常用组件介绍(八)

文章目录 一、Jmeter命令行启动二、Jmeter脚本录制 一、Jmeter命令行启动 Jmeter有两种运行: 一种是采用的界面模式(GUI)启动,会占用不少系统资源;另一种是命令行模式(non-GUI)执行,这样节约资…

《SelectDB 新一代日志存储分析平台解决方案》白皮书重磅发布|立即下载

随着信息技术的飞速进步,企业面临着前所未有的系统复杂性和数据挑战。在此背景下,日志数据成为了企业洞察系统内部状态、监控网络安全以及分析业务动态的宝贵资源,构建高效的日志存储与分析平台至关重要。 作为基于 Apache Doris 打造的现代…

使用 AST语法树分析与修改Javascript 代码

1、AST语法树简介 当编写代码分析工具、代码美化工具、网站逆向分析等场景时,通常需要使用AST语法树技术。 比如项目开发过程中常遇到的场景:某个公共函数名需要更改,但被很多文件多处代码调用,手工修改非常容易漏改、改错等&…

【漏洞复现】致远互联FE协作办公平台 ncsubjass SQL注入

0x01 产品简介 致远互联FE协作办公平台是一款为企业提供全方位协同办公解决方案的产品。它集成了多个功能模块,旨在帮助企业实现高效的团队协作、信息共享和文档管理。 0x02 漏洞概述 致远互联FE协作办公平台 ncsubjass.jsp接口处存在SQL注入漏洞,未经身份验证的…

【Linux】环境设置MySQL表名忽略大小写

目录 说明 一、摘要 二、查看服务器上MySQL情况 方式一:通过Linux方式 方式二:借助可视化工具(Navicat) 三、MySQL设置忽略表名大小写的参数(lower_case_table_names) 四、网上解决方案 方法一&…

day03 子查询分页存储过程

目录 子查询 介绍: 子查询规范 子查询分类 模糊查询 注意事项和技巧 分页查询 作用: LIMIT关键字使用 指定初始位置 不指定初始位置 分页 视图 介绍: 优点 创建视图 嵌套视图 删除视图 修改视图 更新视图 存储过程 介绍…

RT-Thread PIN设备

RT-Thread PIN设备 RT-Thread PIN设备驱动框架RT-Thread PIN设备驱动层次图RT-Thread PIN设备注册RT-Thread PIN设备注册函数 RT-Thread PIN设备操作函数pin_getpin_modepin_writepin_readpin_attach_irqpin_detach_irqpin_irq_enable PIN设备又叫GPIO设备,是MCU输入…

SpringSecurity-入门代码

创建SpringBoot项目 参考文章: 【环境搭建】使用IDEA创建SpringBoot项目详细步骤_idea创建spring boot项目-CSDN博客 编写helloworld代码 RestController public class HelloController {GetMapping("/hello")public String hello(){return "hel…

深入了解SD-WAN:企业广域网的未来

在讨论SD-WAN之前,我们先来了解一下WAN的基本概念。WAN(广域网)是一个连接多个地理位置分散的局域网的通信网络。在企业中,WAN通常连接总部、分支机构、托管设施和云服务等多个网络节点。广域网允许用户共享各种应用和服务&#x…