【保姆级教程】基于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.…...
LVS能否实现两台服务器的负载均衡
LVS能否实现两台服务器的负载均衡 是的,LVS(Linux Virtual Server)可以实现两台服务器的负载均衡,并且它非常适合这种场景。 LVS(Linux Virtual Server)简介: LVS 是一种基于 Linux 的负载均…...
智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析
随着工业化程度的提高,生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间,人员误入或违规进入将带来严重的安全隐患。为了解决这一问题,迈尔微视推出了智能人体安全检测解决方案,为企业提供全方位的人员安全监…...
JAVA后端实现全国区县下拉选择--树形结构
设计图如图: 直接上代码 数据库中的格式: JAVA实体类: Data public class SysAreaZoningDO {private Long districtId;private Long parentId;private String districtName;private List<SysAreaZoningDO> children; } MapperSQL语句…...
DVWA及其他常见网络靶场
常见网络靶场 Metasploitable2 介绍: Metasploitable2 是一个用于安全培训和测试渗透测试工具的虚拟靶机。它故意配置了许多已知的安全漏洞,涵盖了操作系统、网络服务等多个方面。基于 Ubuntu Linux 操作系统构建,包含了如 Apache、MySQL、FT…...
API接口安全:电商数据保护的坚固防线
随着电子商务的蓬勃发展,电商平台的数据安全和隐私保护成为了至关重要的议题。API(应用程序编程接口)作为电商平台与外部系统交互的桥梁,其安全性直接关系到整个平台的数据保护能力。本文将从API接口安全的重要性、面临的安全威胁…...
springboot437校园悬赏任务平台(论文+源码)_kaic
摘 要 使用旧方法对校园悬赏任务平台的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在校园悬赏任务平台的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的校…...
可视化报表如何制作?一文详解如何用报表工具开发可视化报表
在如今这个数据驱动的商业时代,众多企业正如火如荼地推进数字化转型,力求在激烈的市场竞争中占据先机。然而,随着业务规模的扩大和运营复杂度的提升,企业的数据量爆炸式增长,传统报表格式单一、信息呈现密集且不易解读…...
STM32 HAL库之SDIO例程 Micro SD卡 - 2
1、硬件图 2、示例代码 根据提示配置SDCLK为72/3 24MHz。 static void MX_SDIO_SD_Init(void) {/* USER CODE BEGIN SDIO_Init 0 */SD_InitTypeDef Init;Init.ClockEdge SDIO_CLOCK_EDGE_RISING;Init.ClockBypass SDIO_CLOCK_BYPASS_DISABLE;Init.ClockPo…...
架构实践02-高性能架构模式
零、文章目录 架构实践02-高性能架构模式 1、 高性能数据库集群:读写分离 (1)引言 背景:随着业务的发展和数据的增长,单个数据库服务器难以满足需求,必须考虑数据库集群。目的:介绍高性能数…...
leetcode-73.矩阵置零-day5
class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …...
Docker与虚拟机:虚拟化技术的差异解析
在信息技术飞速发展的今天,虚拟化技术已成为现代IT架构不可或缺的一部分。而虚拟化从技术层面划分则分为以下几种: 完全虚拟化:虚拟机能够完全模拟底层硬件的特权指令的执行过程,客户操作系统无须进行修改。 硬件辅助虚拟化&#…...
数据结构——ST表
ST表的定义 ST表,又名稀疏表,是一种基于倍增思想,用于解决可重复贡献问题的数据结构 倍增思想 这里列举一个去寻找一个区间内的最大值的例子 因为每次会将将区间增大一倍,所以才被称之为倍增思想 ,这种思想十分好用…...
flutter命令行直接指定设备
> flutter driver Found 3 connected devices:sdk gphone16k x86 64 (mobile) • emulator-5554 • android-x64 • Android 15 (API 35) (emulator)Linux (desktop) • linux • linux-x64 • Ubuntu 22.04.5 LTS 6.8.0-49-genericChrome (…...
【STM32】RTT-Studio中HAL库开发教程九:FLASH中的OPT
文章目录 一、概要二、内部FLASH排布三、内部FLASH主要特色四、OTP函数介绍五、测试验证 一、概要 STM32系列是一款强大而灵活的微控制器,它的片内Flash存储器可以用来存储有关代码和数据,在实际应用中,我们也需要对这个存储器进行读写操作。…...
COLA学习之代码规范(二)
小伙伴们,你们好,我是老寇,上一节,我们学习了DDD相关术语,继续跟老寇学习COLA代码规范 代码规范 包命名 层次包名功能必选Adapter层web处理页面请求Controller否Adapter层wireless处理无线端适配否Adapter层wap处理…...
【优选算法】二分算法(在排序数组中查找元素的第一个和最后一个位置,寻找峰值,寻找排序数组中的最小值)
二分算法简介: 提到二分我们可能都会想起二分查找,二分查找要求待查找的数组是有序的,与我们今天讲的二分算法不同,并不是数组元素严格按照有序排列才可以使用二分算法,只要数组中有一个点可以将数组分为两个部分&…...
数据结构-排序(来自于王道)
排序的基本概念 插入排序 在这个算法中,除了输入的数组本身,没有使用额外的数据结构来存储数据,所有的操作都是在原数组上进行的。因此,无论输入数组的大小 n 是多少,算法执行过程中所占用的额外空间是固定的ÿ…...
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码) 简介 2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇…...
《C++:计算机视觉图像识别与目标检测算法优化的利器》
在当今科技飞速发展的时代,计算机视觉领域正经历着前所未有的变革与突破。图像识别和目标检测作为其中的核心技术,广泛应用于安防监控、自动驾驶、智能医疗等众多领域,其重要性不言而喻。而 C语言,凭借其卓越的性能、高效的资源控…...
医学分割数据集白内障严重程度分割数据集labelme格式719张3类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):719 标注数量(json文件个数):719 标注类别数:3 标注类别名称:["normal","severe","mi…...
VirtIO实现原理之数据结构与数据传输演示(4)
接前一篇文章:VirtIO实现原理之数据结构与数据传输演示(3) 本文内容参考: VirtIO实现原理——vring数据结构-CSDN博客 VirtIO实现原理——数据传输演示-CSDN博客 特此致谢! 一、数据结构总览 2. 相关数据结构 前文书介绍了《Virtual I/O Device (VIRTIO) Version 1.3…...
C语言:详解指针最终篇(3)
一.字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针char*。一般我们这样使用: 我们来看另一种使用方式: 这个常量字符串就相当于它本身首字符的地址,收地址加上方括号下标就可以访问该表达式中对应下标的元素。可以把该表达式…...
03篇--二值化与自适应二值化
二值化 定义 何为二值化?顾名思义,就是将图像中的像素值改为只有两种值,黑与白。此为二值化。 二值化操作的图像只能是灰度图,意思就是二值化也是一个二维数组,它与灰度图都属于单信道,仅能表示一种色调…...
Java 小抄|解析 JSON 并提取特定层级数据
文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中,我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据,并通过流式处理提取特定层级的数据。我们将…...
qt 设置系统缩放为150%,导致的文字和界面的问题
1 当我们设置好布局后,在100%的设置里面都是正常的,但是当我们修改缩放为150%后,字体图标,界面大小就出现问题了,这就需要我们设置一些参数。 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreAppl…...
【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)
1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom: dataZoom: [{type: inside, // inside 鼠标左右拖图表,滚轮缩放; slider 使用滑动条start: 0, // 左边的滑块位置,表示从 0 开始显示end: 60, // 右边的滑块位置…...
深度学习入门课程学习笔记(第25周)
摘要 本周报的目的在于汇报第25周的学习成果,本周主要聚焦于基于深度学习的目标检测领域算法的总体框架的学习。 在这本周的学习中,内容主要涵盖了目标检测算法的发展历程,包括发展历程和发展阶段,然后纤细说明了目标检测算法的…...
【Python】Matplotlib基本图表绘制
目录 Matplotlib基本图表绘制折线图更多外观外观类型颜色线条样式图例位置使用本地字体 散点图条形图横向条形图 直方图频率分布直方图 Matplotlib基本图表绘制 折线图 from matplotlib import pyplot as plt import matplotlib #字典类型的字体预设,键值对依次…...
【1211更新】腾讯混元Hunyuan3D-1文/图生3D模型云端镜像一键运行
目录 项目介绍 显存占用 11月21 新增纹理烘焙模块Dust3R 烘焙相关参数: AutoDL云端镜像 启动说明 标准模型下载 【1212更新】腾讯混元Hunyuan3D-1文图生3D模型云端镜像一键运行 项目介绍 https://github.com/Tencent/Hunyuan3D-1 腾讯混元 3D 生成模型,支持…...
工业大数据分析算法实战-day05
文章目录 day05分而治之中的MARS算法神经网络逼近能力解释 day05 今天是第5天,昨日从统计分析开始利用统计学的知识判断当前样本的分布以及估计总体的参数和假设检验的情况,以及介绍了线性回归算法的相关优化点,但是毕竟线性回归是线性划分的…...
Go 语言结构
Go 语言结构 Go 语言,也称为 Golang,是一种由 Google 开发和支持的静态类型、编译型编程语言。它于 2009 年首次发布,旨在提高多核处理器、网络资源和大型代码库的性能。Go 语言以其简洁的语法、并发支持和强大的标准库而闻名,特别适合构建高性能的网络服务和分布式系统。…...
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
文章目录 PyQt5 超详细入门级教程前言序篇:1-3部分:PyQt5基础与常用控件第1部分:初识 PyQt5 和安装1.1 什么是 PyQt5?1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…...
9_less教程 --[CSS预处理]
LESS(Leaner Style Sheets)是一种CSS预处理器,它扩展了CSS语言,增加了变量、嵌套规则、混合(mixins)、函数等功能,使得样式表的编写更加灵活和易于维护。下面是一些LESS的基础教程内容ÿ…...
macOS:安装第三方软件
基于安全性考虑,Mac 系统通常不允许安装那些从网络上下载下来的第三方软件包。 比如,在打开镜像盘时,报错为“该镜像已损坏,请移至废纸篓”,或者打开软件时提示“XXX 已损坏,打不开。您应该将它移到废纸篓”…...
HTML+CSS+Vue3的静态网页,免费开源,可当作作业使用
拿走请吱一声,点个关注吧,代码如下,网页有移动端适配 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...
昇思25天学习打卡营第33天|共赴算力时代
文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台,就像是AI学习者和开发者的超级基地,这里不仅提供丰富的项目、模型和大模型体验,还有一大堆经典数据集任你挑。…...
IAR环境下STM32静态库编译及使用
IAR环境下STM32静态库编译及使用 前言 最近了解到了STM32的静态库与动态库,在此记录一下STM32静态库的生成与使用。 静态库的作用主要是对代码进行封装及保护,使其他使用者只知其然而不知其所以然,因为封装后的静态库只有.h文件没有.c文件。…...
前端如何性能优化
前端性能优化是提高网页加载速度和响应速度的重要手段。优化前端性能不仅能提升用户体验,还能提高SEO排名,降低服务器负担,节省带宽等。下面是一些常见的前端性能优化方法: 1. 减少 HTTP 请求 每个页面资源(如图片、…...
【开源】为Stable Diffusion工作流程提供的一个更加灵活易用的Web界面
一个开源项目,旨在为Stable Diffusion工作流程提供一个更加灵活、易用的Web界面。这个项目特别适用于图像生成和编辑,具有以下几个显著特点: 分层和非破坏性编辑:OpenDream支持非破坏性编辑,允许用户在保留原始图像数据…...
安全见闻(1)
Target 开阔见闻,不做井底之蛙 Trial 建议 前期小白到中级红队:把python学好 C\C:偏向底层,适合逆向,不适合前期web渗透 编程语言 C语言: 一种通用的、面向过程的编程语言,广泛应用于系统软件和嵌入…...
基于32单片机的RS485综合土壤传感器检测土壤PH、氮磷钾的使用(超详细)
1-3为RS485综合土壤传感器的基本内容 4-5为基于STM32F103C8T6单片机使用RS485传感器检测土壤PH、氮磷钾并显示在OLED显示屏的相关配置内容 注意:本篇文件讲解使用的是PH、氮磷钾四合一RS485综合土壤传感器,但里面的讲解内容适配市面上的所有多合一的RS…...
SQL server学习03-创建和管理数据表
目录 一,SQL server的数据类型 1,基本数据类型 2,自定义数据类型 二,使用T-SQL创建表 1,数据完整性的分类 2,约束的类型 3,创建表时创建约束 4,任务 5,由任务编写…...
Windows 系统下 Python 环境安装
一、引言 Python 作为一种广泛应用的编程语言,在数据分析、人工智能等领域发挥着重要作用。本文将详细介绍在 Windows 系统上安装 Python 环境的步骤。 二、安装前准备 系统要求 Windows 7 及以上版本一般都能支持 Python。硬件方面,通常 2GB 内存、几…...
Redis 在Go项目中的集成和统一管理
本节我们在项目中安装和集成 go-redis,让项目能访问Redis,后面实战项目中的用户认证体系会依赖Redis来实现,像Token、Session这些都是在Redis中存储的。 本节大纲如下: Redis的使用场景有不少,不过有一点需要提醒的…...
Hive——HQL数据定义语言
文章目录 Hive HQL数据查询语言更多大数据资源持续更新中。。。学习目标一、HQL数据定义语言(DDL)概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...
Python机器视觉的学习
一、二值化 1.1 二值化图 二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。 1.2 阈值法 阈值法(Thresholding)是一种图像分割技术,旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…...
使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法
使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法 一、问题现象:二、出现原因三、解决方法:1、升级Navicat版本:2、使用低版本的postgreSQL:3、修改Navicat的dll二进制文件:navicat版本15nav…...
秒杀抢购场景下实战JVM级别锁与分布式锁
背景历史 在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极…...
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)
目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则: 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...