PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面
安装:pip install PySimpleGUI==4.60.5
该库5.0版本后收费,故安装4.6版本
布局和窗口
文本输入输出案例
视频处理
图片上传
pymsql 库
PyMySQL
是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集
安装:pip install pymysql
数据库操作
在navicat中创建该表
表名及数据库名自定
导入包
增加数据
调用:
打印:
返回navicat刷新可见:
再添加一些数据。
删除数据
如图可按id删除数据
调用:
修改数据
如图,可根据id来修改对应user的名字
调用
查找
如图:通过user的num来查找user的信息
调用:
人脸采集
1 准备工作:创建人脸表
继续用上表
首先导入需要的包
定义一个连接数据库,然后添加人脸信息的函数。
再定义一个函数,用于开启摄像头,然后创建窗口“人脸信息采集”,创建文本信息和命令按键
创建好窗口后开始循环,(timeout=10)中,10为摄像头刷新间隔,读取视频帧,当点击关闭和窗口叉键时,会直接关闭窗口,结束程序
当视频帧存在时,将数据帧画面更新为bytes类型,后将视频帧更新到窗口,当点击采集时,输入编号和姓名,同时将视频帧上的人脸图片保存至一个文件夹(自己指定),再用if语句检测是否有录入信息,如果有,就调用之前创建的函数将采集时输入的编号和名字存入navicat数据库内。
释放资源
调用采集函数。完成采集。
窗口输入信息
点击采集
采集成功
navicat信息也录入成功。
人脸识别
导入需要的库
定义一个查找信息的函数:
通过user的num来进行查找,如果num在数据库中,则会打印该user全部信息,返回user的名字。
def dataGet():#开启摄像头像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,"关闭"):#终止循环breakif ret:imtType = cv2.imencode(".png",frame)[1].tobytes()window["video"].update(imtType)if event =="人脸识别":#查找人脸库list_dir = os.listdir("..\save_image")if len(list_dir)>0:for i in list_dir:print(i)#读取一个图片对象img = cv2.imread(f"..\save_image\{i}")if img is None:print("没有读取图片")breakelse:#获取已知图片的特征变量en1 = face_recognition.face_encodings(img)[0]#获取需要检测图片的特征变量en2 = face_recognition.face_encodings(frame)if len(en2) == 0:sg.popup('未检测出人脸')else:#计算欧几里得距离rs = np.linalg.norm(en1-en2[0])print(rs)if rs < 0.5:b = i.split(".")[0]a = query(b)sg.popup(f"用户{a}打卡成功")#查到此人,终止循环breakelse:continue
定义一个人像识别函数:
1.开启摄像头,创建一个能显示图片,有“关闭”和“人脸识别”两个选项的窗口
2.创建死循环:读取窗口信息和读取摄像头画面信息,和采集函数一样,先判断用户的操作,如果用户点击“关闭”和关闭窗口,就结束程序,接着判断摄像头是否读取到信息,读取到之后将信息转换成bytes类型(防止窗口显示不了画面),将读取到的画面显示在窗口上。
3.接着定义用户点击“人脸识别”后,首先通过os.listdir()函数,遍历指定保存人脸信息文件夹的图片,并返回以所有图片名作为字符串的列表,如果返回的列表不为空(有图片文件),则创建循环来依次读取图片信息。
4.读取到图片信息后,便通过face_recognition.face_encodings()函数来获取该图片的特征变量及视频帧中画面的特征变量,因为时人脸测,所以先判断视频帧特征变量函数的返回值是否为空,为空,则提示没检测到人脸,不为空则与遍历图片计算欧几里得距离。
5.自己设定一个阈值(re),图中设置为0.5,如果re值小于设定的阈值,则将遍历图片的名字以“.”分割(如图片名为11.png,就将其分为“11”和“png”两部分)取前面的数值,将这个值作为num传入查找函数,调用查找函数。数据库中有该信息,则会打印该user信息并返回它的名字,提示"用户{a}打卡成功",若没找到,则继续遍历;遍历结束还没找到,则弹出“查无此人”的信息。
最后释放资源,调用函数。