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

PySimpleGUI库和pymysql库

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("你点了关闭按钮")
        break
    if 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("你点了关闭按钮")
        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.视频处理

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.图片处理

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

对数据库中数据的增删改查:

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.人脸采集

准备:

  • 创建一个文件夹接收采集的人脸图片
  • 数据库中创建一张用来接收身份信息的表

实现:

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.人脸识别

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()


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

相关文章:

  • Systemd: disable和mask的区别
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局
  • 推荐一个超漂亮ui的网页应用设计
  • 对称加密与非对称加密:密码学的基石及 RSA 算法详解
  • 基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面
  • 华为大咖说 | 浅谈智能运维技术
  • 探索计算机互联网的奇妙世界:从基础到前沿的无尽之旅
  • 2024 年 Java 面试正确姿势(1000+ 面试题附答案解析)
  • 算法学习第一弹——C++基础
  • Hive简介 | 体系结构
  • 青训3_1110_01 构造特定数组的逆序拼接
  • 性能飙升!时间序列+预训练强强联合,轻松迈入顶刊门槛!
  • conan2 c/c++包管理菜鸟入门
  • 使用MethodChannel与原生程序通信
  • PyQt5超详细教程终篇
  • 【Leecode】Leecode刷题之路第46天之全排列
  • InnoDB存储引擎对MVCC的实现
  • 项目管理平台盘点:2024推荐的9款优质工具
  • NLP自然语言处理:深入探索Self-Attention——自注意力机制详解
  • C语言 | Leetcode C语言题解之第551题学生出勤记录I
  • http防抖和ws防抖
  • OpenCV基础05_GUI和PyMsql
  • CVPR力推!预训练+医学图像这么玩,审稿人都得为你让条路!
  • 【SQL实验】高级查询(三)含附加数据库操作
  • SQL,力扣题目571, 给定数字的频率查询中位数
  • C++初阶学习第十弹——深入讲解vector的迭代器失效