人工智能之人脸识别(人脸采集人脸识别)

文章目录

  • 前言
  • PySimpleGUI 库
  • 1-布局和窗口
    • 2 文本框组件
    • 3-视频处理
    • 图片处理
    • 数据库操作
    • 数据采集(重要部分)
    • 人脸识别(综合部分)


前言

例如:随着人工智能的不断发展,本文主要介绍关于人工智能中GUI和PyMysql相应用。
本文采用代码+逻辑思路分析的方式有助于理解代码。

PySimpleGUI 库

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

首先在要在电脑中下载mysql,然后针对于我们要下载的环境进入虚拟环境:
conda activate  “虚拟环境的位置" 
安装:
```python
pip install pysimplegui

进行安装

1-布局和窗口

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

代码讲解
这里导入PySimPleGUI库 ,并将其重命名为“sg”
通过sg.window创建一个window类的一个实例,实例被赋值给变量window,用于后续的操作,传入窗口标题和布局。
window.read()方法会阻塞程序,等待用户与窗口进行交互,并返回事件名称
这一段是一个无限循环,用于监听窗口中的事件(按钮点击)。而window.read()作为一个类方法,读取窗口中事件和值,会阻塞程序运行用户点击了按钮,然后返回事件名称和值。
这里着重提到
event
作为用户触发事件名称的按钮标签或者键名。如果用户关闭了窗口而没有触发任何特定事件,则event可能为none。
values字典: 包含了窗口中所有输入元素的值。字典的键通常是输入元素的键名,值则是用户输入的内容。
示例:如果你在布局中有一个输入框 sg.InputText(key=‘-NAME-’),用户在该输入框中输入了 “John”,那么 values 字典中将包含 {‘-NAME-’: ‘John’}。

在这里插入图片描述
遇到的问题:
此图调用会出现关闭窗口的问题,来单独说明一下
最开始if event =="关闭"会出现打印运行结果(关闭)的情况,但是却关闭出了窗口,会出现循环一直调用的情况,在这种情况下if event in (None,“关闭”),更符合我们平时对代码的实际运用,当用户点击了标签为 “关闭” 的按钮,或者用户通过其他方式(如点击窗口右上角的关闭按钮)关闭了窗口时,条件都会为真。

1、
在这里插入图片描述
2、
在这里插入图片描述
3
在这里插入图片描述
这是运行的过程和结果。

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()print(value)print(event)if event in (None,"关闭"):#提示print("你点了关闭按钮")# 提示sg.popup("你点击了关闭按钮")#跳出循环breakif event in ("保存",):#获取编号id = value["id"]name = value["name"]window["msg"].update(f"id:{id},name:{name}")#提示sg.popup(f"id:{id},name:{name}")
#资源释放,关闭窗口
window.close()

注意事项:
1、这里有我自己学习过程中的疑惑,对于sg.popup作为PySimpleGUI中的函数,用于显示一个弹出的窗口,如果不加入sg.popup也不会有太大的影响,但是对于用户真实使用中有确定的作用。
2、关于value的重要意义中的作用: 存储所有带有 key 属性的输入组件的当前值。字典的键是组件的 key,值是该组件的当前值。无法获取输入值:
你将无法获取用户在输入框中输入的值。
例如,如果你有一个输入框 sg.InputText(key=“id”),不写入 values 会导致你无法获取用户输入的编号。
无法更新动态组件:
你将无法更新带有 key 属性的动态组件,如 sg.Text。
例如,如果你有一个动态文本标签 `sg

3-视频处理

import PySimpleGUI as sg
import cv2
#开启摄像头
def demo():cap = cv2.VideoCapture(0)if cap.isOpened() ==False:print("没有开启摄像头")return#创建layoutlayout = [[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, "关闭"):breakif ret:imgType = cv2.imencode(".png", frame)[1].tobytes()window["video"].update(imgType)#释放资源3cap.release()window.close()
demo()

注意事项: 1、首先要明白要返回是在调用函数中,则查看是否开启摄像头的检查中采用“return”,则需要先对函数进行定义,def demo() 最后进行调用。
2、在最开始使用layout创建一个布局组件创建窗口时候运用的是排列组件,定义组件:layout 列表中包含了所有要在窗口中显示的组件(如按钮、输入框、文本标签等)。每个组件由 PySimpleGUI 提供的各种类(如 sg.Button, sg.InputText, sg.Text 等)实例化。排列组件:layout 列表中的每个子列表表示一行组件。每个子列表中的元素表示该行中的各个组件。通过这种方式,你可以灵活地安排组件的布局,使其符合你的用户界面设计需求。
3、在这里插入图片描述
单独对代码进行解释
cv2.imencode(“.png”, frame)
cv2.imencode: 这是 OpenCV 库中的一个函数,用于将图像数据编码为指定格式的字节流。
参数:
“.png”: 指定编码格式为 PNG。
frame: 这是一个 NumPy 数组,表示一帧图像数据。
返回值: cv2.imencode 返回一个元组 (retval, buffer),其中:
retval 是一个布尔值,表示编码是否成功。
buffer 是一个 NumPy 数组,包含编码后的图像数据。
2. [1]
[1]: 从 cv2.imencode 返回的元组中提取第二个元素,即编码后的图像数据(buffer)。
3. .tobytes()
.tobytes(): 将 NumPy 数组转换为字节流(bytes 类型)。这是 PySimpleGUI 更新图像时所需的格式。
4. window[“video”].update(imgType)
window[“video”]: 通过键值 “video” 访问窗口中的某个组件。假设你在布局中定义了一个带有 key=“video” 的图像组件。
.update(imgType): 更新该图像组件的内容,将其设置为 imgType,即编码后的图像字节流。

图片处理

主要对电脑中的图片进行传递,上传成功,在后期关于联动成一个完整项目有所帮助。

def demo():#创建layoutlayout = [[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,"关闭"):breakif event == "上传":#图片路径不能用中文path = value["-FILE-"]img = cv2.imread(path)imgType = cv2.imencode(".png", img)[1].tobytes()print(path)window["video"].update(imgType)window.close()demo()

运行结果:
在这里插入图片描述

在这里插入图片描述
需要提到的除了按照正常程序导入库,导入layout相关的布局组件、创建窗口、然后就是对功能的编辑、最后释放资源进行运行。 传入图片路径不要用中文命名否则会出现报错的故障。
在这里还要提到一个情况:
img = cv2.imread(path) imgType = cv2.imencode(".png", img)[1].tobytes()”如果在上传中即便图片设置的不为中文,出现报错的情况可以通过这个代码进行格式的更改。

数据库操作

首先运行代码:

conda activate "虚拟环境命名"

然后在虚拟环境安装

pip install PyMySQL

关于数据库操作的代码

import pymysql
#新增
def add(name,num):#创建数据库连接con = pymysql.connect(host = "localhost",#数据库地址user = "root",#用户名passwd = "你自己设置的密码",#密码port = 3306,#端口database = "your name",#数据库名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()#x修改
if __name__ == '__main__':add("张三",1)

这是基本的增加的代码,关于增删改查大体是一致的所以搞懂之间的逻辑才是最重要的。
在这里插入图片描述
在这里插入图片描述
首先我们应该更加注意到数据操作的几个大体逻辑顺序
1、导入import pymysql模块
2、创建数据库连接
3、获取游标对象
4、执行sql查询(增删改查)
5、获取查询结果
6、关闭游标和进行连接(指的是释放资源,因为定义了函数,所以还要加一个调用函数步骤)
需要注意的是在执行插入语句的时候,values中(%s)代表的是占位符,而values关键字用于指定到要插入到表中。

数据采集(重要部分)

关于之前的铺垫都是为了进行数据采集以及视频识别的综合功能的连接

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()#定义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(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,"关闭"):#终止循环breakif ret:imtType = cv2.imencode(".png",frame)[1].tobytes()window["video"].update(imtType)if event =="人脸采集":#获取编号和姓名num = value["num"]name = value["name"]#写入人脸图片iss = cv2.imwrite(f"C:\\Users\\LENOVO\\Desktop\\opencv\\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 query(num):#创建数据库连接con = pymysql.connect(host="localhost",#数据库地址user="root",#用户名passwd="123456",#密码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 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,"关闭"):#终止循环breakif ret:imtType = cv2.imencode(".png",frame)[1].tobytes()window["video"].update(imtType)if event =="人脸识别":#查找人脸库list_dir = os.listdir("C:\\Users\\LENOVO\\Desktop\\opencv\\faceImages")if len(list_dir)>0:for i in list_dir:print(i)#读取一个图片对象img = cv2.imread(f"C:\\Users\\LENOVO\\Desktop\\opencv\\faceImages\\{i}")if img is None:print("没有读取图片")breakelse:#获取已知图片的特征变量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.3:b = i.split(".")[0]a = query(b)sg.popup(f"用户{a}打卡成功")#查到此人,终止循环breakelse:sg.popup("人脸库没有此人")cap.release()window.close()
if __name__ == "__main__":dataGet()

if len(rs) > 0:
print(rs[0][1])
return rs[0][1] 这里提到了之前的python基础中索引知识
这里就是对之前的知识的综合理解,在实际操作中,需要注意拍照的光线、被识别人的表情,可能会造成对识别的误差,当然通过摄像头识别到人脸传入到指定相册,通过识别与指定相册相匹配数据传入数据库,进行识别达到人脸识别的目的。

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

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

相关文章

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…

【JAVA】java 企业微信信息推送

前言 JAVA中 将信息 推送到企业微信 // 企微消息推送messageprivate String getMessage(String name, String problemType, String pushResults, Long orderId,java.util.Date submitTime, java.util.Date payTime) {String message "对接方&#xff1a;<font color\…

AI代币是什么?AI与Web3结合的未来方向在哪里?

近两年随着人工智能的崛起&#xff0c;AI已经渗透到制造业、电商、广告、医药等各个行业&#xff0c;加密货币领域也不例外&#xff0c;人工智能与区块链的融合&#xff0c;让我们看到了独特的数字资产 — AI加密代币。 它的流行始于2022年底&#xff0c;随着OpenAI智能聊天机…

MySQL数据库中的视图

视图 ​ 本篇将开始介绍有关数据库中视图的相关知识点&#xff0c;其中主要包含视图的基本使用&#xff0c;视图规则和限制。 ​ 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据&#xff0c;视图的数据变化会…

Linux基础(八):EXT与XFS文件系统简介

磁盘与文件系统管理 1.文件系统与分区2. inode、block和superblock3.EXT2的文件系统3.1 data block3.2 inode Table3.2.1 inode记录的内容3.2.2 inode特点 3.3 Superblock3.4 Filesystem Description(文件系统描述说明)3.5 block bitmap &#xff08; 区块对照表&#xff09;3.…

clion远程配置docker ros2

CLION与docker中的ROS2环境构建远程连接 设备前提开启SSH服务CLION配置CLION配置CLION IDE远程连接过程实现CLION SSH 远程部署 开启fastlio2debug之旅 设备前提 本地宿主机&#xff1a;UBUNTU 20.04 docker container:ros2_container (内置环境ROS2 humble) 通过之前的tcp连接…

Midjourney从入门到精通教程,10分钟让你从小白变大神!【珍藏版】

前言&#xff1a; 《Midjourney使用教程&#xff1a;从入门到精通》旨在带领你一步步掌握这款强大的AI创作工具。无论你是设计小白还是有一定基础的创作者&#xff0c;本教程都将为你揭开Midjourney的神秘面纱。从基本操作到高级技巧&#xff0c;我们将逐一解析&#xff0c;让…

JAVA开源项目 网上租赁系统 计算机毕业设计

本文项目编号 T 050 &#xff0c;文末自助获取源码 \color{red}{T050&#xff0c;文末自助获取源码} T050&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计5.4.1 用…

面试经典 150 题:189、383

189. 轮转数组 【参考代码】 class Solution { public:void rotate(vector<int>& nums, int k) {int size nums.size();if(1 size){return;}vector<int> temp(size);//k k % size;for(int i0; i<size; i){temp[(i k) % size] nums[i];}nums temp; }…

基于MATLAB的混沌序列图像加密程序

设计目的 图像信息生动形象&#xff0c;它已成为人类表达信息的重要手段之一&#xff0c;网络上的图像数据很多是要求发送方和接受都要进行加密通信&#xff0c;信息的安全与保密显得尤为重要&#xff0c;因此我想运用异或运算将数据进行隐藏&#xff0c;连续使用同一数据对图…

史上最大应用层DDoS攻击 H2 Rapid Reset攻击研究

前言 2023年10月Cloudflare、Google、AWS等厂商公布了一种利用HTTP/2快速重置进行应用层DDoS攻击的0day漏洞(CVE-2023-44487)[1][2]&#xff0c;即H2 Rapid Reset DDoS。Google宣传其监控到此种攻击峰值超过每秒3.98亿个请求&#xff0c;打破互联网历史最大应用层DDoS攻击记录…

Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化

Python Matplotlib 在 Web 环境中的可视化 数据可视化是数据科学和分析中一个至关重要的部分&#xff0c;它能帮助我们更好地理解和解释数据。在现代应用中&#xff0c;越来越多的开发者希望能够将数据可视化结果展示在网页上。Matplotlib 是 Python 中最常用的数据可视化库之…

JavaWeb项目-----博客系统

一.设计数据库 1.创建数据库 create database if not exists java108_blog_system character set utf8; drop table if exists user; drop table if exists blog;2.创建博客列表 create table blog(blogId int primary key auto_increment,title varchar(20),content varcha…

算法练习——双指针

前言&#xff1a;大佬写博客给别人看&#xff0c;菜鸟写博客给自己看&#xff0c;我是菜鸟。 学前须知&#xff08;对自己&#xff09;&#xff1a;这里的指针不一定指地址&#xff01;也可能是数组下标。 1&#xff1a;移动零(双指针) 题目要求&#xff1a; 解题思路&#x…

vue3实现一个无缝衔接、滚动平滑的列表自动滚屏效果,支持鼠标移入停止移出滚动

文章目录 前言一、滚动元素相关属性回顾一、实现分析二、代码实现示例&#xff1a;2、继续添加功能&#xff0c;增加鼠标移入停止滚动、移出继续滚动效果2、继续完善 前言 列表自动滚屏效果常见于大屏开发场景中&#xff0c;本文将讲解用vue3实现一个无缝衔接、滚动平滑的列表自…

vscode翻译插件

vscode翻译插件 需求 &#xff1a; 在编写代码的时候&#xff0c; 打印或者定义变量的时候总是想不起来英文名称&#xff0c; 所有就开发了一款中文转换为英文的插件。 功能 1、目前支持选中中文&#xff0c;右键选择打印或者变量进行转换。 2、目前支持选中中文&#xff0…

Linux -- 初识线程

目录 线程的初步认识 为什么需要线程 怎么让代码分成多个执行流并发执行呢&#xff1f; 管理线程 线程的初步认识 线程是进程内部的一个执行分支&#xff0c;线程是CPU调度的基本单位。 在Linux操作系统中&#xff0c;线程是程序执行流的最小单位。一个进程可以包含多个线…

基于IM场景下的Wasm初探:提升Web应用性能|得物技术

一、何为Wasm &#xff1f; Wasm&#xff0c;全称 WebAssembly&#xff0c;官网描述是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm被设计为一个可移植的目标&#xff0c;用于编译C/C/Rust等高级语言&#xff0c;支持在Web上部署客户端和服务器应用程序。 Wasm 的开发者参…

Linux SSH免密登入以及配置脚本

一、ssh原理简单介绍 客户端生成一对公钥和私钥&#xff0c;并将自己的公钥发送到服务器上 其中公钥用来加密&#xff0c;私钥用来解密。 二、ssh免密登入实现步骤详解 我这就以服务器controller和客户端compute来做为例子 2.1、首先在controller上输入ssh-keygen -t rsa …

Flutter 获取照片权限的时候是否要获取存储权限?

获取存储权限 Permission.storage.request(); 获取照片权限通常意味着访问相册&#xff0c;而访问相册可能还需要外部存储权限&#xff0c;因为照片通常存储在设备的外部存储中。所以&#xff0c;当你请求照片权限时&#xff0c;你也需要检查并请求外部存储权限。 是不是所有…