【保姆级教程】基于OpenCV+Python的人脸识别上课签到系统
【保姆级教程】基于OpenCV+Python的人脸识别上课签到系统
- 一、软件安装及环境配置
- 1. 安装IDE:PyCharm
- 2. 搭建Python的环境
- 3. 新建项目、安装插件、库
- 二、源文件编写
- 1. 采集人脸.py
- 2. 训练模型.py
- 3. 生成表格.py
- 4. 识别签到.py
- 5. 创建图形界面.py
- 三、相关函数分析
- 1.采集人脸
- 2.训练模型
- 3.识别签到
- 4.创建图形界面
一、软件安装及环境配置
1. 安装IDE:PyCharm
-
进入PyCharm官网:https://www.jetbrains.com/pycharm/ ,点击Download.
-
选择系统版本windows,选择Community版本(因为免费),点击Downlad。
-
下载完成后双击开始安装,点击Next.
-
选择合适路径(建议除了C以外的其他盘),点击Next。
-
勾选所有选项,点击Next.
-
点击Install,选择JetBrains.
-
等待安装结束,Rboot now或 I want manually reboot later随便选一个即可,点击finish.
-
双击打开Pycharm,首次打开会出现如下弹窗,勾选方框,点击Continue。勾选Don’t send
至此pyCharm软件安装完毕.
2. 搭建Python的环境
-
打开Python官方网站:https://www.Python.org,点击Downlads.
-
进入Python下载界面,选择Windows.
-
选择下面红框框住的版本:Download Windows x86-64 executable installer
这可能会下载的非常慢,推荐Internat Download Manager下载器(简称IDM),可以加速外网资源的下载,几个线程同时下载提高下载速度(官方说的最多五倍,个人觉得不止),官方地址https://www.internetdownloadmanager.com/download.html.
鼠标移到安装包上,按右键复制地址,打开IDM后,新建任务,把下载资源地址复制进去即可.
-
下载完成后,双击Python-3.6.5rc1-amd64文件进行安装,切记在选项Add Python 3.6 to PATH的框中打钩,然后点击Install Now进入下一步.
注:安装时一定要自定义安装解释器,因为后续库的安装地址同解释器的安装位置。项目小还好,项目大会把C盘“撑爆”. -
耐心等待,安装完成后会弹出一个界面,点击close.
-
检查Python环境是否搭建成功,在Windows窗口中按 win+R,打开命令窗口,输入cmd,点击“确定”按钮,在新弹出的命令窗口中输入“Python” (或“py”)回车,显示如下界面说明安装成功。
3. 新建项目、安装插件、库
- 打开pyCharm,点击新建项目,为新项目命名并选择路径,点击Create.
- 安装中文插件,在搜索框中输入Chinese,安装中文简体语言包.
安装成功后,点击Restart IDE重启软件,即可换为中文模式. - 安装项目所需要的库,本项目用到的第三方库:opencv-python、opencv-contrib-python、pillow、
numpy、tk、xlrd、xlwt、xlutils、DateTime。
由于外网网速原因,大概率会面临安装失败的问题,此时可以采用国内镜像源,利用pip加速安装.
以opencv-python库为例,打开终端,输入下述命令:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
终端pip安装完后,再打开python解释器安装软件包,速度快如飞雷神.
其余库安装流程类似,此处不做演示.
二、源文件编写
整体架构:
注意:把代码中涉及到的路径换为自己电脑下,否则编译器找不见报错
1. 采集人脸.py
演示:学号为:1111111111;姓名为:iu
首先,下载haarcascade_frontalface_default.xml,并把该xml文件移动到该项目下。下载地址https://gitcode.com/opencv/opencv/tree/master/data/haarcascades?utm_source=csdn_github_accelerator&isLogin=1
import cv2
import os# 定义变量
classifier = cv2.CascadeClassifier(r'D:\hello_world\pythonProject\haarcascade_frontalface_default.xml')
font = cv2.FONT_HERSHEY_SIMPLEX
stu_id = input('请输入你的学号: \n')
stu_name = input('请输入你的姓名: \n')
count = 0# 建立人脸数据文件夹
if not os.path.exists('data'):os.mkdir('data')# 打开摄像头
capture = cv2.VideoCapture(0)while capture.isOpened():kk = cv2.waitKey(1)_,farme = capture.read()gray = cv2.cvtColor(farme, cv2.COLOR_BGR2GRAY)faces = classifier.detectMultiScale(gray, 1.2, 5)if len(faces) != 0:for x, y, w, h in faces:cv2.rectangle(farme, (x, y), (x + w, y + h), (200, 0, 250), 2)# center = (x + w // 2, y + h // 2)# r = w // 2# cv2.circle(farme, center, r, (0, 250, 0), 2)cv2.putText(farme, 'Press "s" to save' , (x + w, y + h), font, 1, (200, 0, 250), 2)if kk == ord('s'):cv2.imwrite('data/'+str(stu_name)+'.'+str(stu_id)+'.'+str(count)+'.jpg', gray[y:y+h,x:x+w])count += 1print('采集了'+str(count)+'张图片。')cv2.putText(farme, 'Press "q" to quit', (30, 60), font, 1, (200, 0, 250), 2)cv2.imshow('Picture from capture',farme)if kk == ord('q'):print('共采集了学号为'+str(stu_id)+'姓名为'+str(stu_name)+'的同学的'+str(count)+'张图片')break# 释放摄像头
capture.release()
cv2.destroyAllWindows()
操作流程:右键运行’采集人脸’,输入自己的ID号(笔者是10位学号),输入姓名首字母(例:张三,输入zs),Enter。按s保存采集到的图像,一般采集20张,按q退出(注意:按s和q时必须切换至英文输入法模式)
2. 训练模型.py
import cv2
import numpy as np
from PIL import Image
import oscreate = cv2.face.LBPHFaceRecognizer_create()def data_translate(path):face_data = []id_data = []file_list = [os.path.join(path, f) for f in os.listdir(path)]# print(file_list)# print(len(file_list))for file in file_list:PIL_image = Image.open(file).convert('L')np_image = np.array(PIL_image, "uint8")# print(file)# print(file.split('.'))# print(file.split('.')[1])id = int(file.split('.')[1])# print(file.split('.')[0])face_data.append(np_image)id_data.append(id)return face_data, id_dataprint('开始训练模型')# data_translate(r'data\data')
Faces,Ids = data_translate(r'D:\hello_world\pythonProject\data')create.train(Faces,np.array((Ids)))create.save('trainer.yml')
print('模型保存成功')
操作流程:右键运行’训练模型’,运行成功后,会生成一个trainer.yml文件.
3. 生成表格.py
# 引入库
import xlrd
import xlwt
from xlutils.copy import copy# 创建工作簿
nwb = xlwt.Workbook()cjb = nwb.add_sheet('成绩表')
cjb.write_merge(0, 0, 0, 3, '成绩表')
a = ['序号', '学号', '姓名', '成绩', '签名', '签到时间']
for i in range(6):cjb.write(1, i, a[i])
name = ["iu", "张三", "李四", "王五"]
id = ['1111111111', '2020001111', '2020002222', '2020003333']
b = 0
for a in range(2, 6):# 写入学号cjb.write(a, 1, id[b])# 写入姓名cjb.write(a, 2, name[b])cjb.write(a, 0, b+1)b = b+1
# 保存文件
nwb.save('人脸识别excel.xls')
操作流程:右键运行’生成表格’,可根据自己需求增加name和id个数.
4. 识别签到.py
# 导入库
import cv2
import time
import xlrd
import xlwt
from xlutils.copy import copy
from datetime import datetime# 创建签名子函数
def sign_in(idx, name):style0 =xlwt.easyxf('font:height 300,bold on,color_index black', num_format_str= 'MM:DD HH:MM')style1 = xlwt.easyxf('font:height 300,bold on,color_index blue', num_format_str ='MM:DD HH:MM')wb = xlrd.open_workbook('人脸识别excel.xls')nwb = copy(wb)nbs=nwb.get_sheet(0)# 签名nbs.write(idx, 3, name, style1)# 签时间nbs.write(idx, 4, datetime.now(), style0)nbs.col(4).width=256*20nwb.save('人脸识别excel.xls')# 加载模型
classfier = cv2.CascadeClassifier('D:\hello_world\pythonProject\haarcascade_frontalface_default.xml')
create = cv2.face_LBPHFaceRecognizer.create()
create.read('trainer.yml')# 定义变量
font = cv2.FONT_ITALIC
starttime = time.time()
ID = ('UNKNOW')
name = ('UNKNOW')
count = 0# 从表格中获取学号、姓名,与识别结果比对
workbook = xlrd.open_workbook('人脸识别excel.xls')
worksheet = workbook.sheet_by_index(0)
stu_id = worksheet.col_values(1)
stu_name = worksheet.col_values(2)
print(stu_id)
print(stu_name)# 打开摄像头
capture = cv2.VideoCapture(0)
while capture.isOpened():kk = cv2.waitKey(1)_, farme = capture.read()gray = cv2.cvtColor(farme, cv2.COLOR_BGR2GRAY)faces = classfier.detectMultiScale(gray,1.2,5)if len(faces) != 0:for x, y, w, h in faces:cv2.rectangle(farme, (x,y), (x+w, y+h), (180, 120, 220), 2)gray1 = gray[y:y+h, x:x+w]label, conf = create.predict(gray1)print(label, conf)if conf < 50:index = [list for list, i in enumerate(stu_id)if i==str(label)]print(index)ID = (str(label))name = stu_name[index[0]]print(ID, name)count = count + 1else:ID = ('UNKOWN')cv2.putText(farme, str(ID), (x+w//2-50, y+h+30), font, 1.2, (200, 0, 250), 2)cv2.putText(farme, 'Press "q" to quit', (30, 60), font, 1.2, (200, 0, 250), 2)cv2.imshow('picture from capture.', farme)if kk == ord('q'):breakif count > 30:sign_in(index[0], name)print('学号为:'+str(label)+',姓名为:'+str(name))breakif time.time()-starttime>30:print('超时未识别')break# 关闭所有窗口,释放摄像头
capture.release()
cv2.destroyAllWindows()
操作流程:右键运行’识别人脸’,运行成功后,打开人脸识别签到表.xls查看签到信息.
5. 创建图形界面.py
把上述功能做一个GUI界面,集成显示.
# 导入库
import tkinter as tk
import os
from PIL import Image, ImageTk#创建采集人脸子函数
def CJRL():os.system('python 采集人脸.py')#创建训练模型子函数
def XL():os.system('python 训练模型.py')#创建识别签到子函数
def SBQD():os.system('python 识别签到.py')#创建签到表
def QDB():os.startfile('人脸识别excel.xls')#关闭窗口
def GB():win.destroy()# 创建窗口
win = tk.Tk()
win.title('人脸识别签到系统')
win.geometry('310x500+800+50')
win.configure(bg='#FF8247')
# tk.Label(win, text="自动化人脸识别", font=('黑体', 20, 'bold'), bg='#00BFFF', fg='white').place(x=10,y=10)# 设置图片以便使用
img = Image.open('D:\hello_world\pythonProject\cat.jpg')
photo = ImageTk.PhotoImage(img)# 大标题
lab1 = tk.Label(win, text="自动化人脸识别", font=('黑体', 20, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)
# 显示图片
# lab2 = tk.Label(win, image=photo).grid(padx=20, pady=10, sticky=tk.W+tk.E)# 按钮
but1 = tk.Button(win, text='采 集 人 脸 图 片', activebackground='yellow',command=CJRL, font=('黑体', 10, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)but2 = tk.Button(win, text='训 练 模 型',activebackground='yellow', command=XL, font=('黑体', 10, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)but3 = tk.Button(win, text='识 别 签 到',activebackground='yellow', command=SBQD, font=('黑体', 10, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)but4 = tk.Button(win, text='签 到 表', activebackground='yellow',command=QDB, font=('黑体', 10, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)but5 = tk.Button(win, text='关 闭 窗 口',activebackground='yellow', command=GB, font=('黑体', 10, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)tk.Label(win, text='学号:1111111111 姓名:iu', bg='white', fg='black',font=('楷体',12)).grid(padx=20, pady=10, sticky=tk.W+tk.E)# tk.Label(win, text='字图一体', image=photo ,compound='bottom', bg='white', fg='black',font=('楷体',12)).grid(padx=20, pady=10, sticky=tk.W+tk.E)win.mainloop()
三、相关函数分析
1.采集人脸
classifier = cv2.CascadeClassifier(r'D:\py-project\pythonProject1\haarcascade_frontalface_default.xml')
- CascadeClassifier:是OpenCV中的一个类,用于创建和管理级联分类器对象,允许加载一个预先训练好的分类器模型.
- r’D:\pyproject\pythonProject1\haarcascade_frontalface_default.xml’:绝对路径。
- haarcascade_frontalface_default.xml:该XML文件包含了用于Haar级联分类器的预训练模型,它是基于Haar特征和AdaBoost算法训练得到的,用于检测人脸
faces = classifier.detectMultiScale(gray, 1.2, 5)
- detectMultiScale() :用于在给定的灰度图像 gray 中检测对象。它会返回一个包含检测到的对象边界框的列表。每个边界框由 (x, y, width, height) 组成,其中 (x, y) 是矩形左上角的坐标,width 和 height 分别是矩形的宽度和高度.
- gray:这是输入的灰度图像。级联分类器通常在灰度图像上工作,因为颜色信息对于基于Haar特征的分类器不是必需的.
- 1.2:scaleFactor 参数,用于构建图像金字塔。图像金字塔是一系列逐渐缩小的图像,用于在不同的尺度上检测对象。scaleFactor 指定了相邻图像之间的缩放比例。较小的 scaleFactor 值意味着金字塔中的图像尺寸减小得更慢,这有助于在不同尺度上更细致地检测对象。
- 5:这是 minNeighbors 参数,它 指定了在声明找到对象之前,必须在同一个位置重叠检测到的对象的最小数量。较大的 minNeighbors 值可以减少误检,但可能会降低检测的灵敏度。
2.训练模型
create = cv2.face.LBPHFaceRecognizer_create()
- LBPHFaceRecognizer_create() :OpenCV face 模块中的一个函数,它初始化一个LBPH人脸识别器对象。LBPH是一种基于图像纹理的识别方法,它通过计算局部二值模式的直方图来提取特征,这些特征随后用于人脸的识别.
- 函数返回一个 LBPHFaceRecognizer 对象,这个对象包含了LBPH算法所需的所有参数和模型。
- 与 create.train(faces, labels) 结合使用,其中, faces 和 labels 是已经准备好的训练数据和对应的标签
def data_translate(path):# 初始化用于存储面部图像数据的列表face_data = []# 初始化用于存储与面部图像对应的ID的列表(学号)id_data = []# 使用os.path.join(path, f)将路径和文件名组合成完整的文件路径# 列表推导式用于创建包含所有文件完整路径的列表file_list = [os.path.join(path, f) for f in os.listdir(path)]# 遍历file_list中的每个文件路径for file in file_list:# 打开图像文件,并将其转换为灰度图像'L'模式PIL_image = Image.open(file).convert('L')# 转换为NumPy数组,数据类型为"uint8"np_image = np.array(PIL_image, "uint8")# 提取文件名中的ID部分,文件名中第一个'.'之后,第二个'.'之前的部分id = int(file.split('.')[1])# 将转换后的图像数组添加到face_data列表face_data.append(np_image)# 将提取的ID添加到id_data列表id_data.append(id)# 返回包含面部图像数据和对应ID的两个列表return face_data, id_data
3.识别签到
style0 =xlwt.easyxf('font:height 300,bold on,color_index black', num_format_str= 'MM:DD HH:MM')
- xlwt.easyxf():函数用于创建一个Excel单元格样式对象,这个对象包含了一系列的格式化设置,可以应用于一个或多个单元格.
- font:height 300 :设置字体大小为300,这通常对应于Excel中的11号字体.
- bold on: 表示文本加粗.
- color_index black :设置文本颜色为黑色。color_index是一个索引,用于指定Excel调色板中的颜色
- num_format_str= ‘MM:DD HH:MM’:指定日期和时间应该以月-日 时:分的格式显示.
for x, y, w, h in faces:# 在图像farme上绘制矩形框,框住检测到的人脸区域# 参数(x, y)是矩形左上角的坐标,(x+w, y+h)是矩形右下角的坐标(注:坐标系在左上角)# (180, 120, 220)是矩形的颜色(BGR格式),2是线条的粗细cv2.rectangle(farme, (x, y), (x+w, y+h), (180, 120, 220), 2)# 从灰度图像gray中截取人脸区域,坐标(x, y)是人脸左上角,宽高为w和hgray1 = gray[y:y+h, x:x+w]# 使用人脸识别器create预测截取的人脸区域gray1的身份和置信度,前面create已经read过训练好的yml文件label, conf = create.predict(gray1)# 打印预测的标签(身份ID)和置信度print(label, conf)# 如果置信度小于50,认为识别结果比较可信if conf < 50:# 尝试找到与预测标签(create检测出的label)匹配的学生ID(excel表格中的stu_id),二者本质上都是学号.index = [list for list, i in enumerate(stu_id) if i == str(label)]print(index)# 假设index列表中有匹配的ID,把其转化为字符串格式,取出对应的学生姓名,生成表格.py生成excel默认是字符串格式(如不是,在单元格前+‘按回车)ID = (str(label))name = stu_name[index[0]]print(ID, name)# 对识别成功的人脸数量进行计数count = count + 1else:# 如果置信度大于或等于50,认为识别结果不可信,标记为未知ID = ('UNKNOWN')
4.创建图形界面
lab1 = tk.Label(win, text="自动化人脸识别", font=('黑体', 20, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)
- tk.Label :是 tkinter 模块中的一个函数,用于创建一个标签(Label)组件,用于显示文本或图像,但不能包含用户交互元素,如按钮或输入框.
- win:GUI窗口
- text=“自动化人脸识别”:添加文本信息.
- font=(‘黑体’, 20, ‘bold’):这个参数定义了标签文本的字体样式,包括字体(黑体),大小(20),以及加粗(bold).
- bg=‘#00BFFF’:这个参数设置了标签的背景颜色,这里使用了十六进制颜色代码,表示浅蓝色.
fg=‘white’:这个参数设置了标签文本的前景颜色(其实就是字体颜色),这里是白色.- .grid(…):这是 Label 组件的 grid 方法,用于将标签放置在父容器win窗口的网格布局中。
(1)padx=20:这个参数设置了组件在窗口水平方向上的填充(外边距),这里是 20 像素。
(2)pady=10:这个参数设置了组件在窗口垂直方向上的填充(外边距),这里是 10 像素。
(3)sticky=tk.W+tk.E:这个参数定义了组件如何 “粘附” 到其网格单元格的边缘。这里 tk.W 表示西(左),tk.E 表示东(右),所以标签将填充整个单元格的宽度,从左到右。
but1 = tk.Button(win, text='采 集 人 脸 图 片', activebackground='yellow',command=CJRL, font=('黑体', 10, 'bold'), bg='#00BFFF', fg='white').grid(padx=20, pady=10, sticky=tk.W+tk.E)
but1参数大体上与lab1相同,此处仅简要说明activebackground=‘yellow’,其用于设置组件在被激活(active)状态下的背景颜色,即当组件获得焦点或者用户与之交互时(例如,鼠标悬停或点击),组件会进入激活状态。此处为点击按钮变黄.
相关文章:

【保姆级教程】基于OpenCV+Python的人脸识别上课签到系统
【保姆级教程】基于OpenCVPython的人脸识别上课签到系统 一、软件安装及环境配置1. 安装IDE:PyCharm2. 搭建Python的环境3. 新建项目、安装插件、库 二、源文件编写1. 采集人脸.py2. 训练模型.py3. 生成表格.py4. 识别签到.py5. 创建图形界面.py 三、相关函数分析1.…...

docker-compose部署下Fastapi中使用sqlalchemy和Alembic
本篇介绍使用Fastapi sqlalchemy alembic 来完成后端服务的数据库管理,并且通过docker-compose来部署后端服务和数据库Mysql。包括: 数据库创建,数据库用户创建数据库服务发现Fastapi 连接数据库Alembic 连接数据库服务健康检查 部署数据…...
Oracle:ORA-00904: “10“: 标识符无效报错详解
1.报错Oracle语句如下 SELECT YK_CKGY.ID,YK_CKGY.DJH,YK_CKGY.BLRQ,YK_CKGY.ZBRQ,YK_CKGY.SHRQ,YK_CKGY.YT,YK_CKGY.ZDR,YK_CKGY.SHR,YK_CKGY.BZ,YK_CKGY.JZRQ,YK_CKGY.ZT,YK_CKGY.CKLX,(case YK_CKGY.CKLXwhen 09 then药房调借when 02 then科室退药when 03 then损耗出库when…...

C语言#define定义宏
目录 一、什么是宏以及宏的声明方式 1.宏常量: 2.宏函数: 二、宏的替换原则 三、宏设计的易犯错误 ERROR1:尾部加分号(当然有些特定需要加了分号,这里说明一般情况) ERROR2:宏函数定义时&…...

SpringBoot操作spark处理hdfs文件
SpringBoot操作spark处理hdfs文件 1、导入依赖 <!-- spark依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.2</version></dependency><depend…...
消息队列架构、选型、专有名词解释
私人博客传送门 消息队列专有名词解释 | 魔筝炼药师 MQ选型 | 魔筝炼药师 MQ架构 | 魔筝炼药师 MQ顺序消息 | 魔筝炼药师...

用OpenCV实现UVC视频分屏
分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类,免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …...
Allure 集成 pytest
Allure 是一个强大的测试报告工具,与 pytest 集成可以生成详细的测试报告,包括测试步骤、测试数据、截图、错误堆栈等。 1. 安装 Allure 和相关依赖 安装 pytest-allure-adaptor 插件: pip install allure-pytest确保本地已安装 Allure 工具。…...
【Python】构建智能语音助手:使用Python实现语音识别与合成的全面指南
随着人工智能技术的迅猛发展,语音助手已成为人们日常生活中不可或缺的一部分。从智能手机到智能家居设备,语音交互提供了便捷高效的人机交互方式。本文旨在全面介绍如何利用Python编程语言及其强大的库——SpeechRecognition和gTTS,构建一个基…...
在 Arthas 中调用 Spring Bean 方法
获取 Spring 应用上下文 使用工具类 如果你的项目中有一个工具类实现了 ApplicationContextAware 接口,如 cn.shutdown.pf.utils.SpringContextUtils,可以使用该类获取 ApplicationContext: Component public final class SpringContextUt…...

Nginx入门笔记
Nginx入门笔记 一、Nginx基本概念二、代理1、正向代理2、反向代理 三、准备工作1、CentOS 7安装nginx(1). 安装必要的依赖(2)下载nginx(3)编译安装(4)编译并安装 Nginx(5)启动nginx …...
【单片机】实现一个简单的ADC滤波器
实现一个 ADC的滤波器,PT1 滤波器(也称为一阶低通滤波器),用于对输入信号进行滤波处理。 typedef struct PT1FilterSettings PT1FilterSettings; struct PT1FilterSettings {//! last Filter output valueuint32_t filtValOld;//…...
开源 vGPU 方案 HAMi 解析
开源 vGPU 方案 HAMi 一、k8s 环境下 GPU 资源管理的现状与问题 (一)资源感知与绑定 在 k8s 中,资源与节点紧密绑定。对于 GPU 资源,我们依赖 NVIDIA 提供的 device-plugin 来进行感知,并将其上报到 kube-apiserver…...

备考蓝桥杯:顺序表详解(静态顺序表,vector用法)
目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表,我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…...
OA系统如何做好DDOS防护
OA系统如何做好DDOS防护?在数字化办公蔚然成风的当下,OA(办公自动化)系统作为企业内部管理与协作的神经中枢,其安全性和稳定性直接关系到企业的日常运营效率、信息流通效率以及长远发展。OA系统不仅承载着企业内部的日…...
使用 Python 的 pyttsx3 库进行文本转语音
1. 什么是 pyttsx3? 1.1 pyttsx3 是一个 Python 库,它可以将文本转换为语音。与其他文本转语音库(如 gTTS)不同,pyttsx3 不依赖于网络服务,它使用本地的 TTS(Text-to-Speech)引擎&a…...

如何在Windows上编译OpenCV4.7.0
前言 参考:Win10 下编译 OpenCV 4.7.0详细全过程,包含xfeatures2d 这里在其基础上还出现了一些问题,仅供参考。 正文 一、环境 1、win10 2、cmake-gui 3、opencv4.7.0 4、VS2019 二、编译过程 1、下载需要的文件: 通…...

【玩转全栈】----Django连接MySQL
阅前先赞,养好习惯! 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings,连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改(更新)数据: 获取数据 1、OR…...
25/1/4 算法笔记<强化学习> 生成对抗模仿学习
基于生成对抗网络的模仿学习,假设存在一个专家智能体,其策略可以看成最优策略,我们就可以通过直接模仿这个专家在环境中交互的动作数据来训练一个策略,并不需要用到环境提供的奖励信息。 生成对抗模仿学习GAIL实质上就是模仿了专家…...
Flink维表方案选型
Iceberg Iceberg 采用全量预加载数据的方式将维度表数据全部加载到内存中进行关联,虽然可以避免频繁访问外部数据库,但对计算节点的内存消耗很高,不能适用于数量很大的维度表。除此之外,当 Iceberg 维表数据更新后,可…...
TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析
1. 基本介绍 TPS3103K33DBVR 是 德州仪器(Texas Instruments, TI) 推出的一款 低功耗电压监控器(Supervisor IC),属于 电源管理芯片(PMIC) 类别,主要用于 系统复位和电压监测。 2. …...
git删除本地分支和远程分支
删除本地分支 git branch -d 分支名删除远程分支 git push origin --delete 分支名...
民锋视角下的资金流效率与账户行为建模
民锋视角下的资金流效率与账户行为建模 在当前复杂多变的金融环境中,资金流效率已成为衡量一家金融服务机构专业能力的重要指标。民锋在账户管理与资金调配的实战经验中,逐步建立起一套以资金流路径为核心的行为建模方法,用以评估客户行为、交…...

如何安装并使用RustDesk
参考: 搭建 RustDesk Server:打造属于自己的远程控制系统,替代 TeamViewer 和 ToDesk! 向日葵、ToDesk再见!自己动手,自建RustDesk远程服务器真香! 通俗易懂:RustDesk Server的搭…...

c++ decltype关键字
decltype为类型推导关键字。 示例代码: // decltype也可用于函数模板编程: template<typename T, typename U> auto add(T t, U u) -> decltype(t u) {return t u; }// decltype推导函数返回类型 auto doubleNumFunc(int x) -> decltype(x * 2) {ret…...
Java中List的forEach用法详解
在 Java 中,List.forEach() 是 Java 8 引入的一种简洁的遍历集合元素的方法。它基于函数式编程思想,接受一个 Consumer 函数式接口作为参数,用于对集合中的每个元素执行操作。 基本语法 java 复制 下载 list.forEach(consumer); 使用示…...
瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用
🔥 机械键盘固件开发从入门到精通:HWKeyboard模块全解析 作为一名嵌入式开发老司机,今天带大家拆解一个完整的机械键盘固件代码。即使你是单片机小白,看完这篇教程也能轻松理解机械键盘的工作原理,甚至自己动手复刻一…...
行业案例 | ASOS 借助 Azure AI Foundry(国际版)为年轻时尚爱好者打造惊喜体验
英国潮流电商ASOS借力微软Azure OpenAI,打造生成式AI购物新体验。平台整合大语言模型与推荐引擎,通过智能聊天交互帮年轻用户探索穿搭灵感,精准匹配近900个品牌的潮流单品,实现技术升级与个性化需求的双重突破。 使用 Azure Open…...

【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)
CUDA C编程笔记 第五章 共享内存和常量内存5.3 减少全局内存访问5.3.2 使用展开的并行规约思路reduceSmemUnroll4(共享内存)具体代码:运行结果意外发现书上全局加载事务和全局存储事务和ncu中这两个值相同 5.3.3 动态共享内存的并行规约reduc…...

【在线五子棋对战】二、websocket 服务器搭建
文章目录 Ⅰ. WebSocket1、简介2、特点3、原理解析4、报文格式 Ⅱ. WebSocketpp1、认识2、常用接口3、websocketpp库搭建服务器搭建流程主体框架填充回调函数细节 4、编写 makefile 文件5、websocket客户端 Ⅰ. WebSocket 1、简介 WebSocket 是从 HTML5 开始支持的一种网页端…...