python mysql 人脸签到
时间: 2025-05-25 14:12:48 浏览: 11
### 如何用Python和MySQL实现人脸签到系统
要实现一个人脸签到系统,可以通过结合Python语言及其相关库(如OpenCV、dlib)、Flask框架以及MySQL数据库来完成。以下是关于如何构建这样一个系统的详细介绍。
#### 1. 技术栈概述
- **前端**: 使用HTML/CSS/JavaScript/JQuery/Ajax等技术创建用户友好的界面[^4]。
- **后端**: Flask框架负责处理HTTP请求并与数据库交互[^4]。
- **人脸识别**: 利用OpenCV进行图像预处理,借助dlib中的68特征点检测器提取面部特征向量,并通过欧氏距离比较判断身份[^3]。
- **数据库**: MySQL用于存储学生信息、教师信息、课程详情及签到记录等数据。
#### 2. 开发环境搭建
安装必要的软件工具与依赖项:
- 安装Navicat或其他类似的数据库管理工具以便管理和查看MySQL中的表结构和内容[^1]。
- 配置PyCharm或VSCode作为IDE来进行Python代码编写[^1]。
#### 3. 数据库设计
定义几个核心表格以满足业务需求:
##### (a) 用户表 (`users`)
| 字段名 | 类型 | 描述 |
|--------------|-------------|--------------------|
| id | INT PRIMARY KEY AUTO_INCREMENT | 自增主键 |
| username | VARCHAR(50) NOT NULL UNIQUE | 登录用户名 |
| password_hash| TEXT | 加密后的密码 |
| role | ENUM('student', 'teacher') DEFAULT 'student' | 用户角色 |
##### (b) 学生表 (`students`)
| 字段名 | 类型 | 描述 |
|--------------|-------------|------------------|
| user_id | INT FOREIGN KEY REFERENCES users(id) ON DELETE CASCADE | 关联至`users.id`字段的学生ID |
| name | VARCHAR(100)| 姓名 |
| face_vector | BLOB | 序列化的人脸特征|
##### (c) 课程表 (`courses`)
| 字段名 | 类型 | 描述 |
|--------------|-------------|-------------------|
| course_code | CHAR(10) PRIMARY KEY | 课程编号 |
| title | VARCHAR(200)| 课程名称 |
| teacher_user_id|INT FOREIGN KEY REFERENCES users(id) ON DELETE SET NULL | 授课老师的关联ID|
##### (d) 签到记录表 (`attendance_records`)
| 字段名 | 类型 | 描述 |
|--------------|-------------|-----------------------|
| record_id | BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT | 主键 |
| student_user_id|INT FOREIGN KEY REFERENCES users(id) ON DELETE CASCADE | 参加签到的学生ID |
| course_code |CHAR(10) FOREIGN KEY REFERENCES courses(course_code) ON UPDATE CASCADE ON DELETE RESTRICT | 所属课程编号 |
| sign_time |DATETIME DEFAULT CURRENT_TIMESTAMP | 实际签到时间戳 |
| status |ENUM('present','absent') DEFAULT 'present'| 出席状态标记 |
以上设计方案确保了各实体间关系清晰合理的同时也便于后续扩展新特性[^1].
#### 4. 功能模块分析
##### A. 注册流程
当新增一名学员时,除了常规个人信息外还需采集其正面照片并通过调用相应API函数获取对应的face embedding保存起来供日后验证用途.
```python
import cv2
import dlib
from scipy.spatial import distance as dist
def register_face(user_id):
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") #加载预测模型文件路径
facerec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces = detector(gray)
if len(faces)==1 :
shape = sp(gray,faces[0])
face_descriptor = facerec.compute_face_descriptor(frame,shape)
conn=mysql.connector.connect(**config)#连接数据库配置字典对象
cursor=conn.cursor()
sql="INSERT INTO students VALUES (%s,%s,%s)"
val=(user_id,"张三",pickle.dumps(face_descriptor))
try:
cursor.execute(sql,val)
conn.commit()
print("注册成功!")
break
except Exception as e:
print(e)
elif not ret or cv2.waitKey(1)&0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
此部分展示了如何捕捉单帧画面内的唯一一张面孔进而计算得到描述符再持久化入库的过程.
##### B. 日常打卡机制
每当到达指定上课时刻前几分钟启动摄像头扫描区域内是否存在匹配已知个体的情形;一旦发现则立即更新对应条目下的出席状况标志位为"present".
```python
def check_in():
known_encodings=[]
with open('./known_faces.pkl','rb')as f:
known_encodings=pickle.load(f)
cap=cv2.VideoCapture(0)
recognizer=dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
predictor=dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
detector=dlib.get_frontal_face_detector()
while True:
_,frame=cap.read()
rgb_frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
detected_faces=detector(rgb_frame,1)
for rect in detected_faces:
landmarks=predictor(rgb_frame,rect)
encoding=np.array(recognizer.compute_face_descriptor(rgb_frame,landmarks))
matches=[dist.euclidean(encoding,knwn)for knwn in known_encodings]
min_distance=min(matches)
index_of_min_value=matches.index(min_distance)
threshold=0.6
if min_distance<threshold:
matched_name=f'Student {index_of_min_value}'
mark_attendance(matched_name)
else:
pass
k=cv2.waitKey(1)
if k%256==27:#ESC key pressed exit loop
break
mark_attendance(name):...
```
上述伪代码片段说明了整个逻辑链条是如何运作的——先读取预先训练好样本集接着逐一对比当前输入流里的候选者直至找到最佳相似度超过设定阈值的对象为止最后触发后台事务提交动作[^4].
#### 结论
综上所述,我们已经探讨了一个完整的解决方案涵盖了从前端展示层一直到底层基础设施层面的内容安排.它不仅具备基本的功能而且还考虑到了安全性因素比如敏感资料加密传输等方面的要求[^2].
---
阅读全文
相关推荐

















