新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于Python+OpenCV的人脸识别考勤系统实现详解

发布时间:2026/10/1 17:22:25来源:尧图网络
基于Python+OpenCV的人脸识别考勤系统实现详解
简介这是基于Python与OpenCV构建的人脸识别员工考勤系统毕业设计项目已经过导师指导并获高分通过适用于高校毕业设计、课程设计与期末大作业也可作为计算机视觉初学者的人脸识别实践范本。资源包大小为197.57MB共收录669个文件其中Python脚本501个承担核心业务逻辑另有44个pyd动态库、12个dll、22个exe等运行依赖组件便于在不同环境下直接启动4个pth模型权重文件保存训练好的人脸特征参数11个jpg与21个png图片样本用于人脸注册和测试6个xml及若干txt文档则构成配置说明与使用指导。系统覆盖员工人脸注册、实时考勤识别、特征比对、考勤记录导出等完整流程附带的csv特征文件和日志记录可帮助读者核查识别结果便于二次开发和功能扩展。目前已有521人学习下载是一份可直接运行、完整度高的高分项目资料。1. 用 Python OpenCV 把人脸考勤做成高分毕业设计先看清它在解决什么问题行政月底拉考勤表总有几条“忘记打卡补签”的记录员工多的办公区一台打卡机前排长队还有人顺手帮同事代刷。把门禁上的刷脸逻辑搬到考勤上就是这套“基于pythonopencv人脸识别的员工考勤系统”在做的事一支普通 USB 摄像头对准前台OpenCV 负责检测和识别画面里的人脸识别通过就自动往考勤表里写上下班时间。它不依赖深度学习框架不占用 GPU一个 Python 脚本加一份文档说明就能把需求、算法、代码、测试串成一个完整的毕设项目。适合计算机相关专业学生参考实现也适合想低成本验证刷脸考勤可行性的人先跑通一个原型。下面我按一个真实项目的推进顺序把这套系统从选型到落地的每一步拆给你看。2. 需求拆解与算法选型识别链路里哪几块不能省2.1 考勤系统至少要拆成四个功能模块一个能通过答辩的考勤系统不是“能认出谁”就结束了。我一般会把功能拆成四个模块人脸采集、模型训练、实时识别、考勤记录。人脸采集负责从摄像头里抓拍员工人脸并保存为样本图片模型训练负责把这些样本训练成一个可加载的模型文件实时识别负责对摄像头画面里的人脸预测出“这是谁”和置信度考勤记录负责把识别结果和当前时间写入数据库并支持查询和导出。这四个模块是单向调用的采集为训练提供数据训练生成模型文件实时识别加载模型得到结果识别结果触发考勤记录写入。把这条链路理清楚代码文件的组织也就跟着定了。我的目录习惯是这样的face_attendance/ ├── collect_faces.py # 人脸采集模块 ├── train_model.py # 模型训练模块 ├── recognize.py # 实时识别模块 ├── attendance_db.py # 考勤记录模块 ├── faces/ # 每个员工一个子目录存采集的样本 ├── face_model.yml # 训练产出的人脸识别模型 └── label_map.json # 标签与员工姓名的映射模块拆分的价值在答辩时体现得最明显。老师问“你的系统有哪些功能模块”你直接顺着这个目录讲老师再问“我只改识别算法考勤要不要动”你答“考勤模块不碰算法只接收姓名和置信度”这就说明你做了模块解耦。很多低分项目只有一段式脚本从采集到打卡全写在一个文件里换算法就要重写考勤逻辑这种结构在论文里也写不出层次感。顺带说一句人脸识别门禁系统的设计逻辑跟这个项目是同一套骨架门禁是“检测人脸→比对身份→开门”考勤是“检测人脸→比对身份→写记录”区别只在识别通过后的动作。所以做完这个毕设你再看任何基于人脸识别门禁系统的方案会发现大部分概念都可以平移过去只是门禁硬件多了一套继电器控制和脱机存储。各模块的输入输出可以整理成一张表写文档时直接能用模块输入输出关键文件人脸采集摄像头帧200x200 灰度样本图片collect_faces.py模型训练样本目录 标签face_model.yml label_map.jsontrain_model.py实时识别模型 摄像头帧员工姓名 confidencerecognize.py考勤记录识别结果 当前时间attendance 表记录attendance_db.py2.2 LBPH、Eigenfaces、Fisherfaces内置算法怎么选OpenCV 的 face 模块内置了三个人脸识别器Eigenfaces、Fisherfaces、LBPH。名字看着专业原理差别很大直接影响你在毕设里的数据准备和调参方向。Eigenfaces 基于 PCA 主成分分析把一张人脸图投影到“特征脸”空间再算投影向量的距离。它的问题是很怕光照同一个人的照片一边亮一边暗特征向量会差很远而且要求所有人脸严格对齐否则识别率会掉到没法看。Fisherfaces 基于 LDA 线性判别分析思路是最大化类间距离、最小化类内距离多数场景下比 Eigenfaces 好但它要求每个类别的样本数足够。否则小样本问题会让 LDA 的类内散度矩阵不可逆训练直接在矩阵求逆时报错。毕业设计每人只有十几张样本踩这个坑的概率很高。LBPH 全称局部二值模式直方图处理思路跟前两者完全不一样它把灰度图切成若干小块在每个像素的邻域内做二值化统计每个小块的直方图再拼成整张图特征。因为特征是局部算的它对光照不均和轻微表情变化的容忍度明显更好训练也快。我按每人 10 到 20 张照片做测试时LBPH 的识别准确率能到 90% 上下Eigenfaces 在同样条件下经常只有 70% 不到。搜“人脸识别算法”会看到大量深度学习方案比如用 CNN 提取特征、用度量学习拉近同类距离准确率确实更高但毕设在这个选择上不必贪。深度学习意味着要装框架、备数据集、调训练轮次光是环境问题就能耗掉一两周。OpenCV 内置的 LBPH 足够把“刷脸打卡”这条链路完整跑通这也是它在教程里出现频率最高的原因。这里还要区分两个容易混淆的概念人脸检测和人脸识别。Haar 级联做的事是“人脸检测”它只回答“画面里有没有脸、脸在哪个框里”LBPH 做的事才是“人脸识别”它回答“这个脸是谁”。很多新手以为 OpenCV 识别人脸就是一条命令实际是两级串联先检测出人脸框再把框内的图交给识别器。搞清楚这个后面调参就不会乱。2.3 数据库与识别结果的数据流SQLite 的表怎么设计识别系统输出的是“这个人是 zhangsan置信度 75”考勤系统要记录的是“zhangsan 今天几点上班、几点下班”。两件事要解耦中间用一张员工表、一张考勤表串起来。我建议用 SQLite它是 Python 标准库自带的不用额外装服务演示时拷一个 .db 文件就能走。建表语句如下CREATE TABLE employees ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, created_at TEXT DEFAULT (datetime(now, localtime)) ); CREATE TABLE attendance ( id INTEGER PRIMARY KEY AUTOINCREMENT, employee_name TEXT NOT NULL, date TEXT NOT NULL, check_in TEXT, check_out TEXT, UNIQUE(employee_name, date) );employees 表只存员工标识name 设唯一约束防止重复注册attendance 表存每天的上、下班时间UNIQUE(employee_name, date) 是查重兜底就算识别代码写错了数据库也会拒绝同一个人同一天的第二条完整记录。我还会加一张识别日志表每识别一次就写一行时间、员工、置信度、是否通过。它不进考勤统计但排查问题时特别好用。比如你说“识别率低”光看打卡记录看不出是漏检还是误检翻日志就能看到置信度分布阈值该调高还是调低一目了然。数据流整体是摄像头帧 → 灰度图 → Haar 级联检测人脸框 → 裁剪并缩放到统一尺寸 → LBPH 预测返回 (label, confidence) → 用 label 查 label_map 得到姓名 → 把姓名和时间写入考勤表。注意人脸识别模块不直接碰数据库它只返回“是谁”写考勤是另一个函数的事。这样拆开后你换数据集、换识别算法考勤记录都不会被污染。初始化数据库时我习惯把建表语句直接写进 attendance_db.py 里程序第一次运行自动建表省得答辩现场还要手动敲 SQL。3. 搭建 Python OpenCV 环境装依赖、采集样本、训练模型的完整路径3.1 安装 Python、OpenCV 与 cv2.face 扩展模块我一般先用 Python 3.8 以上版本官方安装包装好后直接建虚拟环境再装依赖。用虚拟环境的好处是不同项目互不干扰毕设到答辩前重装也不会污染系统 Python。python -m venv .venv source .venv/bin/activate # Windows 下是 .venv\Scripts\activate pip install opencv-python opencv-contrib-python numpy pillow这里最容易被忽略的是 opencv-contrib-python。很多人搜“python 安装教程”照着网上代码装完 opencv-python跑到cv2.face.LBPHFaceRecognizer_create()就报AttributeError: module cv2 has no attribute face。原因很简单三个人脸识别器都在 contrib 扩展模块里只装 opencv-python 是找不到的。这两个包可以同时装版本由 pip 统一解析不会冲突。装完验证一下顺便看看 OpenCV 版本python -c import cv2; print(cv2.__version__); print(cv2.face.LBPHFaceRecognizer_create)只要第二行不报 AttributeError环境就通了。如果版本是 3.x注意部分函数接口名不一样建议直接上 OpenCV 4.x网上能搜到的踩坑记录大多以 4.x 为准。3.2 采集人脸样本从摄像头抓图到统一尺寸预处理训练模型前先给每个员工采集一组人脸样本。这是整个项目里最容易被敷衍、影响却最大的一步。我写的采集脚本长这样import cv2 import os # 摄像头索引笔记本内置一般是 0外接 USB 摄像头可能是 1 或更大 cap cv2.VideoCapture(0) if not cap.isOpened(): raise RuntimeError(摄像头打开失败请检查设备索引) face_cascade cv2.CascadeClassifier( cv2.data.haarcascades haarcascade_frontalface_default.xml ) name input(输入员工英文名如 zhangsan: ) save_dir ffaces/{name} os.makedirs(save_dir, exist_okTrue) count 0 while count 50: ret, frame cap.read() if not ret: continue gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces face_cascade.detectMultiScale( gray, scaleFactor1.1, minNeighbors5, minSize(100, 100) ) for (x, y, w, h) in faces: face gray[y:y h, x:x w] face cv2.resize(face, (200, 200)) count 1 cv2.imwrite(f{save_dir}/{count:03d}.jpg, face) cv2.rectangle(frame, (x, y), (x w, y h), (0, 255, 0), 2) cv2.putText(frame, fcaptured: {count}, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imshow(capture, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows() print(f样本已保存到 {save_dir})逻辑说明每一帧先用 Haar 级联检测器找到人脸框检测到才裁剪、转灰度、缩放到 200x200 后保存。为什么要统一尺寸因为 LBPH 训练时要求所有图片向量维度一致不统一会导致训练时数组拼接失败。为什么要转灰度因为 LBPH 的特征就是在灰度图上算的彩色信息用不上。参数说明scaleFactor1.1 表示每一层金字塔缩小 10%值越小检测越慢但更精细minNeighbors5 表示候选框周围至少要有 5 个重叠框才判定为人脸值太大会漏检太小会出现误检框minSize(100, 100) 过滤掉太小的框可以避开远处误触发的杂物。每个员工采集 50 张让头部在画面里左右转一转样本多样性比单纯数量更重要。3.3 训练识别模型LBPH 模型生成与参数说明样本够了就训练。我习惯把 label 从 0 开始连续编号同时把编号映射到姓名单独存一份识别时要用。import cv2 import os import json import numpy as np recognizer cv2.face.LBPHFaceRecognizer_create() face_cascade cv2.CascadeClassifier( cv2.data.haarcascades haarcascade_frontalface_default.xml ) faces [] labels [] label_map {} for label, name in enumerate(os.listdir(faces)): person_dir os.path.join(faces, name) if not os.path.isdir(person_dir): continue label_map[label] name for img_name in os.listdir(person_dir): img_path os.path.join(person_dir, img_name) img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img is None: print(f警告无法读取 {img_path}已跳过) continue img cv2.resize(img, (200, 200)) faces.append(img) labels.append(label) if len(labels) 0: raise ValueError(faces 目录下没有可用的样本请先采集) recognizer.train(faces, np.array(labels)) recognizer.save(face_model.yml) with open(label_map.json, w, encodingutf-8) as f: json.dump({str(k): v for k, v in label_map.items()}, f, ensure_asciiFalse, indent2) print(训练完成模型已保存为 face_model.yml)逻辑说明遍历 faces 目录下的每个子目录把子目录名当作员工姓名给每个员工分配一个从 0 递增的 label再把该员工目录下所有 jpg 读入列表。训练后模型保存为 yml姓名映射保存为 JSON。参数说明这里的 resize 再补一次保险防止个别样本未按统一尺寸保存导致训练数组维度不一致。img is None的判断很重要文件损坏或路径含中文时 cv2.imread 会静默返回 None不判断的话后面 train 直接抛异常。标签用 np.array 包一层是 LBPH 训练接口的参数要求。训练完成后face_model.yml一般只有几十 KB它就是后面识别阶段唯一的模型文件。4. 把考勤业务接进来实时识别、打卡记录与简单界面4.1 实时视频流识别摄像头循环里如何判定“这是谁”识别阶段加载模型对每一帧检测到的人脸做 predict。关键点是理解 LBPH 返回的 confidence 语义它是待识别样本与训练样本的距离数值越小越可信和分类器输出的“概率”相反。我把识别逻辑抽成一个函数方便界面层复用。import cv2 import json recognizer cv2.face.LBPHFaceRecognizer_create() recognizer.read(face_model.yml) with open(label_map.json, r, encodingutf-8) as f: label_map {int(k): v for k, v in json.load(f).items()} face_cascade cv2.CascadeClassifier( cv2.data.haarcascades haarcascade_frontalface_default.xml ) def recognize_one_frame(frame, threshold80): gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces face_cascade.detectMultiScale( gray, scaleFactor1.1, minNeighbors5, minSize(100, 100) ) for (x, y, w, h) in faces: face gray[y:y h, x:x w] face cv2.resize(face, (200, 200)) label, confidence recognizer.predict(face) if confidence threshold: name label_map[label] color (0, 255, 0) else: name unknown color (0, 0, 255) cv2.rectangle(frame, (x, y), (x w, y h), color, 2) cv2.putText(frame, f{name} {int(confidence)}, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) return name, confidence, frame return None, None, frame逻辑说明recognize_one_frame 对传入的一帧做检测和识别返回姓名、置信度和画好框的帧。没有检测到人脸时返回三个 None方便调用方区分“没人”和“不认识”。参数说明threshold 默认 80表示 confidence 小于 80 才算识别通过。这个值不是固定不变的它跟摄像头分辨率、光照、样本数量都有关。我的做法是先跑一段日志观察同一个人的 confidence 通常在 40 到 70 之间陌生人通常在 100 以上再把阈值设在两者之间。如果你发现熟人频繁 unknown把阈值上调到 90发现陌生人经常被认成员工就下调到 70。识别阈值是毕设调优里回报最高的一个参数。4.2 考勤记录写入上班打卡与重复打卡的业务判断识别出“是谁”之后要不要写考勤、写上班还是下班这属于考勤业务逻辑。我用的规则是当天第一次识别通过写上班时间第二次写下班时间之后不再重复写。import sqlite3 from datetime import datetime def record_attendance(conn, name): today datetime.now().strftime(%Y-%m-%d) now datetime.now().strftime(%H:%M:%S) cur conn.cursor() cur.execute( SELECT id, check_in, check_out FROM attendance WHERE employee_name? AND date?, (name, today), ) row cur.fetchone() if row is None: cur.execute( INSERT INTO attendance (employee_name, date, check_in) VALUES (?, ?, ?), (name, today, now), ) conn.commit() return f{name} 上班打卡 {now} if row[2] is None: cur.execute( UPDATE attendance SET check_out? WHERE id?, (now, row[0]), ) conn.commit() return f{name} 下班打卡 {now} return f{name} 今日考勤已完成逻辑说明先按“当天 员工”查记录。查不到就插入一条 check_in 记录查到但没有 check_out 就补下班时间两条都有就不再写。这样一个人每天最多产生一条完整考勤记录。参数说明date 和 time 全部用字符串SQLite 对日期时间函数支持弱字符串排序在月日上反而直观。如果想支持迟到判断用 check_in 和公司规定的上班时间比较就行。这个函数把数据库操作独立出来了识别脚本里调用它界面脚本里也可以调用它后面加 Web 端导出也能复用。还有一层兜底attendance 表上的 UNIQUE(employee_name, date) 会在数据库层拒绝重复插入即使业务判断漏了也不会出现同一个人同一天多条记录。4.3 用 Tkinter 把识别结果和考勤状态显示出来纯命令行演示能跑但答辩观感差很多。我建议包一个 Tkinter 界面只做两件事实时刷新摄像头画面把识别和打卡状态显示在窗底。import tkinter as tk import cv2 from PIL import Image, ImageTk from recognize import recognize_one_frame from attendance_db import record_attendance import sqlite3 class AttendanceApp: def __init__(self, root): self.root root self.root.title(刷脸考勤系统) self.cap cv2.VideoCapture(0) self.conn sqlite3.connect(attendance.db) self.video_label tk.Label(root) self.video_label.pack() self.status_label tk.Label(root, text等待识别..., font(SimHei, 14)) self.status_label.pack() self.update_frame() def update_frame(self): ret, frame self.cap.read() if ret: name, conf, frame recognize_one_frame(frame) if name is not None and conf 80: msg record_attendance(self.conn, name) self.status_label.config(textmsg) elif name unknown: self.status_label.config(text未识别请正对摄像头) rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img Image.fromarray(rgb) imgtk ImageTk.PhotoImage(imageimg) self.video_label.imgtk imgtk self.video_label.configure(imageimgtk) self.root.after(30, self.update_frame) if __name__ __main__: root tk.Tk() app AttendanceApp(root) root.mainloop()逻辑说明界面层在每帧刷新时调用识别函数如果识别出的名字不是 unknown就调用 record_attendance 写考勤并把返回信息显示在状态栏。注意这里用了conf 80和识别函数内部同样的阈值如果你改了阈值记得同步这里否则会出现“框上显示识别成功、状态栏却不动”的尴尬。参数说明font 里写“SimHei”是为了在 Windows 上正常显示中文。macOS 或 Linux 要换成系统里的中文字体否则状态栏会出现方块乱码。Pillow 负责把 OpenCV 的 BGR 帧转成 Tkinter 能显示的 RGB 图像这就是前面 pip 安装里加 pillow 的原因。5. 避坑指南人脸考勤系统最容易翻车的 5 个细节毕业设计这种项目代码能写完不代表能跑通能跑通不代表答辩时还能跑通。下面 5 个坑是我见过最常出现的每个都按“现象 → 原因 → 解决”写清楚省得你到时候一个人熬夜排错。5.1 现象装完 opencv 还是找不到 cv2.face运行cv2.face.LBPHFaceRecognizer_create()报 AttributeError提示没有 face 属性。原因是只安装了 opencv-python而人脸识别器在 opencv-contrib-python 这个扩展包里。网上大量 python 教程只让你装 opencv-python照做就会踩中。解决补装扩展包两个包同时存在没问题。装完重新运行验证命令确认 cv2.face 出现。如果你已经用 conda优先用conda install -c conda-forge opencvconda 版本通常把 contrib 也打进去了。提示安装后先跑验证命令再往下写代码不然你会分不清是环境问题还是代码问题。5.2 现象模型训练完识别率很低张冠李戴训练时没有报错识别时却把 A 员工认成 B 员工或者对熟悉的人显示 unknown。原因通常出在样本质量上采集时背景太乱、光线忽明忽暗、脸在画面里占比太小或者每个员工只采集了五六张且角度单一。解决重新采集样本每人至少 20 张让被采集者左右转头、轻微上下抬头保留不同角度的样本尽量固定位置和光照避免摄像头前人来人往干扰。训练前删掉那些模糊、半脸、缺边的图宁缺毋滥。样本质量上来了识别率通常能明显回升这比换算法见效快。5.3 现象摄像头打开失败或画面全黑cap.isOpened()返回 False或者画面黑屏但程序不报错。原因有几个摄像头索引不对笔记本内置摄像头是 0外接 USB 摄像头可能是 1 甚至 2摄像头被微信、腾讯会议等程序占用笔记本摄像头权限被系统设置为关闭。解决先用一个三行的脚本枚举索引逐个尝试 0、1、2。python -c import cv2; [print(i, cv2.VideoCapture(i).isOpened()) for i in range(3)]关闭占用摄像头的程序。Windows 在“隐私设置”里把“允许桌面应用访问相机”打开。代码里加cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)和cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)把分辨率调低一点能规避一部分低端摄像头在高分辨率下的黑屏问题。注意演示前一定先单独测摄像头别等到答辩现场才发现设备被占用。5.4 现象考勤记录重复写入同一个人一天在数据库里出现多条记录或者状态栏一直显示“上班打卡”。原因是业务判断漏了或者是识别循环里对连续多帧都调用了 record_attendance同一张脸被重复识别和写库。解决两层处理。业务层按“当天有没有记录、有没有 check_out”判断识别层加一个冷却时间比如识别到同一个人后 5 秒内不再触发写库。数据库层用 UNIQUE(employee_name, date) 兜底。三层都做了重复记录基本不可能出现。加冷却时间的做法是记录上一次写入的姓名和时间如果姓名相同且间隔小于 5 秒只刷新状态栏不写库。5.5 现象一换电脑或一重装程序就识别不了模型文件、label_map.json、faces 目录拷贝过去了但识别结果全乱或者直接找不到文件。原因是相对路径写死了程序在启动目录不对时读不到模型更隐蔽的是 label_map 的键被 JSON 转成了字符串读取时没转回 int导致 label 查不到对应姓名。解决统一用绝对路径或者规定“必须从项目根目录启动脚本”。读取 label_map 时做一次int(k)转换。模型文件和 label_map 要一起拷贝答辩时可以主动说“一个是特征模型一个是姓名字典”评审听你这么说说明你理解这两个文件不是一回事。6. 答辩前验证与加分把“能跑”变成“可演示”6.1 用测试集算准确率别只靠“感觉还行”识别率不能靠眼睛估。我一般会在训练前把每个员工的样本按 8:2 随机分成训练集和测试集训练只喂训练集识别时用测试集里的照片跑 predict统计识别正确的比例。测试集里每张图都知道真实身份把 predict 返回的 label 和真实 label 一比对就能得到准确率。如果某两个员工经常互相误判把他们各自的样本列出来看是不是采集时的角度太像或者光线差异太大。改进方向有两个要么补充这两人的样本要么调 confidence 阈值。答辩时评委问“你的系统准确率多少”你能拿出一张统计表比一句“大概挺准的”有说服力得多。6.2 文档说明怎么衔接代码从源码到论文答辩文档说明是毕业设计给分的重要依据我的习惯是四个章节需求分析、系统设计、系统实现、系统测试。需求分析写清楚“谁在什么场景下打卡”系统设计放模块图和数据库表结构系统实现选 LBPH 算法解释它为什么适合小样本系统测试给出准确率统计和阈值调整记录。文档里的每一张截图都要和源码实际跑出来的界面一致。这个“一致”看起来很基础但很多项目翻车就翻在这里。答辩前我会做一个土办法的检查新建一个干净虚拟环境按文档里的命令从零装依赖、跑采集、跑训练、跑识别把每一步截下来和论文对比。这能筛掉大部分“代码能跑但不会装”的尴尬。我自己吃过这个亏——演示时直接运行代码没报错评委一问怎么安装我却答不出来整套功能在印象分里直接缩水。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Photoshop加深工具详解:局部压暗技巧与参数设置 2026/10/1 18:09:34

Photoshop加深工具详解:局部压暗技巧与参数设置

今天来聊一聊Photoshop工具栏里那个总被忽略、但用好了能让照片质感立刻提升一个档次的家伙——加深工具。系列做到第55讲,前面讲了裁剪、修复、画笔这些高频工具,这次轮到“加深工具”这个低调成员。它和旁边的减淡工具是一对孪生兄弟,负责局…

阅读更多 →
Java人脸识别签到系统实战:稳定部署与活体防伪 2026/10/1 18:09:06

Java人脸识别签到系统实战:稳定部署与活体防伪

简介:本资源是一个基于Java实现的人脸识别签到系统开源项目,面向Java中级开发者及人工智能应用实践者,解决无接触身份核验与考勤管理场景下的技术落地问题。压缩包共225个文件,含65个Java核心业务与API调用代码、78个XML配置与布局…

阅读更多 →
不安全状态≠死锁:银行家算法与死锁避免的深度解析 2026/10/1 18:09:06

不安全状态≠死锁:银行家算法与死锁避免的深度解析

我用一个课堂上的真实场景来切入这个话题。讲操作系统原理时,每次讲完银行家算法和死锁那一章,总有学生追着问一个问题:老师,既然不安全状态这么危险,为什么书上说它不一定会变成死锁?那岂不是我们前面学了…

阅读更多 →
Bun新能力引爆AI调试:结构化错误信息让Node.js连夜复刻 2026/10/1 18:09:06

Bun新能力引爆AI调试:结构化错误信息让Node.js连夜复刻

昨天群里的讨论直接炸了。起因是有人转了一条消息,说Bun这次带来的新能力让前端圈没法淡定:不是又一轮跑分碾压,而是把“调试”这件事一口气往前推了一大截。尤雨溪都在公开场合直呼很好,评论区马上有人喊“Node.js要睡不着了”。…

阅读更多 →
第一次作业怎么交?从需求对齐到复盘迭代的完整交付指南 2026/10/1 18:09:06

第一次作业怎么交?从需求对齐到复盘迭代的完整交付指南

说起来有点不好意思,我印象里最深刻的一次“第一次作业”,是我毕业后第一份工作接到的数据报表任务。当时领导交代得很简单:“把上季度的用户活跃数据整理一下,周三前发我。” 我心想这事儿简单,打开Excel就开始拉数&a…

阅读更多 →
Pandas数据排序实战:DataFrame排序参数、多条件与性能优化 2026/10/1 18:09:06

Pandas数据排序实战:DataFrame排序参数、多条件与性能优化

“数据排序”这四个字,几乎是每个接触数据处理的人绕不开的第一道坎。不管是在头歌这类实训平台上刷经典题目,还是在实际业务里做报表、做分析,排序都是出现频率最高的操作之一。很多人一听“数据排序”就觉得简单,无非就是order …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉