简单的人脸识别签到程序 python笔记

简单的人脸识别签到程序

这是我自己根据之前的文章《简单的签到程序》修改出来签到程序,还在学习之中,代码还有很多可以优化的地方。

UI代码

有不少地方可以优化一下,但是不想改了。

import PySimpleGUI as sg
from MYSQL1 import *
import cv2
import face_recognition
import os
import numpy as np#文件路径
file_path = "D:\work\python\open\lian"def UI():c = cv2.VideoCapture(0, cv2.CAP_DSHOW)# 打开摄像头if c.isOpened() == False:print("没有开启摄像头")return# 创建一个简单的窗口,包含一个标签和一个输入框Layout = [[sg.Text("编号: ", size=(10, 1)), sg.InputText(key='id')],[sg.Text("姓名: ", size=(10, 1)), sg.InputText(key='name')],[sg.Text(key='msg')],[sg.Button("采集"), sg.Button('签到'),sg.Button('查询'), sg.Button("关闭")],[sg.Image(key="video", size=(640, 380))]]window = sg.Window("人脸识别", Layout, finalize=True)while True:event, values = window.read(timeout=100)  # 读取窗口事件和输入值ret,frame = c.read()id = values["id"]name = values["name"]if ret == True:imgType = cv2.imencode('.png', frame)[1].tobytes()# print(imgType)window['video'].update(data=imgType)if event == "采集":if id and name:window["msg"].update(f"编号: {id}, 姓名: {name}")  # 更新消息框内容face_list = face_recognition.face_locations(frame)if num_to_all(id) is None:iss = 0if len(face_list) > 0:print("视频检测到人脸")# 遍历目录path = os.listdir(file_path)# print(path)for i in path:# 获取人脸特征img = cv2.imread(f"{file_path}\\{i}")encodings = face_recognition.face_encodings(img)if len(encodings) == 0:continueelse:blurred_image = cv2.medianBlur(frame, 5)en1 = face_recognition.face_encodings(img)[0]en2 = face_recognition.face_encodings(blurred_image)[0]iss = np.linalg.norm(en1 - en2)# print(iss)if iss < 0.5:print("与图像", i, "的欧几里得距离为", round(iss, 2), "是同一个人")print("库中已有此人,请不要重复采集")breakelse:print("未检测到人脸,请重新采集")sg.popup("未检测到人脸,请重新采集")if iss >= 0.5:iss = cv2.imwrite(f"../lian/{id}.jpg", frame)if iss:# 添加到数据库connect_mysql(name, id)print("人脸采集成功")sg.popup("人脸采集成功")else:print("人脸采集失败,请重新采集")sg.popup("人脸采集失败,请重新采集")else:sg.popup("请更换编号重试,编号已存在")print("请更换编号重试,编号已存在")else:sg.popup("请输入正确的编号和姓名")print("请输入正确的编号和姓名")if event == "签到":face_list = face_recognition.face_locations(frame)if len(face_list) > 0:print("视频检测到人脸")# 遍历目录path = os.listdir(file_path)# print(path)for i in path:# 获取人脸特征img = cv2.imread(f"{file_path}\\{i}")encodings = face_recognition.face_encodings(img)if len(encodings) == 0:continueelse:blurred_image = cv2.medianBlur(frame, 5)en1 = face_recognition.face_encodings(img)[0]en2 = face_recognition.face_encodings(blurred_image)[0]iss = np.linalg.norm(en1 - en2)# print(iss)if iss < 0.5:print("与图像", i,"的欧几里得距离为",round(iss, 2), "是同一个人")print(num_to_name(i),"签到成功")sg.popup(num_to_name(i),"签到成功")update_status(None,num_to_name(i))breakelse:print("与图像", i,"相似度为:",round(iss, 2), "不是同一个人")if i == path[-1]:print("未找到匹配的人脸")sg.popup("未找到匹配的人脸")else:print("视频未检测到人脸")sg.popup("视频未检测到人脸")if event == "查询":if id:if num_to_name(id) == name:print(num_to_name(id))print(query_status(id))if query_status(id) == 1:print("已签到")sg.popup("已签到")else:print("未签到")sg.popup("未签到")else:print("未找到该用户")sg.popup("未找到该用户")else:print(query_status())sg.popup(query_status(),title="未签到成员表")if event == "关闭" or event == sg.WIN_CLOSED:print("退出")# sg.popup_timed("退出")  # 弹出提示信息breakc.release()window.close()if __name__ == '__main__':UI()

数据库

增加了签到状态栏。

CREATE TABLE tu (user_id INT AUTO_INCREMENT PRIMARY KEY,user_name VARCHAR(255) NOT NULL,user_num INT NOT NULL,SignInStatus INT NOT NULL
);

数据库操作

去掉了UI中没用到的删除(其实是不想写删除了),增加了查询、状态修改。

import pymysql# 数据库配置
db_config = {'host': 'localhost','user': 'root','password': '123456','port': 3306,'database': "name",'charset': 'utf8'
}# 增
def connect_mysql(name, num):con = pymysql.connect(**db_config)cur = con.cursor()sql = "insert into tu (user_name,user_num) values(%s,%s)"cur.execute(sql, (name, num))con.commit()if cur.rowcount > 0:print("数据库添加成功")else:print("数据库添加失败")cur.close()con.close()# 查
def num_to_name(user_num):con = pymysql.connect(**db_config)cur = con.cursor()sql = "SELECT user_name FROM tu WHERE user_num = %s"cur.execute(sql, (user_num,))result = cur.fetchone()cur.close()con.close()return result[0] if result else Nonedef num_to_all(user_num):con = pymysql.connect(**db_config)cur = con.cursor()sql = "SELECT * FROM tu WHERE user_num = %s"cur.execute(sql, (user_num,))result = cur.fetchone()cur.close()con.close()return result if result else None# 更新签到状态
def update_status(user_num=None, user_name=None):if not user_num and not user_name:print("错误:请提供user_num或user_name。")returncon = pymysql.connect(**db_config)cur = con.cursor()try:sql_update = "UPDATE tu SET SignInStatus = 1 WHERE "conditions = []parameters = []if user_num:conditions.append("user_num = %s")parameters.append(user_num)if user_name:conditions.append("user_name = %s")parameters.append(user_name)sql_update += " AND ".join(conditions)cur.execute(sql_update, parameters)con.commit()if cur.rowcount > 0:print(f"更新了{cur.rowcount}条记录的SignInStatus为1。")else:print("没有找到需要更新的记录。")except pymysql.MySQLError as e:print(f"错误:{e}")con.rollback()finally:cur.close()con.close()def query_status(user_num=None):con = pymysql.connect(**db_config)try:with con.cursor() as cursor:if user_num is not None:sql = "SELECT SignInStatus FROM tu WHERE user_num = %s"cursor.execute(sql, (user_num,))result = cursor.fetchone()if result:return result[0]else:returnelse:sql = "SELECT user_num, user_name FROM tu WHERE SignInStatus IS NULL"cursor.execute(sql)results = cursor.fetchall()if results:return [f"编号: {row[0]}, 姓名: {row[1]}" for row in results]else:return "全员已打卡"finally:con.close()if __name__ == '__main__':print(1)

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

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

相关文章

单词反转和数组去重,附经典面试题一份

博彦科技笔试&#xff1a; 给定字符&#xff0c;拼接成单词进行反转单词&#xff1b; package org.example;public class Main {public static void main(String[] args) {char[] input {h, e, l, l, o, , w, o, r, l, d, , J, a, v, a};String inputToString new String(…

【51单片机】UART串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

构建智能防线 灵途科技光电感知助力轨交全向安全防护

10月27日&#xff0c;在南京南站至紫金山东站间的高铁联络线上&#xff0c;一头野猪侵入轨道&#xff0c;与D5515次列车相撞&#xff0c;导致设备故障停车。 事故不仅造成南京南站部分列车晚点&#xff0c;还在故障排查过程中导致随车机械师因被邻线限速通过的列车碰撞而不幸身…

不使用递归的决策树生成算法

不使用递归的决策树生成算法 利用队列 queue &#xff0c;实现层次遍历&#xff08;广度优先遍历&#xff09;&#xff0c;逐步处理每个节点来建立子树结构。再构建一个辅助队列&#xff0c;将每个节点存储到 nodes_to_process 列表中&#xff0c;以便在树生成完成后可以反向遍…

【PB】 使用for循环,循环次数比较多时,datastore 获取数据异常的问题。

以往在使用datastore时&#xff0c;不注意及时销毁&#xff0c;毕竟一次处理数据&#xff0c;数量很少。 本次碰到一个问题&#xff0c;批量处理数据&#xff0c;for循环次数在1000次左右&#xff0c;每个for循环处理 3 个函数&#xff0c;每个函数中有3-4个datastore&#xff…

自动驾驶系列—自动驾驶如何实现厘米级定位?深入解读GPS/RTK技术与应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

DevOps业务价值流:需求设计最佳实践

DevOps实践正推动着产品快速迭代与高质量交付&#xff0c;但需求设计作为产品开发的关键起点&#xff0c;往往被忽视。它不仅是收集与分析需求的过程&#xff0c;更是将需求转化为可实施产品特性的核心。本文深入探讨DevOps业务价值流中的需求设计&#xff0c;从调研、整理、原…

【MySQL】数据库整合攻略 :表操作技巧与详解

前言&#xff1a;本节内容讲述表的操作&#xff0c; 对表结构的操作。 是对表结构中的字段的增删查改以及表本身的创建以及删除。 ps&#xff1a;本节内容本节内容适合安装了MySQL的友友们进行观看&#xff0c; 实操更有利于记住哦。 目录 创建表 查看表结构 修改表结构 …

python可视化进阶

引用&#xff1a; 首先需要安装 plotnine from plotnine import* import joypy数据可视化进阶操作 3.1 类别数据可视化 【例3-1】——绘制简单条形图 【代码框3-1】——绘制简单条形图 # 图3-1的绘制代码 import pandas as pd import matplotlib.pyplot as plt from cvxpy …

使用 GitHub Actions 部署到开发服务器的详细指南

使用 GitHub Actions 部署到开发服务器的详细指南 在本篇博客中&#xff0c;我们将介绍如何使用 GitHub Actions 实现自动化部署&#xff0c;将代码从 GitHub 仓库的 dev 分支自动部署到开发服务器。通过这种方式&#xff0c;可以确保每次在 dev 分支推送代码时&#xff0c;服…

反汇编命令学习以及分析越界和空指针问题

1,反汇编命令行 (1)move 语法格式:mov destination, source例如: mov eax,0x1 ;将立即数1复制到eax寄存器。立即数到寄存器mov [ebx],eax ;将eax寄存器的值复制到ebx寄存器指向的内存地址,寄存器到内存mov eax,ebx ;将ebx寄存器的值复制到eax,寄存器到寄存器mov ea…

冒泡选择法(c基础)

适合对象c语言初学者。 冒泡选择法 作用对一个数组进行排序。&#xff08;介绍一下数组(c基础)(详细版)-CSDN博客&#xff09; 核心要点 1: 数组元素个数 sz 2: 比较后的交换。 核心思路 进行&#xff08;sz - 1&#xff09;趟&#xff0c;每一趟把最大数的放到末尾。其…

Shell脚本语法随笔

文章目录 1、编写 Shell 脚本文件1_脚本结构2_示例3_执行脚本 2、变量的定义与使用1_定义变量2_只读变量3_接受用户输入4_删除变量名5_变量作用域 3、字符串处理1_双引号 vs 单引号2_示例 4、条件判断&运算符1_数值比较2_case示例3_算数运算符4_逻辑运算符5_字符串运算符6_…

量子计算及其在密码学中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…

【论文笔记】Wings: Learning Multimodal LLMs without Text-only Forgetting

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Wings: Learning Multimod…

数据类型底层

计算机的工作原理 CPU 找数据 数据通过地址信息来标记 高级语言:在内存中"分配"空间用变量来标识 所以变量一定是存在地址的 例如: int a10; //a就是变量名用来对地址进行标识 0x100对这个地址标识必备常识:8bit1byte 常见的数据类型: char short int long //…

【Leecode】Leecode刷题之路第45天之跳跃游戏II

题目出处 45-跳跃游戏II-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 45-跳跃游戏II-官方解法 这道题是典型的贪心算法&#xff0c;通过局部最优解得到全局最优解。以下两种方法都是…

【Allure】mac下环境配置

安装 1.Mac 可以使用 brew 安装 allure&#xff0c;安装命令如下 brew install allure 2.与 pytest 结合需要安装 allure-pytest 插件&#xff1a; pip install allure-pytest3.查看allure版本 allure --version

conan2 c/c++包管理菜鸟入门

以官网教程为例。 首先下载官网示例&#xff1a; git clone https://github.com/conan-io/examples2.git cd examples2/tutorial/consuming_packages/simple_cmake_project 然后进入该示例教程 先 conan profile detect 检测一下当前编译器环境是否配置&#xff0c; 然后…

20221428欧阳慕蓉 第九周预习报告

AI对学习内容的总结 第九章的内容主要围绕进程和系统调用的概念&#xff0c;以及如何在C程序中使用这些概念来创建和管理进程。以下是本章的主要内容总结&#xff1a; 系统调用&#xff08;System Calls&#xff09;&#xff1a; 系统调用是C程序用来与操作系统内核交互的函数…