简介:本文详细介绍如何使用Python、OpenCV和数据库构建人脸识别考勤系统,包含完整源码、数据库设计及分步教程,适合开发者快速实现项目。
在数字化转型浪潮下,传统考勤方式(如指纹打卡、IC卡)存在代打卡、设备维护成本高等问题。基于人脸识别的考勤系统通过生物特征唯一性,实现无接触、高精度的身份验证,成为企业、学校等场景的优选方案。本系统结合Python的简洁性、OpenCV的计算机视觉能力及数据库的持久化存储,构建了一套低成本、可扩展的解决方案。
通过pip安装核心库:
pip install opencv-python dlib numpy sqlite3 pandas# 若使用MySQLpip install pymysql
-- 用户表CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,face_encoding BLOB NOT NULL, -- 存储人脸特征向量register_time DATETIME DEFAULT CURRENT_TIMESTAMP);-- 考勤记录表CREATE TABLE attendance (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER NOT NULL,check_in_time DATETIME DEFAULT CURRENT_TIMESTAMP,status TEXT CHECK(status IN ('IN', 'OUT')),FOREIGN KEY (user_id) REFERENCES users(id));
使用OpenCV和Dlib实现人脸检测及128维特征向量提取:
import cv2import dlibimport numpy as np# 初始化Dlib的人脸检测器和特征提取器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")def get_face_encoding(image_path):img = cv2.imread(image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(gray, 1)if len(faces) == 0:return Noneface = faces[0]shape = sp(gray, face)face_encoding = facerec.compute_face_descriptor(img, shape)return np.array(face_encoding)
通过摄像头实时检测并匹配人脸:
def real_time_attendance():cap = cv2.VideoCapture(0)known_faces = {} # {user_id: face_encoding}# 加载已知人脸(示例)# 实际应从数据库加载while True:ret, frame = cap.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = detector(gray, 1)for face in faces:shape = sp(gray, face)face_encoding = facerec.compute_face_descriptor(frame, shape)# 匹配已知人脸for user_id, known_encoding in known_faces.items():distance = np.linalg.norm(np.array(face_encoding) - np.array(known_encoding))if distance < 0.6: # 阈值可根据实际调整print(f"识别成功:用户ID {user_id}")# 记录考勤到数据库record_attendance(user_id)breakcv2.imshow("Attendance System", frame)if cv2.waitKey(1) == 27: # ESC键退出breakcap.release()cv2.destroyAllWindows()
import sqlite3def init_db():conn = sqlite3.connect("attendance.db")cursor = conn.cursor()cursor.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,face_encoding BLOB NOT NULL)""")cursor.execute("""CREATE TABLE IF NOT EXISTS attendance (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER NOT NULL,check_in_time DATETIME DEFAULT CURRENT_TIMESTAMP,status TEXT CHECK(status IN ('IN', 'OUT')),FOREIGN KEY (user_id) REFERENCES users(id))""")conn.commit()conn.close()def add_user(name, face_encoding):conn = sqlite3.connect("attendance.db")cursor = conn.cursor()cursor.execute("INSERT INTO users (name, face_encoding) VALUES (?, ?)",(name, face_encoding.tobytes()))conn.commit()conn.close()def record_attendance(user_id, status="IN"):conn = sqlite3.connect("attendance.db")cursor = conn.cursor()cursor.execute("INSERT INTO attendance (user_id, status) VALUES (?, ?)",(user_id, status))conn.commit()conn.close()
shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat)。init_db()。
# 示例:注册新用户user_name = input("输入用户名:")face_encoding = get_face_encoding("user_photo.jpg") # 或实时采集add_user(user_name, face_encoding)
运行real_time_attendance(),系统将自动检测人脸并记录考勤。
性能优化:
功能扩展:
错误处理:
完整源码(含数据库脚本、UI界面、详细注释)及分步教程已打包,关注公众号或访问GitHub仓库获取。项目支持二次开发,可根据需求调整识别阈值、数据库结构等参数。
结语:本系统通过Python与OpenCV的组合,实现了低成本、高精度的人脸考勤方案。无论是企业办公还是学校管理,均可快速部署并定制功能。未来可结合深度学习框架(如TensorFlow)进一步提升识别率,适应更复杂的场景需求。