24.11.6 PySimpleGUI库和pymsql 库以及人脸识别小项目

news2024/11/7 7:16:11

PySimpleGUI 库

PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面

安装

直接pip install pysimplegui安装的是最新版PysimpleGUI,这个5.0之后就是收费的,只能试用。pip install PySimpleGUI==4.60.5,可以下载旧版,免费使用
先卸载,使用命令pip uninstall pysimplegui,然后使用命令安装旧版本
pip install PySimpleGUI==4.60.5

pip install pysimplegui

布局和窗口

文本输入输出案例

import PySimpleGUI as sg

# 创建一个布局组件
layout = [
    [sg.Text("ID", size=(10, 1), ), sg.InputText()],
    [sg.Text("Name", size=(10, 1), ), sg.InputText()],
    [sg.Text(key="msg")],
    [sg.Button("关闭"), sg.Button("保存")]
]
# 创建窗口
window = sg.Window("我的第一个窗口", layout)

while True:
    event01, value01 = window.read()
    print(value01)
    if event01 == "关闭":
        sg.popup("你点了关闭按钮")
        break
    if event01 in "保存":
        id = value01[0]
        name = value01[1]
        window["msg"].update(f"ID:{id}  Name:{name}")
        sg.popup("你点了人脸采集按钮")

# 资源释放
window.close()

 视频处理

import PySimpleGUI as sg
import cv2


# 开启摄像头
def demo():
    # 获取摄像头
    cap = cv2.VideoCapture(0)
    # 判断摄像头是否开启
    if cap.isOpened() == False:
        print("没有开启摄像头")
        return
    # 创建layout
    layout = [
        [sg.Button("关闭")],
        [sg.Image(key="Video")]
    ]
    # 创建窗口
    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()
            print(imgType)
            window["Video"].update(imgType)
    # 释放资源
    cap.release()
    window.close()


if __name__ == '__main__':
    demo()

 图片上传

 

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

pymsql 库

PyMySQL 是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集

安装

pip install pymysql

数据库操作

import pymysql


# 新增
def add(name, num):
    con = pymysql.connect(
        host="localhost",  # 主机名
        user="root",
        password="xz413613",
        database="demo1",  # 数据库名
        charset="utf8"  # 编码
    )
    # 创建游标对象,包含了增删改查的函数
    cur = con.cursor()
    # 定义sql
    sql = "insert into user_list (user_name,user_num) values(%s,%s)"
    # 运行sql
    cur.execute(sql, (name, num))
    # 返回这串sql语句影响了多少行数据
    num = cur.rowcount
    if num > 0:
        print("新增成功")
    else:
        print("新增失败")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()


def update(num):
    con = pymysql.connect(
        host="localhost",  # 数据库地址
        user="root",  # 用户名
        password="xz413613",  # 密码
        database="demo1",  # 数据库名
        charset="utf8"  # 编码
    )
    # 创建游标对象,包含了增删改查的函数
    cur = con.cursor()
    # 定义sql
    sql = "select * from user_list where user_num=%s"
    # 运行sql
    cur.execute(sql, (num,))
    # 查询
    rs = cur.fetchall()

    # 释放资源
    cur.close()
    con.close()
    if len(rs) > 0:
        print(rs)
        print(rs[0][1])
    else:
        return "查无此人"


def del_num(id):
    con = pymysql.connect(
        host="localhost",  # 主机名
        user="root",
        password="xz413613",
        database="demo1",  # 数据库名
        charset="utf8"  # 编码
    )
    # 创建游标对象,包含了增删改查的函数
    cur = con.cursor()
    # 定义sql
    sql = "delete from user_list where user_id=%s"
    # 运行sql
    cur.execute(sql, (id,))
    # 返回这串sql语句影响了多少行数据
    num = cur.rowcount
    if num > 0:
        print("删除成功")
    else:
        print("删除失败")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()


if __name__ == '__main__':
    # add("小11", 111)
    update(1)
    # del_num(1)

 

人脸采集

1 准备工作:创建人脸表

2 完成人脸保存

import PySimpleGUI as sg
import cv2
import pymysql


# 新增
def add(name, num):
    con = pymysql.connect(
        host="localhost",  # 主机名
        user="root",
        password="xz413613",
        database="demo1",  # 数据库名
        charset="utf8"  # 编码
    )
    # 创建游标对象,包含了增删改查的函数
    cur = con.cursor()
    # 定义sql
    sql = "insert into user_list (user_name,user_num) values(%s,%s)"
    # 运行sql
    cur.execute(sql, (name, num))
    # 返回这串sql语句影响了多少行数据
    num = cur.rowcount
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()
    if num > 0:
        print("新增成功")
        return True
    else:
        print("新增失败")
        return False


# 数据窗口采集
def datacGet():
    # 开启摄像头
    cap = cv2.VideoCapture(0)
    if cap.isOpened() == False:
        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:
            # 已经读取到视频,现在进行转换,然后放进image里面
            imType = cv2.imencode(".png", frame)[1].tobytes()
            window["video"].update(imType)
        if event == "采集":
            # 获取编号和姓名
            num = value["num"]
            name = value["name"]
            # 写入人脸图片
            iss = cv2.imwrite(f"D:\\HQYJ\\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image\\{num}.png",
                              frame)
            if iss:
                issAdd = add(name, num)
                if issAdd:
                    sg.popup("人脸采集成功")
            else:
                sg.popup("人脸采集失败")
    # 资源释放
    cap.release()
    window.close()


if __name__ == '__main__':
    datacGet()

人脸识别

import os
import PySimpleGUI as sg
import cv2
import face_recognition
import numpy as np
import pymysql


# 新增
def update(num):
    con = pymysql.connect(
        host="localhost",  # 数据库地址
        user="root",  # 用户名
        password="xz413613",  # 密码
        database="demo1",  # 数据库名
        charset="utf8"  # 编码
    )
    # 创建游标对象,包含了增删改查的函数
    cur = con.cursor()
    # 定义sql
    sql = "select * from user_list where user_num=%s"
    # 运行sql
    cur.execute(sql, (num,))
    # 查询
    rs = cur.fetchall()

    # 释放资源
    cur.close()
    con.close()
    if len(rs) > 0:
        print(rs)
        return rs[0][1]
    else:
        return "查无此人"


# 数据窗口采集
def datacGet():
    # 开启摄像头
    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:
            # 已经读取到视频,现在进行转换,然后放进image里面
            imType = cv2.imencode(".png", frame)[1].tobytes()
            window["video"].update(imType)
        if event == "识别":
            # 查找人脸库
            list_dir = os.listdir("D:\\HQYJ\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image")
            if len(list_dir) > 0:
                for i in list_dir:
                    # 读取一个图片对象
                    img = cv2.imread(f"D:\\HQYJ\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image\\{i}")
                    if img is None:
                        print("没有读取图片")
                        break
                    else:
                        # 获取已知图片的特征变量
                        en1 = face_recognition.face_encodings(img)[0]
                        # 获取需要检测图片的特征变量
                        en2 = face_recognition.face_encodings(frame)[0]
                        # 计算欧几里得距离
                        rs = np.linalg.norm(en1 - en2)
                        print(rs)
                        if rs < 0.4:
                            b = i.split(".")[0]
                            a = update(b)
                            sg.popup(f"用户{a},打卡成功")
                            break
                        else:
                            sg.popup("人脸库没有此人")

    # 资源释放
    cap.release()
    window.close()


if __name__ == '__main__':
    datacGet()

以上代码在不同的设备上使用,需要注意代码中路径的设置,以及检查是否安装了必需的第三方库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux grep命令详解(多图、多示例)

文章目录 grep基本说明grep参数简单示例列举参数-v(反选)-r -l -H -i(目录子目录、只打印匹配文件、输出文件名、忽略大小写)-c -n -o(匹配次数、输出行号、只打印匹配)-A -B -C(前后行) 正则表达式基本正则表达式与扩展正则表达式 grep示例附录:正则表达式基本字符特殊字符Per…

力扣:225 用队列实现栈

栈、队列 栈&#xff1a; 弹夹&#xff0c;后进先出 队列&#xff1a; 排队&#xff0c;先进先出 描述&#xff1a; var MyStack function () {// 定义两个数组&#xff0c;模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC&#xff08;Microsoft Founda…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程&#xff0c;越来越多的国企央企开始要求软件产品匹配过程化的要求&#xff0c; 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件&#xff0c; 于是开始了解国产中间件都有哪些厂家 一&#xff1a;国产中间件主要产品及厂商 1 东方通&…

基于Python的校园爱心帮扶管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大&#xff0c;会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时&#xff0c;有以下这些注意事项&#xff1a; 插入音乐&#xff1a; - 文件格式支持&#xff1a;Pygame常用的音乐格式如MP3、OGG等&#xff0c;但MP3可能需额外安装库&#xf…

A018基于Spring Boot的民宿租赁系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

​基于学习的地铁客流动态预测智能调度方法

1 文章信息 文章题为“A Learning Based Intelligent Train RegulationMethod With Dynamic Prediction forthe Metro Passenger Flow”&#xff0c;该文于2023年发表至“IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS”。文章的核心观点是提出了一种基于学习的智…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch&#xff1a;8.1.0 2、FileBeat&#xff1a;8.1.0 3、Kibana&#xff1a;8.1.0 4、logstach&#xff1a;8.1.0 本次统一版本&#xff1a;8.1.0,4个组件&#xff0c;划分目录&#xff0c;保持版本一致。 说明&#xff1a;elasticsearch和kib…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表&#xff0c;但是hbase是一个列式存储的表结构&#xff0c;与我们常用的mysql等关系型数据库的存储方式不同&#xff0c;mysql中的所有列的数据是按照行级别进行存储的&#xff0c;查询数据要整个一行查询出来&#xff0c;不想要的字段也需要…

论文速读:动态再训练-更新用于无源目标检测的Mean Teacher(ECCV2024)

原文标题&#xff1a;Dynamic Retraining-Updating Mean Teacher for Source-Free Object Detection 中文标题&#xff1a;动态再训练-更新用于无源目标检测的Mean Teacher 本篇文章为论文速读&#xff0c;以帮助大家快速了解大意&#xff0c;具体详解可以看这篇分享。ECCV2024…

科研绘图系列:R语言带有面积区域的折线图(linechart)

文章目录 介绍加载R包数据画图准备图1图2图3图4图5图6图7图8图9图10合并所有图形系统信息介绍 带有面积区域的折线图通常被称为面积图(Area Chart)。面积图结合了折线图和条形图的特点,通过在折线下方的区域填充颜色或纹理,来展示一个或多个组的数值如何随第二个变量(通常…

Golang--文件操作

1、文件 文件&#xff1a;文件用于保存数据&#xff0c;是数据源的一种 os包下的File结构体封装了对文件的操作&#xff08;记得包os包&#xff09; 2、File结构体--打开文件和关闭文件 2.1 打开文件 打开文件&#xff0c;用于读取&#xff08;函数&#xff09;&#xff1a; 传…

Ubuntu学习笔记 - Day3

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;vim简介vim键盘图工作模式 vim移动光标操作上下左右移动翻页 vim替换和删除操作替换删除 vim插入模式详解进入模式搜索 vim底行模式操作保存退出行号 学习目标&#xff1a; 一周掌握 Linux基本使用技巧 …

Java中的JDBC的详解

数据库驱动包 Java提出的一套关于数据库操作的接口 各个数据库厂商要把自己的api对接到/适配到jdbc上 程序员只需要掌握一套api就可以操作不同的数据库了 数据库厂商提供的这个原生api适配到jdbc转换程序&#xff0c;称为“数据库驱动包” 1&#xff09;创建数据源 //1,创…

Apache-Hive数据库使用学习

前期准备 Hadoop-分布式部署&#xff08;服务全部在线&#xff09; Mysql-node1节点部署&#xff08;确认安装正常&#xff09; apache-hive -node1节点部署&#xff08;需要与MySQL元数据联动存储&#xff09; 参考博客&#xff1a; Hadoop Hadoop集群搭建-完全分布式_hadoop完…

【极客兔兔-Web框架Gee详解】Day2 上下文Context

文章目录 一、框架结构二、设计上下文(Context):day2-context/gee/context.go1. 设计Context必要性1.1 接口粒度过细:1.2 缺乏扩展性:2. 代码3. 优势三、路由(Router): day2-context/gee/router.go四、框架入口:day2-context/gee/gee.go1. 代码五、框架使用: day2-context/m…

LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“…

DApp开发定制:合约设计与源码搭建支持快速上线

随着区块链技术的飞速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;已经成为区块链生态中不可或缺的一部分。DApp不仅改变了传统互联网应用的运作方式&#xff0c;还通过去中心化的理念和智能合约的支持&#xff0c;赋能了用户和开发者。无论是金融、游戏、社交、…

【C++】手动实现C++ vector容器:深入理解动态数组的工作原理

&#x1f4af;个人主页: 起名字真南 &#x1f4af;个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 实现思路3. vector 容器的代码实现4. 代码详解4.1 构造与析构函数4.2 容量管理4.3 迭代器与访问操作4.4 增删操作 5.测试代码6. 时间和空间复杂度分析7.…