1.PySimpleGUI 库
PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面
安装:
pip install PySimpleGUI==4.60.5
说明:5.0以上的版本不免费
1.布局和窗口
python
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("你点了关闭按钮")
break
if event in("人脸采集",):
# 提示
sg.popup("你点了人脸采集1按钮")
window.close()
2.文本框组件
python
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("你点了关闭按钮")
break
if 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.视频处理
python
import cv2
import PySimpleGUI as sg
# 开启摄像头
def demo():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("没有开启摄像头")
return
# 窗体创建layout
layout = [
[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):
# 提示
break
if ret:
# 将图片转换为png格式
imgType = cv2.imencode(".png", frame)[1].tobytes()
print(imgType)
window["video"].update(imgType)
# 释放资源
cap.release()
window.close()
demo()
4.图片处理
python
import cv2
import PySimpleGUI as sg
# 开启摄像头
def demo():
# 窗体创建layout
layout = [
[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):
# 提示
break
if 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
对数据库中数据的增删改查:
python
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.rowcount
if 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.rowcount
if 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.rowcount
if 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.人脸采集
准备:
- 创建一个文件夹接收采集的人脸图片
- 数据库中创建一张用来接收身份信息的表
实现:
python
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 True
else:
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):
# 终止循环
break
if 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.人脸识别
python
import cv2
import PySimpleGUI as sg
import pymysql
import face_recognition
import os
import numpy as np
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 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):
# 终止循环
break
if 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("未检测到人脸")
break
else:
# 计算欧几里得距离
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)
# 终止循环
break
else:
sg.popup("人脸库没有此人")
else:
sg.popup("已全部完成打卡!")
break
cap.release()
window.close()
if __name__ == '__main__':
queryGet()