OpenCV基础05_GUI和PyMsql
目录
一、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 sg
def rendvideo():
# 开启摄像头
cap = cv2.VideoCapture('../video/1.mp4')
if cap.isOpened() == False:
print('没有开启摄像头')
return
# 创建layout
layout = [
[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, '关闭'):
break
if 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 sg
def rendpicture():
# 设置主题
sg.theme('LightBlue')
# 创建layout
layout = [
[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, '关闭'):
break
if 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()
# 定义sql
sql = "insert into user_info (user_name,user_num) value (%s,%s)"
# 运行sql(增删改查sql的函数)
cur.execute(sql, (name, num))
# 执行增删改sql的函数,返回一个受影响行数的数值
num = cur.rowcount
if 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()
# 定义sql
sql = "update user_info set user_name=%s where user_id=%s"
# 运行sql(增删改查sql的函数)
cur.execute(sql, (name, id))
# 执行增删改sql的函数,返回一个受影响行数的数值
num = cur.rowcount
if 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()
# 定义sql
sql = "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()
# 定义sql
sql = "delete from user_info where user_id=%s"
# 运行sql(增删改查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("王五", 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()
# 定义sql
sql = "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 True
else:
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, '关闭'):
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'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()
# 定义sql
sql = "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, '关闭'):
break
if 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('没有读取到图片')
break
else:
# 获取已知图片的特征变量
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}')
break
else:
sg.popup('人脸库没有此人')
# 释放资源
cap.release()
window.close()
if __name__ == '__main__':
rendVideo()