1.PySimpleGUI 库
PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面
安装:
pip install PySimpleGUI==4.60.5
说明:5.0以上的版本不免费
1.布局和窗口
import PySimpleGUI as sg# 创建一个布局组件
layout = [[sg.Button("关闭"),sg.Button("人脸采集")]
]
# 创建窗口
window = sg.Window("我的窗口", layout)while True:# 读取窗口信息 返回窗口的数据和事件event, value = window.read()if event in("关闭",None):# 提示print("你点了关闭")sg.popup("你点了关闭按钮")breakif event in("人脸采集",):# 提示sg.popup("你点了人脸采集1按钮")
window.close()
2.文本框组件
import PySimpleGUI as sg# 创建一个布局组件
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("保存")]
]
# 创建窗口
window = sg.Window("我的窗口", layout)while True:# 读取窗口信息 返回窗口的数据和事件event, value = window.read()if event == "关闭":# 提示print("你点了关闭")sg.popup("你点了关闭按钮")breakif event in("保存",):# 提示# 获取编号id_value = value["id"]name_value = value["name"]window["msg"].update(f"id:{id_value},name:{name_value}")sg.popup("保存")
window.close()
3.视频处理
import cv2
import PySimpleGUI as sg# 开启摄像头
def demo():cap = cv2.VideoCapture(0)if not cap.isOpened():print("没有开启摄像头")return# 窗体创建layoutlayout = [[sg.Image(key="video")],[sg.Button("关闭")],]# 创建窗口window = sg.Window("视频", layout)while True:# 读取数据事件event ,value = window.read(timeout=10)# 读取数据帧ret, frame = cap.read()if event in ("关闭",None):# 提示breakif ret:# 将图片转换为png格式imgType = cv2.imencode(".png", frame)[1].tobytes()print(imgType)window["video"].update(imgType)# 释放资源cap.release()window.close()demo()
4.图片处理
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(timeout=10)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()
2.pymysql
PyMySQL
是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集
安装:
pip install pymysql
对数据库中数据的增删改查:
import pymysql# 新增
def sql_add(name, num):# 创建数据库链接con = pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="demo01",charset="utf8")# 创建游标对象 增删改查函数cur = con.cursor()sq1 = "insert into demo01 (user_name,user_num) value (%s, %s)"# 运行sq1(增删改sq1的函数)cur.execute(sq1, (name,num))# 执行增删改sq1函数 返回一个受影响行数的数值num = cur.rowcountif num > 0:print("新增成功!")else:print("新增失败!")# 提交con.commit()# 释放资源cur.close()con.close()# 修改
def sql_update(name,num):# 创建数据库链接con = pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="demo01",charset="utf8")# 创建游标对象 增删改查函数cur = con.cursor()sq1 = "update demo01 set user_name=%s where user_num=%s"# 运行sq1(增删改sq1的函数)cur.execute(sq1, (name, num))# 执行增删改sq1函数 返回一个受影响行数的数值num = cur.rowcountif num > 0:print("修改成功!")else:print("修改失败!")# 提交con.commit()# 释放资源cur.close()con.close()def sql_query(num):# 创建数据库链接con = pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="demo01",charset="utf8")# 创建游标对象 增删改查函数cur = con.cursor()sq1 = "select * FROM demo01 WHERE user_num=%s"# 运行sq1(增删改sq1的函数)cur.execute(sq1, (num,))# 查询的结构返回到一个变量rs = cur.fetchall()"""print(rs)print(rs[0][1])"""cur.close()con.close()if len(rs) > 0:return rs[0][1]else:return "查无此人"def sql_delete(id):# 创建数据库链接con = pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="demo01",charset="utf8")# 创建游标对象 增删改查函数cur = con.cursor()sq1 = "delete from demo01 where user_id=%s"# 运行sq1(增删改sq1的函数)cur.execute(sq1, (id,))# 执行增删改sq1函数 返回一个受影响行数的数值num = cur.rowcountif num > 0:print("删除成功!")else:print("删除失败!")# 提交con.commit()# 释放资源cur.close()con.close()
if __name__ == '__main__':"""sql_add("lisi",2)sql_update("王五",1)sql_query(3)"""sql_delete(1)
3.PySimpleGUI库和pymysql库组合实现人脸采集和人脸识别
1.人脸采集
准备:
- 创建一个文件夹接收采集的人脸图片
- 数据库中创建一张用来接收身份信息的表
实现:
import pymysql
import PySimpleGUI as sg
import cv2# 人脸用户的记录
def sql_add(name, num):# 创建数据库链接con = pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="demo01",charset="utf8")# 创建游标对象 增删改查函数cur = con.cursor()sq1 = "insert into demo01 (user_name,user_num) value (%s, %s)"# 运行sq1(增删改sq1的函数)cur.execute(sq1, (name,num))# 执行增删改sq1函数 返回一个受影响行数的数值num = cur.rowcount# 提交con.commit()# 释放资源cur.close()con.close()if num > 0:print("新增成功!")return Trueelse:print("新增失败!")return False# 数据采集
def dataGet():# 开启摄像头cap = cv2.VideoCapture(0)if not cap.isOpened():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):# 终止循环breakif ret:imgType = cv2.imencode(".png",frame)[1].tobytes()window["video"].update(imgType)if event == "采集":num = value["num"]name = value["name"]# 写入人脸图片iss = cv2.imwrite(f"..\\face_images\\{num}.png",frame)if iss:is_add = sql_add(name,num)if is_add:sg.popup("收集人脸成功")else:sg.popup("收集人脸失败")cap.release()window.close()dataGet()
2.人脸识别
import cv2
import PySimpleGUI as sg
import pymysql
import face_recognition
import os
import numpy as npdef sql_query(num):# 创建数据库链接con = pymysql.connect(host="localhost",user="root",passwd="123456",port=3306,database="demo01",charset="utf8")# 创建游标对象 增删改查函数cur = con.cursor()sq1 = "select * FROM demo01 WHERE user_num=%s"# 运行sq1(增删改sq1的函数)cur.execute(sq1, (num,))# 查询的结构返回到一个变量rs = cur.fetchall()"""print(rs)print(rs[0][1])"""cur.close()con.close()if len(rs) > 0:return rs[0][1]else:return "查无此人"def queryGet():# 开启摄像头cap = cv2.VideoCapture(0)if not cap.isOpened():print("摄像头没有开启")return# 创建布局layout=[[sg.Image(key = "video")],[sg.Button("人脸识别"),sg.Button("关闭")]]# 创建窗口window = sg.Window("人脸信息采集",layout)# 循环list_dir = os.listdir("../face_images")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()window["video"].update(imgType)if event == "人脸识别":if len(list_dir) > 0:for i in list_dir:# 读取图片img = cv2.imread(f"../face_images/{i}")print(i)if img is None:print("没有图片")else:# 获取已知图片的特征变量en1 = face_recognition.face_encodings(img)[0]en2 = face_recognition.face_encodings(frame)if len(en2) == 0:sg.popup("未检测到人脸")breakelse:# 计算欧几里得距离rs = np.linalg.norm(en2[0] - en1)print(rs)if rs < 0.5:b = i.split(".")[0]a = sql_query(b)sg.popup(f"用户{a}打卡成功")list_dir.remove(i)# 终止循环breakelse:sg.popup("人脸库没有此人")else:sg.popup("已全部完成打卡!")breakcap.release()window.close()
if __name__ == '__main__':queryGet()