opencv人脸识别实战3:多线程和GUI界面设计(PyCharm实现)

news2024/11/17 13:24:43

一、多线程设计

1、在一个新线程中调用了 scan_face() 函数来进行人脸识别操作。根据识别结果,更新界面显示结果,最后释放资源。

def f_scan_face_thread():
    var.set('刷脸')
    ans = scan_face()
    if ans == 0:
        print("最终结果:无法识别")
        var.set("最终结果:无法识别")
    else:
        ans_name = "最终结果:" + str(ans) + id_dict[ans]
        print(ans_name)
        var.set(ans_name)

    global system_state_lock
    print("锁被释放0")
    system_state_lock = 0  #释放资源

2、检查当前系统状态,如果可以开始人脸识别,则将 system_state_lock 设置为1,并启动 f_scan_face_thread() 线程进行人脸识别。

def f_scan_face():
    global system_state_lock
    print("\n当前锁的值为:" + str(system_state_lock))
    if system_state_lock == 1:
        print("阻塞,因为正在刷脸")
        return 0
    elif system_state_lock == 2:  # 如果正在录入新面孔就阻塞
        print("\n刷脸被录入面容阻塞\n" "")
        return 0
    system_state_lock = 1
    p = threading.Thread(target=f_scan_face_thread)
    p.setDaemon(True)  
    p.start()

3、在一个新线程中执行录入新人脸的操作。它增加已知人脸数量,采集新的人脸数据,训练模型,然后修改配置文件并释放资源。

def f_rec_face_thread():
    var.set('录入')
    cv2.destroyAllWindows()
    global Total_face_num
    Total_face_num += 1
    Get_new_face()  
    print("采集完毕,开始训练")
    global system_state_lock  
    print("锁被释放0")
    system_state_lock = 0

    Train_new_face()  
    write_config()  

4、检查系统状态并开始人脸录入操作。如果当前没有其他操作在进行中,将 system_state_lock 设为2 ,并开始 f_rec_face_thread() 线程执行录入操作。

def f_rec_face():
    global system_state_lock
    print("当前锁的值为:" + str(system_state_lock))
    if system_state_lock == 2:
        print("阻塞,因为正在录入面容")
        return 0
    else:
        system_state_lock = 2  # 修改system_state_lock
        print("改为2", end="")
        print("当前锁的值为:" + str(system_state_lock))

    p = threading.Thread(target=f_rec_face_thread)
    p.setDaemon(True)  
    p.start()

5、退出程序

def f_exit():  
    exit()

二、GUI界面设计

1、基于 `tkinter` 的图形用户界面 (GUI) 应用程序

创建一个窗口 `window` 并设置了标题和大小。
创建一个标签 `Label`,用于在窗口中显示一些提示信息。
设置了三个按钮 `Button`,分别用于开始人脸识别 (`f_scan_face`)、录入人脸 (`f_rec_face`) 和退出程序 (`f_exit`)。
将按钮放置在窗口的特定位置,并通过 `command` 参数将按钮与对应的功能函数绑定。
创建了一个空白的 `Label` 控件 `panel`,可能会用于显示摄像头捕获的图像。
设置了鼠标光标为箭头样式。

window = tk.Tk()
window.title('你谁?')  
window.geometry('1000x500')  

var = tk.StringVar()
l = tk.Label(window, textvariable=var, bg='green', fg='blue', font=('Arial', 12), width=50, height=4)
l.pack()  
var.set('人脸识别 by yyt')

button_a = tk.Button(window, text='开始刷脸', font=('Arial', 12), width=10, height=2, command=f_scan_face)
button_a.place(x=800, y=120)

button_b = tk.Button(window, text='录入人脸', font=('Arial', 12), width=10, height=2, command=f_rec_face)
button_b.place(x=800, y=220)

button_c = tk.Button(window, text='退出', font=('Arial', 12), width=10, height=2, command=f_exit)
button_c.place(x=800, y=320)

panel = tk.Label(window, width=500, height=350)  
panel.place(x=10, y=100)  
window.config(cursor="arrow")

2、函数首先检查全局变量 `success` 是否为真,即摄像头捕获图像成功。 如果成功,将捕获到的图像 `img` 转换成 RGBA 格式,并创建一个 `ImageTk` 对象 `imgtk` 用于在 `panel` 中显示。更新 `panel` 的图像内容,显示最新捕获到的图像。最后使用 `window.after(1, video_loop)` 实现持续更新,以实现动态展示摄像头内容。

def video_loop():  
    # success, img = camera.read()  
    global success
    global img
    if success:
        cv2.waitKey(1)
        cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)  
        current_image = Image.fromarray(cv2image)  
        imgtk = ImageTk.PhotoImage(image=current_image)
        panel.imgtk = imgtk
        panel.config(image=imgtk)
        window.after(1, video_loop)

最终效果

 参考项目源码:https://gitee.com/Cheney822/face-recognition-cv2

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

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

相关文章

C++ 中的头文件和源文件

#include<>一般用于包含系统头文件&#xff0c;诸如stdlib.h、stdio.h、iostream等&#xff1b; 类库目录下查找失败&#xff0c;编译器会终止查找&#xff0c;直接报错&#xff1a;No such file or directory. #include""一般用于包含自定义头文件&#xff…

NLP 算法实战项目:使用 BERT 进行模型微调,进行文本情感分析

本篇我们使用公开的微博数据集(weibo_senti_100k)进行训练&#xff0c;此数据集已经进行标注&#xff0c;0: 负面情绪&#xff0c;1:正面情绪。数据集共计82718条(包含标题)。如下图&#xff1a; 下面我们使用bert-base-chinese预训练模型进行微调并进行测试。 技术交流&#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件&#xff0c;用于将数据展示为环形图表。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明&#xff1a; 建议使用文本组件构建当前数值文本和辅…

信息系统项目管理师005:工业互联网(1信息化发展—1.2现代化基础设施—1.2.2工业互联网)

文章目录 1.2.2 工业互联网1.内涵和外延2.平台体系3.融合应用 记忆要点总结 1.2.2 工业互联网 工业互联网(Industrial Internet)是新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆…

【EDK II】作为UEFI的实现,EDK II 的架构是什么样的

目录 前言 EDK II 架构 配置文件 结语 前言 基本输入输出系统 (Basic Input Output System, BIOS) 最早由 IBM&#xff08;International Business Machines Corporation) 公司于1981年提出并开发&#xff0c;后来成为个人计算机(PC)的标准固件接口。但受限于传统BIOS (Le…

Git分支管理(IDEA)

文章目录 Git分支管理&#xff08;IDEA&#xff09;1.Git分支管理&#xff08;IDEA&#xff09;1.基本介绍1.分支理解2.示意图 2.搭建分支和合并的环境1.创建Gitee仓库2.创建普通maven项目3.克隆Gitee项目到E:\GiteeRepository4.复制erp文件夹下的内容到IDEA项目下5.IDEA项目中…

Kafka的分区机制

Kafka的分区机制是其核心功能之一&#xff0c;旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理&#xff1a; Kafka分区基本概念 分区&#xff08;Partition&#xff09;&#xff1a;Kafka中的主题&#xff08;Topic&#xff09;可以细分为多个分区…

软件测试APP完整测试作业流程(附流程图),公司级软件测试流程化办公

目录 1. 概述 2. 软件测试流程 3. 软件测试周期人员活动图 4. 总结 1. 概述 1.1 目的 有效的保证软件质量&#xff1b; 有效的制定不同测试类型&#xff08;软件系统测试、音频主观性测试、Field Trial、专项测试、自动化测试、性 能测试、用户体验测试&#xff09;的软件…

【HarmonyOS】ArkUI - 自定义卡片样式

ArkUI - 自定义卡片样式 HarmonyOS API 9 没有提供原生的卡片样式&#xff0c;我定义了一个卡片样式&#xff0c;可以方便大家在日常开发中使用。 效果图&#xff1a; 卡片样式代码如下&#xff1a; Styles function card() {.width(95%).padding(20).backgroundColor(Col…

【CSP】2022-03-2 出行计划 经典差分和前缀和 (包含完整思路、代码和写代码过程中遇到的问题)

2022-03-2 出行计划 差分和前缀和 2022-03-2 出行计划 差分和前缀和思路遇到的问题&#xff08;不小心出现的细节问题&#xff09;完整代码 2022-03-2 出行计划 差分和前缀和 这题很久之前做过一次&#xff0c;现在已经基本忘记了&#xff0c;所以重新做一遍&#xff0c;然后一…

Linux动态追踪——ftrace

目录 摘要 1 初识 1.1 tracefs 1.2 文件描述 2 函数跟踪 2.1 函数的调用栈 2.2 函数调用栈 2.3 函数的子调用 3 事件跟踪 4 简化命令行工具 5 总结 摘要 Linux下有多种动态追踪的机制&#xff0c;常用的有 ftrace、perf、eBPF 等&#xff0c;每种机制适应于不同的场…

银河麒麟V10 安装部署大数据管理软件 DataSophon

一、概览 1、愿景 致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助您快速构建起稳定、高效、可弹性伸缩的大数据云原生平台。 2、DataSophon是什么 《三体》&#xff0c;这部获世界科幻文学最高奖项雨果奖的作品以惊艳的"硬科幻"…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(一)

前言 Jmeter&#xff0c;Postman一些基本大家相比都懂。那么真实在项目中去使用&#xff0c;又是如何使用的呢&#xff1f;本文将一文详解jmeter接口测试 一、接口测试分类 二、目前接口架构设计 三、市面上的接口测试工具 四、Jmeter简介&#xff0c;安装&#xff0c;环境…

【Kafka系列 08】生产者消息分区机制详解

一、前言 我们在使用 Apache Kafka 生产和消费消息的时候&#xff0c;肯定是希望能够将数据均匀地分配到所有服务器上。 比如很多公司使用 Kafka 收集应用服务器的日志数据&#xff0c;这种数据都是很多的&#xff0c;特别是对于那种大批量机器组成的集群环境&#xff0c;每分…

Visio无空白无黑边导出PDF

步骤1 文件->选项->自定义功能区->勾选开发工具 步骤2 开发工具->显示ShapeSheet->页->将Print Properties中的Margin都设置为0 步骤3 设计->大小->适应绘图 步骤4 导出PDF->选项->取消勾选【辅助功能文档结构标记】->发布

BetterDisplay for mac V2.2.5 强大的mac显示器管理开源工具

BetterDisplay是Mac OS 一个很棒的工具&#xff01; 它允许您将显示器转换为完全可扩展的屏幕 管理显示器配置覆盖 允许亮度和颜色控制 提供 XDR/HDR 亮度升级&#xff08;Apple Silicon 和 Intel Mac 上兼容的 XDR 或 HDR 显示器的额外亮度超过 100% - 多种方法可用&#x…

opengl 学习(三)-----纹理

纹理就是贴图 分类前提demo效果解析 分类 前提 需要使用一个库来处理图片&#xff1a;#include <stb_image.h> https://github.com/nothings/stb 你下载好了之后&#xff0c;把目目录包含了就好 然后再引入 #define STB_IMAGE_IMPLEMENTATION #include "stb_i…

鸿蒙开发学习:【ets_frontend组件】

简介 ets_frontend组件是方舟运行时子系统的前端工具&#xff0c;结合ace-ets2bundle组件&#xff0c;支持将ets文件转换为方舟字节码文件。 ets_frontend组件架构图 目录 /arkcompiler/ets_frontend/ ├── test262 # test262测试配置和运行脚本 ├── testTs…

如何轻松打造属于自己的水印相机小程序?

水印相机小程序源码 描述&#xff1a;微信小程序。本文将为您详细介绍小程序水印相机源码的搭建过程&#xff0c;教您如何轻松打造属于自己的水印相机小程序。无论您是初学者还是有一定基础的开发者&#xff0c;都能轻松掌握这个教程。 一&#xff1a;水印相机搭建教程 1 隐…

Node.js:构建高性能网络应用的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…