自学内容网 自学内容网

opencv-day5-基于guI和pymsql进行的人脸识别案例

PySimpleGUI 库

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

安装

pip install pysimplegui

pip install PySimpleGUI==4.60.5

#5.0之后的版本收费,如果要卸载当前的版本用:pip uninstall pysimplegui

布局和窗口

import PySimpleGUI as sg
​
# 定义布局
layout = [
    [sg.Text('你好')],
    [sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('我的窗口', layout)
# 事件循环
while True:
    event, values = window.read()
    # 点击X和退出按钮,关闭窗口
    if event in (None, "关闭"):
        break
# 关闭窗口
window.close()

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("你点了关闭按钮")
    #     # 提示
    if event == "关闭":
        print("你点了关闭按钮")
         # 提示
        sg.popup("你点了关闭按钮")
        break
    if event in("人脸采集",):
        print("你点了人脸采集按钮")
        #提示
        sg.popup("你点了人脸采集按钮")
#资源释放,关闭窗口
window.close()

文本输入输出案例

import PySimpleGUI as sg
​
# 定义布局
layout = [
    [sg.Text("编号:", size=(10, 1)), sg.InputText()],
    [sg.Text(key="text")],
    [sg.Button('保存'),sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('我的窗口', layout)
# 事件循环
while True:
    event, values = window.read()
    # 获取编号
    id = values[0]
    if event == '保存':
        print(f'id={id}')
        sg.popup(f'id={id}')
        # 更新文本
        window['text'].update('新的文本内容')
    if event == sg.WIN_CLOSED or event == '关闭':
        break
# 关闭窗口
window.close()
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()
    #value是信息,event是事件
    # if event in(None,"关闭"):
    #     print("你点了关闭按钮")
    #     sg.popup("你点了关闭按钮")
    #     # 提示
    if event == "关闭":
        # print("你点了关闭按钮")
            # 提示
        sg.popup("你点了关闭按钮")
        break
    if event in("保存",):
        #获取编号
        id=value["id"]
        name=value["name"]
        window["msg"].update(f"id:{id},姓名:{name}")
        #提示
        print(f"id:{id},姓名:{name}")
        sg.popup(f"id:{id},姓名:{name}")
​
        #print("你点了人脸采集按钮")
​
​
#资源释放,关闭窗口
window.close()

视频处理

import PySimpleGUI as sg
import cv2
​
def rendVideo():
    # 读取视频
    cap = cv2.VideoCapture(0)
    #界面布局
    layout =[
        [
            sg.Button("退出", size=(10, 1))
        ],
        [sg.Image(key='image')],
    ]
    #创建一个window对象
    #location 视频位置
    #size 视频大小
    window =sg.Window("视频播放",layout,location=(350,50),size=(800,500))
    # 开始人脸录入
    while  cap.isOpened():
        event, values = window.read(timeout=10)
        ret,frame = cap.read()
        if ret:
            #把数据帧对象转换成bytes数据类型,更新窗口对象window信息
            imgbyts = cv2.imencode('.png', frame)[1].tobytes()
            window['image'].update(data=imgbyts)
        #点击X和退出按钮,关闭窗口
        if event in (None,"退出"):
            break
    #关闭窗口
    window.close()
    cap.release()
if __name__ =="__main__":
    rendVideo()
import cv2
import PySimpleGUI as sg
#开启摄像头
def demo():
    cap = cv2.VideoCapture(0)
    if cap.isOpened() == False:
        print("没有开启摄像头")
        return
    #创建layout
    layout=[
        [sg.Button("关闭"), sg.Button("保存")],
        [sg.Image(key="video")]
​
    ]
    #创建窗口
    window=sg.Window("视频处理",layout)
    while True:
        # 读取数据和事件
        event,value=window.read(timeout=10)
        #读取数据帧
        ret,frame=cap.read()
        #print(event)
        #事件执行的逻辑先后顺序,点×表示没有任何事件
        if event in(None,"关闭"):
            break
        if ret:
​
            imgType=cv2.imencode(".png",frame)[1].tobytes()
            print(imgType)
            window["video"].update(imgType)
​
    #释放资源
    cap.release()
    window.close()
​
demo()

图片上传

import PySimpleGUI as sg
​
def main():
    # 设置主题
    sg.theme('LightBlue')
    # 布局定义
    layout = [
        [sg.Text('请选择一张图片:')],
        [sg.Input(key='-FILE-', enable_events=True), sg.FileBrowse(file_types=(("Image Files", "*.png;*.jpg;*.jpeg;*.gif"),))],
        [sg.Button('退出')],
        [sg.Image(key='-IMAGE-')]
    ]
    # 创建窗口
    window = sg.Window('图片上传示例', layout)
    while True:
        event, values = window.read()
        # 处理事件
        if event in (sg.WINDOW_CLOSED, '退出'):
            break
        elif event == '-FILE-':
            # 更新图片
            image_path = values['-FILE-']
            print(image_path)
            if image_path:
                window['-IMAGE-'].update(filename=image_path)
​
    window.close()
if __name__ == '__main__':
    main()
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", passwd="1234", database="demo01", charset="utf8");
    # 创建游标
    cr = con.cursor();
    # 定义一个sql语句变量
    sql = "insert into user_info (user_name,num) values(%s,%s)";
    # 执行sql
    cr.execute(sql,(name,num))
    # 执行返回的插入数量
    num = cr.rowcount;
    if num > 0:
        print("插入成功");
    else:
        print("插入失败");
    # 提交操作
    con.commit();
    # 关闭连接
    con.close();

数据查询

import PySimpleGUI as sg
import cv2
import pymysql
import os
import face_recognition
import numpy as np
#查询人脸库
def query(id):
    # 创建数据库连接
    con = pymysql.Connect(host="localhost", user="root", passwd="1234", database="demo01", charset="utf8");
    # 创建游标
    cr = con.cursor();
    # 定义一个sql语句变量
    sql = "select * from user_info where num = %s ";
    # 执行sql
    cr.execute(sql,id)
    # 执行返回的插入数量
    num = cr.fetchall()
    print(num)
    if len(num) > 0:
        return num[0][1]
    else:
        return "无"
    # 提交操作
    con.commit();
    # 关闭连接
    con.close();
#数据库增删改查操作
​​​​​​​import pymysql
#新增
def add(name,num):
    # 创建数据库连接
    con=pymysql.connect(
        host="localhost",#数据库地址
        user="root",#用户名
        passwd="123456",#密码
        port=3306,#端口
        database="demo91",#数据库名
        charset="utf8"#中文编码
     )
    #创建游标对象,包含了增删改查的函数
    cur=con.cursor()
    #定义sql
    sql="insert into user_info(user_name,user_num) value(%s,%s)"
    #
    #sql = "update  user_info set user_name=%s where user_id=%s)"
    #运行sql(增删改查sql的函数)
    cur.execute(sql, (name,num))
    #执行增删改sql的函数,返回一个受影响行数的数值,=0表示执行失败
    num=cur.rowcount
    if num>0:
        print("新增成功")
    else:
        print("新增失败")
    #提交
    con.commit()
    #释放资源
    cur.close()
    con.close()
​
def update(name,id):
    # 创建数据库连接
    con = pymysql.connect(
        host="localhost",  # 数据库地址
        user="root",  # 用户名
        passwd="123456",  # 密码
        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的函数,返回一个受影响行数的数值,=0表示执行失败
    num = cur.rowcount
    if num > 0:
        print("更新成功")
    else:
        print("更新失败")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()
​
def select(num):
    # 创建数据库连接
    con = pymysql.connect(
        host="localhost",  # 数据库地址
        user="root",  # 用户名
        passwd="123456",  # 密码
        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,))
    # 执行查询sql的函数
    rs=cur.fetchall()
    print(rs)
    # 释放资源
    cur.close()
    con.close()
​
    if len(rs)>0:
        print(rs[0][1])
        return rs[0][1]
    else:
        return print("查无此人")
​
​
def delNum(id):
    # 创建数据库连接
    con = pymysql.connect(
        host="localhost",  # 数据库地址
        user="root",  # 用户名
        passwd="123456",  # 密码
        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的函数,返回一个受影响行数的数值,=0表示执行失败
    num = cur.rowcount
    if num > 0:
        print("删除成功")
    else:
        print("删除失败")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()
​
if __name__=="__main__":
    #add("王五",1)
    #update("李四",2)
    select(5)
    #delNum(10)
 

人脸采集

1 准备工作:创建人脸表

安装mysql和navicat,用navicat连接mysql使用

具体安装可以参考:Windows系统下mysql安装过程及以管理员身份运行cmd命令行问题合集_以管理员运行mysqld --no-defaults --initialize-insecure-CSDN博客

注意创建用户表时要勾选utf8#中文

2 完成人脸保存

import PySimpleGUI as sg
import cv2
import pymysql
​
#添加人脸信息到数据库中
def add(name,num):
    # 创建数据库连接
    con = pymysql.Connect(host="localhost", user="root", passwd="1234", database="demo01", charset="utf8");
    # 创建游标
    cr = con.cursor();
    # 定义一个sql语句变量
    sql = "insert into user_info (user_name,num) values(%s,%s)";
    # 执行sql
    cr.execute(sql,(name,num))
    # 执行返回的插入数量
    num = cr.rowcount;
    if num > 0:
        print("插入成功");
    else:
        print("插入失败");
​
    # 提交操作
    con.commit();
    # 关闭连接
    con.close();
​
​
def rendVideo():
    # 读取视频
    cap = cv2.VideoCapture(0)
    #界面布局
    layout =[
        [sg.Text("编号:", size=(10, 1)), sg.InputText()],
        [sg.Text("姓名:", size=(10, 1)), sg.InputText()],
        [sg.Button("人脸采集", size=(10, 1)),sg.Button("退出", size=(10, 1))],
        [sg.Image(key='image')],
    ]
    window =sg.Window("视频播放",layout,location=(350,50),size=(800,500))
​
    # 开始人脸录入
    while  cap.isOpened():
        event, values = window.read(timeout=10)
        ret,frame = cap.read()
        if ret:
            #把数据帧对象转换成bytes数据类型,更新窗口对象window信息
            imgbyts = cv2.imencode('.png', frame)[1].tobytes()
            window['image'].update(data=imgbyts)
        #点击X和退出按钮,关闭窗口
        if event in (None,"退出"):
            break
        if event in (None,"人脸采集"):
            # 获取编号
            id = values[0]
            name = values[1]
            print(id,name)
            # 保存人脸
            iss = cv2.imwrite(f"D:\\faceImages\\{id}.png", frame)
            if iss == True:
                add(name,id)
                print("收集人脸成功")
            else:
                print("收集人脸失败")
    #关闭窗口
    window.close()
    cap.release()
if __name__ =="__main__":
    rendVideo()

人脸识别

import PySimpleGUI as sg
import cv2
import pymysql
import os
import face_recognition
import numpy as np
#查询人脸库
def query(id):
    # 创建数据库连接
    con = pymysql.Connect(host="localhost", user="root", passwd="1234", database="demo01", charset="utf8");
    # 创建游标
    cr = con.cursor();
    # 定义一个sql语句变量
    sql = "select * from user_info where num = %s ";
    # 执行sql
    cr.execute(sql,id)
    # 执行查询
    num = cr.fetchall()
    print(num)
    if len(num) > 0:
        return num[0][1]
    else:
        return "无"
    # 提交操作
    con.commit();
    # 关闭连接
    con.close();
​
​
def rendVideo():
    # 读取视频
    cap = cv2.VideoCapture(0)
    #界面布局
    layout =[
        [sg.Button("人脸识别", size=(10, 1)),sg.Button("退出", size=(10, 1))],
        [sg.Image(key='image')],
    ]
    window =sg.Window("视频播放",layout,location=(350,50),size=(800,500))
​
    # 开始人脸录入
    while  cap.isOpened():
        event, values = window.read(timeout=10)
        ret,frame = cap.read()
        if ret:
            #把数据帧对象转换成bytes数据类型,更新窗口对象window信息
            imgbyts = cv2.imencode('.png', frame)[1].tobytes()
            window['image'].update(data=imgbyts)
        #点击X和退出按钮,关闭窗口
        if event in (None,"退出"):
            break
        if event in (None,"人脸识别"):
            path = os.listdir("D:\\faceImages")
            #print(path)
            for i in path:
                # 获取人脸特征
                img = cv2.imread(f"D:\\faceImages\\{i}")
                en1 = face_recognition.face_encodings(img)[0]
                en2 = face_recognition.face_encodings(frame)[0]
                iss = np.linalg.norm(en1 - en2)
                #print(iss)
                num = i.split(".")[0]
               # print(num)
                if iss < 0.5:
                    rs = query(num)
                    sg.popup(f"此人是{rs}")
                    break
                else:
                    sg.popup(f"查无此人")
​
    #关闭窗口
    window.close()
    cap.release()
if __name__ =="__main__":
    rendVideo()
#数据采集
import pymysql
import PySimpleGUI as sg
import cv2
#人脸信息用户记录
def add(name,num):
    # 创建数据库连接
    con=pymysql.connect(
        host="localhost",#数据库地址
        user="root",#用户名
        passwd="123456",#密码
        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的函数,返回一个受影响行数的数值,=0表示执行失败
    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 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:
            imtType=cv2.imencode(".png",frame)[1].tobytes()
            window["video"].update(imtType)
        if event=="人脸采集":
            #获取编号和姓名
            num=value["num"]
            name=value["name"]
            # 写入人脸图片
            iss=cv2.imwrite(f"D:\\faceImages\\{num}.png",frame)
            if iss:
                isAdd=add(name,num)
                if isAdd:
                    sg.popup("人脸采集成功")
            else:
                sg.popup("人脸采集失败")
​
    cap.release()
    window.close()
​
if __name__=="__main__":
    dataGet()
#人脸识别
import pymysql
import PySimpleGUI as sg
import cv2
import face_recognition
import os
import numpy as np
#人脸信息用户记录
def select(num):
    # 创建数据库连接
    con = pymysql.connect(
        host="localhost",  # 数据库地址
        user="root",  # 用户名
        passwd="123456",  # 密码
        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,))
    # 执行查询sql的函数
    rs=cur.fetchall()
    print(rs)
    # 释放资源
    cur.close()
    con.close()
​
    if len(rs)>0:
        print(rs[0][1])
        return rs[0][1]
    else:
        return print("查无此人")
#人脸识别窗口
def dataGet():
    # 开启摄像头
    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:
            imtType=cv2.imencode(".png",frame)[1].tobytes()
            window["video"].update(imtType)
        if event=="人脸识别":
            # 查找人脸库
            list_dir=os.listdir("D:\\faceImages")
            if len(list_dir)>0:
                for i in list_dir:
                    # 读取一个图片对象
                    img=cv2.imread(f"D:\\faceImages\\{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.5:
                            b=i.split(".")[0]
                            a=select(b)
                            sg.popup(f"用户{a}打卡成功")
                            #查到此人,终止循环
                            break
                        else:
                            sg.popup("人脸库没有此人")
                            #这里如果图片库里有多个图片,会逐一进行比对并弹框人脸库没有此人,需要修改
​
    cap.release()
    window.close()
​
if __name__=="__main__":
    dataGet()


原文地址:https://blog.csdn.net/keep_keeprogress/article/details/143578598

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!