当前位置: 首页 > article >正文

Python(PySimpleGUI 库)

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,"关闭"):
           #终止循环
           break
       if 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("没有读取图片")
                        break
                    else:
                        #获取已知图片的特征变量
                        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}打卡成功")
                                #查到此人,终止循环
                                break
                            else:
                                continue

定义一个人像识别函数:

1.开启摄像头,创建一个能显示图片,有“关闭”和“人脸识别”两个选项的窗口

2.创建死循环:读取窗口信息和读取摄像头画面信息,和采集函数一样,先判断用户的操作,如果用户点击“关闭”和关闭窗口,就结束程序,接着判断摄像头是否读取到信息,读取到之后将信息转换成bytes类型(防止窗口显示不了画面),将读取到的画面显示在窗口上。

3.接着定义用户点击“人脸识别”后,首先通过os.listdir()函数,遍历指定保存人脸信息文件夹的图片,并返回以所有图片名作为字符串的列表,如果返回的列表不为空(有图片文件),则创建循环来依次读取图片信息。

4.读取到图片信息后,便通过face_recognition.face_encodings()函数来获取该图片的特征变量及视频帧中画面的特征变量,因为时人脸测,所以先判断视频帧特征变量函数的返回值是否为空,为空,则提示没检测到人脸,不为空则与遍历图片计算欧几里得距离。

5.自己设定一个阈值(re),图中设置为0.5,如果re值小于设定的阈值,则将遍历图片的名字以“.”分割(如图片名为11.png,就将其分为“11”和“png”两部分)取前面的数值,将这个值作为num传入查找函数,调用查找函数。数据库中有该信息,则会打印该user信息并返回它的名字,提示"用户{a}打卡成功",若没找到,则继续遍历;遍历结束还没找到,则弹出“查无此人”的信息。

最后释放资源,调用函数。


http://www.kler.cn/a/382421.html

相关文章:

  • Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败
  • 跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)
  • [数据结构从小白到大牛]第五篇:3分钟带你吃透双链表并用C语言模拟实现
  • 江协科技STM32学习- P35 硬件I2C读写MPU6050
  • Flink的环境搭建及使用
  • Redis学习:BigKey、缓存双写一致性更新策略和案例
  • gulp入门教程16:gulp插件gulp-uglify
  • 软件测试学习笔记丨Flask操作数据库-一对多
  • 电商行业企业员工培训的在线知识库构建
  • git常用操作指令
  • oasys系统代码审计
  • mmsegmentation训练自己的数据集
  • java语言基本编程原理
  • 5.Java 数组(一维数组、二维数组、数组实例实操)
  • ubuntu20安装opencv3.2记录
  • 洛谷P1090 [NOIP2004 提高组] 合并果子
  • Halcon 从XML中读取配置参数
  • 系统思考—深层结构
  • 《Ooga》进不去游戏解决方法
  • Java基础-组件及事件处理(下)
  • C语言程序的机器表示(逆向+函数调用栈详解版)
  • 情怀系列国际版棋牌完整源码具备强大的多语言扩展功能,涵盖了900多款子游戏,专为全球市场的游戏开发和运营设计。
  • 关于SwitchCase中变量定义及使用变量的一些注意事项参数传递参数时不能实现多态动态绑定的问题c++语法
  • 基于C#实现Windows后台窗口操作与图像处理技术分析
  • 【Linux】从零开始使用多路转接IO --- select
  • 时间段比较与 SQL 实现:交集、并集与补集