人脸识别系统---多人脸提取

news2024/7/4 4:30:23

一、多人脸提取

1.导包、设置窗口、选择文件夹里图片的函数和单人脸提取一致,此处省略(详情看‘单人脸提取’)

2.对图像进行处理,在窗口画布上显示出来

2.1定义名为tq的函数,在函数内部声明了三个全局变量file_path、face_image_labels和canvas

def tq():
    global file_path, face_image_labels, canvas

2.2如果file_path为真,则执行下面代码

if file_path:

2.3使用load_image_file函数加载file_path指定的图像文件;face_locations检测人脸的位置

 img = face_recognition.load_image_file(file_path)
    face_locations = face_recognition.face_locations(img, model='hog')

2.4遍历face_image_labels列表,然后从窗口移除之前的图像,便于展示新的图像

   for face_image_label in face_image_labels:
        face_image_label.destroy()

2.5设置提取后的人脸宽度为100,两个图像之间隔为10px

   face_width = 100
    spacing = 10

2.6通过上面这些宽度和间隔设置,计算画布的最小宽度

  canvas_width = (face_width + spacing) * len(face_locations) - spacing

2.7将人脸数量*100得到画布的高度

   canvas_height = len(face_locations) * 100

2.8将宽和高配置到画布上

   canvas.config(width=canvas_width, height=canvas_height)

2.9创建一个滚动条,关联到win窗口

 scrollbar = tk.Scrollbar(win, orient="vertical", command=canvas.yview)

2.10滚动条放置在窗口的(730, 100)位置,设置高度为500px

   scrollbar.place(x=730, y=100, height=500)

2.11配置canvas的yscrollcommand属性,使得当画布内容超出显示区域时,可以使用滚动条来滚动显示

canvas.configure(yscrollcommand=scrollbar.set)

2.12初始化一个空列表,用于存储人脸图像的标签

face_image_labels = []

2.13设置图像在画布上的初始位置

x_p = 430
y_p = 90

2.14初始化,用于记录当前行的人脸图像数量

count = 0

2.15遍历列表,列表存储了识别的人脸的位置,enumerate函数会返回每个元素的索引i和值face_location (此处和但人脸提取的【4.5~4.11】部分相似)

  for i, face_location in enumerate(face_locations):
        top, right, bottom, left = face_location
        face_img = img[top:bottom, left:right]

        face_name = f"face_{i}.jpg"

        face_image = Image.fromarray(face_img)
        face_image = face_image.resize((100, 100))
        face_photo = ImageTk.PhotoImage(face_image)

2.16创建标签,使其在画布上显示图像

 face_image_label = tk.Label(canvas, image=face_photo)
    face_image_label.image = face_photo

2.17画布上创建一个窗口,放置人脸图像标签,设置其位置

 canvas.create_window(x_p, y_p, anchor='nw', window=face_image_label)

2.18将新创建的人脸图像添加到列表中,使用append方法

 face_image_labels.append(face_image_label)

2.19计数器的值+1,代表当前行增加了一张图像

count += 1

2.20当一行放两张图像后,则开始下一行,count重置为0

        if count == 2:  # 每放两张图片后增加间距
            x_p = 430  # 重置x_p
            y_p += 130  # 设置第一行和第二行之间的垂直间距为50像素

count = 0

2.21如果一行还未放满两张,则x坐标增加110px放置一行中的第二个图片

 else:
            x_p += 110

2.22调用了canvas的yview_scroll方法来滚动画布;滚动量/120,120是根据鼠标滚轮灵敏度调整的。*-1是为了反转滚动的方向,使得向上滚动时内容向上移动,向下滚动时内容向下移动。

def on_mouse_wheel(event):
    canvas.yview_scroll(-1 * (event.delta // 120), "units")  # 根据鼠标滚轮事件滚动Canvas

2.23鼠标光标在任何窗口上,只要滚动鼠标滚轮,就会调用on_mouse_wheel函数执行滚动

canvas.bind_all("<MouseWheel>", on_mouse_wheel)  # 绑定鼠标滚轮事件

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

[Spring Boot实战] 如何快速地创建spring boot项目

文章目录 一、背景说明二、环境说明三、创建步骤3.1 选择项目JDK版本和Initializer服务地址3.2 设置项目的元数据3.3 引入依赖3.4 选择项目路径 四、额外的工作五、问题5.1 为什么使用Lombok&#xff1f; 一、背景说明 使用spring boot创建JAVA项目&#xff0c;是目前比较主流…

数据结构与算法笔记:基础篇 - 红黑树(下):掌握这些技巧,你也可以实现一个红黑树

概述 红黑树是一个让人又爱又恨的数据结构&#xff0c;“爱” 是因为它稳定、高性能&#xff0c;“恨” 是因为实现起来实在太难了。本章讲红黑树的实现&#xff0c;对于基础不太好的同学&#xff0c;理解起来可能会有些困难。但是&#xff0c;我觉得没有必要去死磕它。 为什…

一个公用的数据状态修改组件

灵感来自于一项重复的工作&#xff0c;下图中&#xff0c;这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是&#xff0c;基于该组件类捕获组件跳转写了这款通用接口。省时省力。 代码如下&#xff1a;…

专业学习|博弈论-课程沿革

学习来源&#xff1a;北京大学刘霖《博弈论》MOOC公开课 备注&#xff1a;仅做学习分享&#xff0c;请勿转载&#xff0c;转载必究&#xff01; &#xff08;一&#xff09;博弈论的预备知识 基本的微积分的知识和概率论的知识。简单的说会求导数&#xff0c;会求简单的积分&am…

文案策划日常大公开:掌握这些技巧,让你工作效率翻倍

本周的工作和生活安排得满满当当&#xff0c;但这些看似繁重的任务&#xff0c;其实都是我利用碎片化时间高效完成的。 这里和大家分享一下&#xff0c;我是如何在这忙碌的一周中&#xff0c;既完成本职工作又享受生活的。 本周工作日常汇总&#xff1a; 1. 品牌小红薯笔记&…

Java高阶数据结构-----并查集(详解)

目录 &#x1f9d0;一.并查集的基本概念&实例&#xff1a; &#x1f92a;二.并查集代码&#xff1a; &#x1f602;三&#xff1a;并查集的一些习题&#xff1a; A.省份数量 B.等式方程的可满足性 &#x1f9d0;一.并查集的基本概念&实例&#xff1a; 并查集概念&…

5.3 数据模型设计总结

概述&#xff1a; 数据模型设计是指根据需求和目标设计出合适的数据模型的过程。数据模型是对现实世界中数据的抽象和表示&#xff0c;它定义了数据的结构、关系和约束。数据模型设计的目标是保证数据的一致性、完整性和可用性&#xff0c;同时满足系统性能和可扩展性的要求。…

Python基础教程(十二):模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【Java】解决Java报错:IOException during File Operations

文章目录 引言一、IOException的定义与概述1. 什么是IOException&#xff1f;2. IOException的常见触发场景3. 示例代码 二、解决方案1. 检查文件是否存在2. 使用try-with-resources语句3. 捕获和处理IOException4. 使用NIO进行文件操作 三、最佳实践1. 检查文件状态2. 使用try…

为什么你应该本地化你的软件

本地化您的软件是一项战略举措&#xff0c;可以显著提高其成功率和影响力。以下是您应该投资于软件本地化的几个令人信服的原因&#xff1a; 扩大您的市场覆盖范围 通过本地化您的软件&#xff0c;您可以开拓新市场并接触到更广泛的受众。许多用户更喜欢甚至需要他们母语的软…

(十二)人工智能应用--深度学习原理与实战--模型编译及训练参数的选择

神经网络模型的编译实际上是为网络指定几个非常重要的运行参数,包括优化器、损失函数(误差函数】和评价指标,这三者也代表着神经网络的核心运行机制----通过损失函数来计算网络误差、通过优化器来调整网络参数以降低误差、通过评价指标来衡量网络的性能。神经网络训练时除了…

【漏洞复现】Rejetto HTTP文件服务器 未授权RCE漏洞(CVE-2024-23692)

0x01 产品简介 Rejetto HTTP File Server(HFS)是一个基于HTTP协议的文件服务器软件&#xff0c;旨在为用户提供简单、轻量级且易于使用的文件共享解决方案。功能强大、易于使用的文件服务器软件&#xff0c;无论是个人使用还是团队协作&#xff0c;HFS都能满足用户的需求&…

平价蓝牙耳机推荐有哪些?四款平价顶尖机型盘点

对于预算有限但又追求高品质音效的朋友们&#xff0c;平价蓝牙耳机成为了一个非常实用的选择&#xff0c;在市面上琳琅满目的蓝牙耳机中&#xff0c;挑选出性价比极高且性能出众的款式并不容易&#xff0c;作为一个多年的蓝牙耳机发烧友&#xff0c;接下来我就将为大家盘点四款…

《精通ChatGPT:从入门到大师的Prompt指南》第7章:创意写作

第7章&#xff1a;创意写作 7.1 角色设定 角色设定是创意写作中最关键的环节之一。成功的角色设定能够让读者对故事产生共鸣&#xff0c;使故事更加生动有趣。角色不仅仅是情节发展的载体&#xff0c;更是读者情感的投射对象。因此&#xff0c;深入了解如何设定一个生动而有深…

如何使用免费的 Instant Data Scraper快速抓取网页数据

Instant Data Scraper 是一款非常简单易用的网页数据爬虫工具&#xff0c;你不需要任何代码知识&#xff0c;只需要点几下鼠标&#xff0c;就可以把你想要的数据下载到表格里面。以下是详细的使用步骤&#xff1a; 第一步&#xff1a;安装 Instant Data Scraper 打开谷歌浏览…

java:一个springfox swagger2的简单例子

# 示例程序 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

【每日刷题】Day61

【每日刷题】Day61 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 671. 二叉树中第二小的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 2331. 计算布尔二叉树的值…

02-DHCP原理与配置

1、DHCP的工作原理 当局域网中有大量的主机时&#xff0c;如果逐个为每一台主机手动设置IP地址、默认网关、DNS服务器地址等网络参数&#xff0c;这显然是一个费力也未必讨好的办法。 而DHCP服务器的应用&#xff0c;正好可以解决这一问题。 1.1 DHCP是什么 DHCP——动态主机…

单片机多个中断源时的设计思路,(51为例)工作寄存器R0-R7

51单片机中四组工作寄存器&#xff08;R0-R7&#xff09; 参考 可以看出每个工作寄存器区有8个字节即为R0-R7&#xff0c;当不指定使用哪个工作寄存器区的时候默认0区。其他工作区作为普通的RAM使用。特殊功能寄存器中有可以位寻址和不能位寻址的区域 下面文字引用 通过修改…

ABB机器人修改IO信号的具体方法介绍

ABB机器人修改IO信号的具体方法介绍 具体步骤可从参考以下内容: 导出IO配置文件 打开【控制面板】-【配置】-【I/O System】-【文件】-【‘EIO’另存为】,就可以保存IO配置文件【EIO.cfg】用RobotStudio软件打开EIO.cfg文件在软件界面,鼠标右击,选择【I/O信号数据编辑器】选…