目录
一、PySimpleGUI
1、布局和窗口
2、文本框组件
3、视频处理
4、图片处理
二、pymsql
1、数据库操作
2、数据采集
3、人脸识别
一、PySimpleGUI
PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助快速构建用户界面。
安装
pip install pysimplegui
1、布局和窗口
import PySimpleGUI as sg# 创建一个布局组件layout = [[sg.Button('关闭'), sg.Button('保存')]
]
# 创建窗口
window = sg.Window('第一个窗口', layout)while True:# 读取窗口信息,返回窗口的事件和数据event, value = window.read()# 点击X和退出按钮,关闭窗口if event in (None, '关闭'):# 提示sg.popup('已退出窗口')break# 资源释放
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 == '保存':# 获取编号id = value['id']name = value['name']print(f'id={id},name={name}')# 提示sg.popup(f'id={id},name={name}')window['msg'].update(f'id={id},name={name}')if event in (None, '关闭'):# 提示sg.popup('已退出窗口')break# 资源释放
window.close()
3、视频处理
import cv2
import PySimpleGUI as sgdef rendvideo():# 开启摄像头cap = cv2.VideoCapture('../video/1.mp4')if cap.isOpened() == False:print('没有开启摄像头')return# 创建layoutlayout = [[sg.Button('关闭')],[sg.Image(key='video')]]# 创建一个window对象# location 视频位置# size 视频大小window = sg.Window('视频处理', layout, location=(50, 50))while True:# 读取窗口信息,返回窗口的事件和数据event, value = window.read(timeout=10)# 读取数据帧ret, frame = cap.read()# None 表示未进行任何事件if event in (None, '关闭'):breakif ret:imgType = cv2.imencode('.png', frame)[1].tobytes()window['video'].update(imgType)# 释放资源cap.release()window.close()if __name__ == '__main__':rendvideo()
4、图片处理
import cv2
import PySimpleGUI as sgdef rendpicture():# 设置主题sg.theme('LightBlue')# 创建layoutlayout = [[sg.Text('选择一张图片:')],[sg.Button('关闭'), sg.Button('上传')],[sg.Input(key='-FILE-', enable_events=True),sg.FileBrowse(file_types=(('imageFiles', '*.png;*.jpg;*.jpeg;*.gif'),))],[sg.Image(key='-Image-')]]# 创建窗口window = sg.Window('文件处理', layout)while True:event, value = window.read()if event in (None, '关闭'):breakif event == '上传':# 图片路径不能用中文path = value['-FILE-']print(path)window['-Image-'].update(filename=path)# 释放资源window.close()if __name__ == '__main__':rendpicture()
二、pymsql
PyMySQL
是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集。
安装
pip install pymysql
1、数据库操作
import pymysql# 新增
def add(name, num):# 创建数据库连接con = pymysql.connect(host="localhost", # 数据库地址user="root", # 用户名passwd="1234", # 密码port=3306, # 端口database="demo91", # 数据库名charset="utf8" # 中文编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "insert into user_info (user_name,user_num) value (%s,%s)"# 运行sql(增删改查sql的函数)cur.execute(sql, (name, num))# 执行增删改sql的函数,返回一个受影响行数的数值num = cur.rowcountif num > 0:print("新增成功")else:print("新增失败")# 提交con.commit()# 释放资源cur.close()con.close()# 修改name
def update(name, id):# 创建数据库连接con = pymysql.connect(host="localhost", # 数据库地址user="root", # 用户名passwd="1234", # 密码port=3306, # 端口database="demo91", # 数据库名charset="utf8" # 中文编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "update user_info set user_name=%s where user_id=%s"# 运行sql(增删改查sql的函数)cur.execute(sql, (name, id))# 执行增删改sql的函数,返回一个受影响行数的数值num = cur.rowcountif num > 0:print("修改成功")else:print("修改失败")# 提交con.commit()# 释放资源cur.close()con.close()# 查询
def query(num):# 创建数据库连接con = pymysql.connect(host="localhost", # 数据库地址user="root", # 用户名passwd="1234", # 密码port=3306, # 端口database="demo91", # 数据库名charset="utf8" # 中文编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "select * from user_info where user_num=%s"# 运行sql(增删改查sql的函数)cur.execute(sql, (num,))# 查询rs = cur.fetchall()print(rs)cur.close()con.close()if len(rs) > 0:print(rs[0][1])return rs[0][1]else:return "无"# 删除
def delNum(id):# 创建数据库连接con = pymysql.connect(host="localhost", # 数据库地址user="root", # 用户名passwd="1234", # 密码port=3306, # 端口database="demo91", # 数据库名charset="utf8" # 中文编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "delete from user_info where user_id=%s"# 运行sql(增删改查sql的函数)cur.execute(sql, (id,))# 执行增删改sql的函数,返回一个受影响行数的数值num = cur.rowcountif num > 0:print("删除成功")else:print("删除失败")# 提交con.commit()# 释放资源cur.close()con.close()if __name__ == "__main__":# add("王五", 1)# add("李四", 1)# update("路人甲", 3)# query(10)delNum(1)
2、数据采集
import cv2
import pymysql
import PySimpleGUI as sg"""
脸信息记录新增
"""
def add(name, num):# 创建数据库连接con = pymysql.connect(host="localhost", # 数据库地址user="root", # 用户名passwd="1234", # 密码port=3306, # 端口database="demo91", # 数据库名charset="utf8" # 中文编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "insert into user_info (user_name,user_num) value (%s,%s)"# 运行sql(增删改查sql的函数)cur.execute(sql, (name, num))# 执行增删改sql的函数,返回一个受影响行数的数值num = cur.rowcount# 提交con.commit()# 释放资源cur.close()con.close()if num > 0:print("新增成功")return Trueelse:print("新增失败")return False"""
数据采集窗口
"""
def dataget():# 开启摄像头cap = cv2.VideoCapture('../video/1.mp4')if cap.isOpened() == False:print('没有开启摄像头')return# 创建layout布局layout = [[sg.Text("编号:"), sg.InputText(key='num')],[sg.Text("姓名:"), sg.InputText(key='name')],[sg.Image(key='video')],[sg.Button('关闭'), sg.Button('人脸采集')]
]# 创建一个window窗口window = sg.Window('人脸信息采集', layout)while True:# 读取窗口信息,返回窗口的事件和数据event, value = window.read(timeout=10)# 读取数据帧ret, frame = cap.read()# None 表示未进行任何事件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'E:\\images\\{num}.png', frame)if iss:isadd = add(name, num)if isadd:sg.popup('人脸采集成功!')else:sg.popup('人脸采集失败!')# 释放资源cap.release()window.close()if __name__ == '__main__':dataget()
3、人脸识别
import os
import cv2
import face_recognition
import pymysql
import numpy as np
import PySimpleGUI as sg"""
人脸信息记录查找
"""
# 查询
def query(num):# 创建数据库连接con = pymysql.connect(host="localhost", # 数据库地址user="root", # 用户名passwd="1234", # 密码port=3306, # 端口database="demo91", # 数据库名charset="utf8" # 中文编码)# 创建游标对象,包含了增删改查的函数cur = con.cursor()# 定义sqlsql = "select * from user_info where user_num=%s"# 运行sql(增删改查sql的函数)cur.execute(sql, (num,))# 查询rs = cur.fetchall()# print(rs)cur.close()con.close()if len(rs) > 0:# print(rs[0][1])return rs[0][1]else:return "查无此人""""
数据采集窗口
"""
def rendVideo():# 读取视频cap = cv2.VideoCapture('../video/1.mp4')if not cap.isOpened():print('没有读取到视频')return# 创建layout布局layout = [[sg.Image(key='video')],[sg.Button('关闭'), sg.Button('人脸识别')]]# 创建一个window窗口window = sg.Window('人脸信息识别', layout)while True:# 读取窗口信息,返回窗口的事件和数据event, value = window.read(timeout=10)# 读取数据帧ret, frame = cap.read()# None 表示未进行任何事件if event in (None, '关闭'):breakif ret:# 把数据帧对象转换成bytes数据类型,更新窗口对象window信息imgType = cv2.imencode('.png', frame)[1].tobytes()window['video'].update(imgType)if event == '人脸识别':# 查找人脸库list_dir = os.listdir("E:\\images")if len(list_dir) > 0:for i in list_dir:# 读取一个图片对象 获取人脸特征img = cv2.imread(f'E:\\images\\{i}')if img is None:print('没有读取到图片')breakelse:# 获取已知图片的特征变量en01 = face_recognition.face_encodings(img)[0]# 获取需要识别的图片的特征变量en02 = face_recognition.face_encodings(frame)[0]# 计算欧几里得距离re = np.linalg.norm(en01 - en02)if re < 0.45:num = i.split('.')[0]result = query(num)sg.popup(f'此人是{result}')breakelse:sg.popup('人脸库没有此人')# 释放资源cap.release()window.close()if __name__ == '__main__':rendVideo()