24.11.6 PySimpleGUI库和pymsql 库以及人脸识别小项目

news/2024/11/12 10:49:13/

PySimpleGUI 库

PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面

安装

直接pip install pysimplegui安装的是最新版PysimpleGUI,这个5.0之后就是收费的,只能试用。pip install PySimpleGUI==4.60.5,可以下载旧版,免费使用
先卸载,使用命令pip uninstall pysimplegui,然后使用命令安装旧版本
pip install PySimpleGUI==4.60.5

pip install pysimplegui

布局和窗口

文本输入输出案例

import PySimpleGUI as sg# 创建一个布局组件
layout = [[sg.Text("ID", size=(10, 1), ), sg.InputText()],[sg.Text("Name", size=(10, 1), ), sg.InputText()],[sg.Text(key="msg")],[sg.Button("关闭"), sg.Button("保存")]
]
# 创建窗口
window = sg.Window("我的第一个窗口", layout)while True:event01, value01 = window.read()print(value01)if event01 == "关闭":sg.popup("你点了关闭按钮")breakif event01 in "保存":id = value01[0]name = value01[1]window["msg"].update(f"ID:{id}  Name:{name}")sg.popup("你点了人脸采集按钮")# 资源释放
window.close()

 视频处理

import PySimpleGUI as sg
import cv2# 开启摄像头
def demo():# 获取摄像头cap = cv2.VideoCapture(0)# 判断摄像头是否开启if cap.isOpened() == False:print("没有开启摄像头")return# 创建layoutlayout = [[sg.Button("关闭")],[sg.Image(key="Video")]]# 创建窗口window = sg.Window("视频处理", layout)while True:# 读取数据和事件event, value = window.read(timeout=10)# 读取数据帧ret, frame = cap.read()if event in (None,"关闭"):breakif ret:imgType = cv2.imencode(".png", frame)[1].tobytes()print(imgType)window["Video"].update(imgType)# 释放资源cap.release()window.close()if __name__ == '__main__':demo()

 图片上传

 

import cv2
import PySimpleGUI as sg#开启摄像头
def demo():#创建layoutlayout = [[sg.Button("关闭"),sg.Button("上传")],[sg.Input(key='-FILE-', enable_events=True),sg.FileBrowse(file_types=(("Image Files", "*.png;*.jpg;*.jpeg;*.gif"),))],[sg.Image(key="video")]]#创建窗口window = sg.Window("文件处理",layout)while True:event,value = window.read()if event in (None,"关闭"):breakif event == "上传":#图片路径不能用中文path = value["-FILE-"]print(path)img = cv2.imread(path)imgType = cv2.imencode(".png", img)[1].tobytes()window["video"].update(imgType)window.close()demo()

pymsql 库

PyMySQL 是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集

安装

pip install pymysql

数据库操作

import pymysql# 新增
def add(name, num):con = pymysql.connect(host="localhost",  # 主机名user="root",password="xz413613",database="demo1",  # 数据库名charset="utf8"  # 编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "insert into user_list (user_name,user_num) values(%s,%s)"# 运行sqlcur.execute(sql, (name, num))# 返回这串sql语句影响了多少行数据num = cur.rowcountif num > 0:print("新增成功")else:print("新增失败")# 提交con.commit()# 释放资源cur.close()con.close()def update(num):con = pymysql.connect(host="localhost",  # 数据库地址user="root",  # 用户名password="xz413613",  # 密码database="demo1",  # 数据库名charset="utf8"  # 编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "select * from user_list where user_num=%s"# 运行sqlcur.execute(sql, (num,))# 查询rs = cur.fetchall()# 释放资源cur.close()con.close()if len(rs) > 0:print(rs)print(rs[0][1])else:return "查无此人"def del_num(id):con = pymysql.connect(host="localhost",  # 主机名user="root",password="xz413613",database="demo1",  # 数据库名charset="utf8"  # 编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "delete from user_list where user_id=%s"# 运行sqlcur.execute(sql, (id,))# 返回这串sql语句影响了多少行数据num = cur.rowcountif num > 0:print("删除成功")else:print("删除失败")# 提交con.commit()# 释放资源cur.close()con.close()if __name__ == '__main__':# add("小11", 111)update(1)# del_num(1)

 

人脸采集

1 准备工作:创建人脸表

2 完成人脸保存

import PySimpleGUI as sg
import cv2
import pymysql# 新增
def add(name, num):con = pymysql.connect(host="localhost",  # 主机名user="root",password="xz413613",database="demo1",  # 数据库名charset="utf8"  # 编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "insert into user_list (user_name,user_num) values(%s,%s)"# 运行sqlcur.execute(sql, (name, num))# 返回这串sql语句影响了多少行数据num = cur.rowcount# 提交con.commit()# 释放资源cur.close()con.close()if num > 0:print("新增成功")return Trueelse:print("新增失败")return False# 数据窗口采集
def datacGet():# 开启摄像头cap = cv2.VideoCapture(0)if cap.isOpened() == False:print("摄像头没开")return# 创建布局layout = [[sg.Text("编号:"), sg.InputText(key="num")],[sg.Text("姓名:"), sg.InputText(key="name")],[sg.Image(key="video")],[sg.Button("关闭"), sg.Button("采集")]]# 创建窗口window = sg.Window("人脸信息采集", layout)# 循环while True:event, value = window.read(timeout=10)# 读取视频ret, frame = cap.read()if event in (None, "关闭"):# 终止循环break# 视频流的处理if ret:# 已经读取到视频,现在进行转换,然后放进image里面imType = cv2.imencode(".png", frame)[1].tobytes()window["video"].update(imType)if event == "采集":# 获取编号和姓名num = value["num"]name = value["name"]# 写入人脸图片iss = cv2.imwrite(f"D:\\HQYJ\\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image\\{num}.png",frame)if iss:issAdd = add(name, num)if issAdd:sg.popup("人脸采集成功")else:sg.popup("人脸采集失败")# 资源释放cap.release()window.close()if __name__ == '__main__':datacGet()

人脸识别

import os
import PySimpleGUI as sg
import cv2
import face_recognition
import numpy as np
import pymysql# 新增
def update(num):con = pymysql.connect(host="localhost",  # 数据库地址user="root",  # 用户名password="xz413613",  # 密码database="demo1",  # 数据库名charset="utf8"  # 编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "select * from user_list where user_num=%s"# 运行sqlcur.execute(sql, (num,))# 查询rs = cur.fetchall()# 释放资源cur.close()con.close()if len(rs) > 0:print(rs)return rs[0][1]else:return "查无此人"# 数据窗口采集
def datacGet():# 开启摄像头cap = cv2.VideoCapture(0)if cap.isOpened() == False:print("摄像头没开")return# 创建布局layout = [[sg.Image(key="video")],[sg.Button("关闭"), sg.Button("识别")]]# 创建窗口window = sg.Window("人脸信息识别", layout)# 循环while True:event, value = window.read(timeout=10)# 读取视频ret, frame = cap.read()if event in (None, "关闭"):# 终止循环break# 视频流的处理if ret:# 已经读取到视频,现在进行转换,然后放进image里面imType = cv2.imencode(".png", frame)[1].tobytes()window["video"].update(imType)if event == "识别":# 查找人脸库list_dir = os.listdir("D:\\HQYJ\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image")if len(list_dir) > 0:for i in list_dir:# 读取一个图片对象img = cv2.imread(f"D:\\HQYJ\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image\\{i}")if img is None:print("没有读取图片")breakelse:# 获取已知图片的特征变量en1 = face_recognition.face_encodings(img)[0]# 获取需要检测图片的特征变量en2 = face_recognition.face_encodings(frame)[0]# 计算欧几里得距离rs = np.linalg.norm(en1 - en2)print(rs)if rs < 0.4:b = i.split(".")[0]a = update(b)sg.popup(f"用户{a},打卡成功")breakelse:sg.popup("人脸库没有此人")# 资源释放cap.release()window.close()if __name__ == '__main__':datacGet()

以上代码在不同的设备上使用,需要注意代码中路径的设置,以及检查是否安装了必需的第三方库


http://www.ppmy.cn/news/1545921.html

相关文章

Kafka中如何做到数据唯一,即数据去重?

数据传递语义 至少一次&#xff08;At Least Once&#xff09; ACK级别设置为-1 分区副本大于等于2 ISR里应答的最小副本数量大于等于2 可以保障数据可靠 • 最多一次&#xff08;At Most Once&#xff09; ACK级别设置为0 • 总结&#xff1a; At Least Once可以保证数据不…

Linux---进程间通信之共享内存

前言 我们前面学习了管道&#xff0c;今天我们学习另一种进程间通信方式--->共享内存。管道通信本质是基于文件系统的&#xff0c;并不关操作系统什么事&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但他们的目的都是一样的&#xff0c;就是让不同的进程看…

分布式数据库技术深度解析与代码实践

分布式数据库技术深度解析与代码实践 随着大数据和云计算的快速发展,分布式数据库作为一种高性能、高可用性和可扩展性的数据存储解决方案,被广泛应用于各种业务场景中。本文将深入探讨分布式数据库的核心技术、架构设计及其实践应用,并通过具体代码示例展示如何在实际项目…

jmeter 性能测试步骤是什么?

JMeter是一款流行的开源性能测试工具&#xff0c;用于测试各种服务器和网络应用的性能。在进行JMeter性能测试时&#xff0c;通常需要遵循以下步骤&#xff1a; 确定测试目标&#xff1a;首先&#xff0c;明确性能测试的目标。这可以是测试一个网站的负载能力、测试一个API的响…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple dmesg dmesg 是一个用…

Spring Boot框架下的注解(完整版)

1. 应用程序主配置类注解 这些注解用于定义 Spring Boot 应用的主配置类&#xff0c;启用自动配置&#xff0c;设置扫描路径等。 1.1 SpringBootApplication 作用&#xff1a;SpringBootApplication 是 Spring Boot 应用的核心注解&#xff0c;通常用于应用的启动类上&#…

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

Stable Diffusion WebUI或ComfyUI下载不了huggingface?修改huggingface为国内镜像地址方法在这里

有时我们可能没有科学上网的方法&#xff0c;或者Linux系统你不会搭建科学上网的方法&#xff0c;这样你就不能访问huggingface自动下载模型了。 有人说&#xff0c;可以手动下载呀&#xff01; 但是&#xff0c;手动一个一个下载会很麻烦。 下面就讲&#xff0c;如何通过修…