OpenCV基础05_GUI和PyMsql
目录
一、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()
原文地址:https://blog.csdn.net/l15202833159/article/details/143578080
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!