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

一、多线程设计

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_lockprint("锁被释放0")system_state_lock = 0  #释放资源

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

def f_scan_face():global system_state_lockprint("\n当前锁的值为:" + str(system_state_lock))if system_state_lock == 1:print("阻塞,因为正在刷脸")return 0elif system_state_lock == 2:  # 如果正在录入新面孔就阻塞print("\n刷脸被录入面容阻塞\n" "")return 0system_state_lock = 1p = 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_numTotal_face_num += 1Get_new_face()  print("采集完毕,开始训练")global system_state_lock  print("锁被释放0")system_state_lock = 0Train_new_face()  write_config()  

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

def f_rec_face():global system_state_lockprint("当前锁的值为:" + str(system_state_lock))if system_state_lock == 2:print("阻塞,因为正在录入面容")return 0else:system_state_lock = 2  # 修改system_state_lockprint("改为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 successglobal imgif success:cv2.waitKey(1)cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)  current_image = Image.fromarray(cv2image)  imgtk = ImageTk.PhotoImage(image=current_image)panel.imgtk = imgtkpanel.config(image=imgtk)window.after(1, video_loop)

最终效果

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

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

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

相关文章

OJ_最长公共子串

题干 C实现 #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std;short dp[10002][10002];//100*m*2 int main() {char s1[10001];char s2[10001];scanf("%s%s",s1,s2);int n strlen(s…

商品智能化 如何节约真金白银?

在竞争激烈的零售市场中&#xff0c;各行各业都出现了很多新势力&#xff0c;可是能站稳脚步的又有几个&#xff1f;有的店每个月营业额几十万&#xff0c;到手还没打工赚的多。人力成本和运营成本不知不觉成了老板最头疼的问题&#xff0c;提高效率、降低成本一直是企业追求的…

搞c++ 业务开发的一个梗,软件成品不是一人,是多人努力结果!

今日开发中,突然遇到 整个黑屏,原本以为是 自己qt5.15 升级qt6.5 cmake 配置(有点小复杂)有问题,业务代码没什么事情,就找不到问题,因为debug中,没有任何报错。 结果 此软件0到1 我只是参与部分,另外一部分是 其他同事开发的。 有一个动画窗口,以及 主程序窗口。 结果 …

Android Studio实现内容丰富的安卓宠物医院管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

python 基础知识点(蓝桥杯python科目个人复习计划64)

今日复习内容&#xff1a;做题 例题1&#xff1a;蓝桥课程抢购 问题描述&#xff1a; 为了能让更多的同学学到IT技术&#xff0c;蓝桥云课又开始了课程限时打折活动。 作为初学者的你&#xff0c;希望尽可能买到含金量总额更高的课程&#xff0c;当然其他同学也是这么想。 …

ICV报告:《2023年全球未来产业指数报告》

随着科学技术的飞速发展&#xff0c;世界正在进入一个充满无限潜力的新时代&#xff0c;未来产业将逐渐成为各国竞争的焦点。 为了全面评估20多个国家和地区未来产业布局、发展、创新投资的能力&#xff0c;在世界知识产权组织(WIPO)、经济合作与发展组织(OECD)国际可再生能源…

vivado Placement、时钟和I/O放置、全局布局、详细布局和布局后优化

安置 Vivado Design Suite放置程序将网表中的单元放置到目标AMD中的特定站点上装置与其他实现命令一样&#xff0c;Vivado放置程序工作于并更新&#xff0c;内存中的设计。 设计布局优化 Vivado砂矿器同时优化了以下方面的设计布局&#xff1a; •定时松弛&#xff1a;选择…

扩展资料主机名到IP地址的有两种方式:DNS

中国联通的DNS地址有两种。 主 DNS 为“210.21.4.130”&#xff0c;备用 DNS 为“221.5.88.88”。 每个 IP 地址可以有一个主机名。 主机名由一串或多串字符组成。 用小数点分隔字符串。 对于中国联通宽带用户&#xff0c;主DNS设置为&#xff1a;210.21.4.130&#xff0c;备用…

【CTF笔记】 CTF web方向笔记分享 免费 附预览图

个人不怎么记东西&#xff0c;笔记不多&#xff0c;师傅们凑合看… 百度网盘&#xff1a;https://pan.baidu.com/s/1PspihUX28Y_AOQZPurHqKA 麻烦各位师傅帮忙填写一下问卷&#xff0c;提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 &#xff08;…

C++面试题和笔试题(四)

一、intx[6][4],(*p)[4];px;则*(p2)指向哪里&#xff1f; A X[0][1]B X[0][2]C X[1][0]D X[2][0] 官方解释&#xff1a; D int x[6][4], (*p)[4]; p x; 在这里&#xff0c;x 是一个二维数组&#xff0c;它有6行和4列。p 是一个指向具有4个整数的数组的指针。 当你执行…

鸿蒙Next学习-Flex布局

Entry Component struct FlexCase {build() {//需要在构造参数上传Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.Center }) {//flex布局Row().width(100).height(100).backgroundColor(Color.Red)Row().width(100).height(100).backgroundColor(Color.Yellow…

【DL经典回顾】激活函数大汇总(十三)(Sinc SwiGLU附代码和详细公式)

激活函数大汇总&#xff08;十三&#xff09;&#xff08;Sinc & SwiGLU附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可…