opencv python 实现人脸考勤 完整代码
时间: 2025-04-24 07:54:21 浏览: 21
<think>好的,我现在需要解决用户的问题:获取使用OpenCV和Python实现人脸考勤的完整代码示例。用户已经提供了一些相关的引用资料,我需要结合这些资料来构建一个完整的回答。
首先,我需要回顾用户提供的引用内容。引用1到4都提到了基于Python和OpenCV的人脸识别考勤系统,其中引用了dlib、数据库集成、数据训练等功能。用户需要完整的代码示例,因此我应该整合这些部分,确保代码结构清晰,并且包含必要的功能模块。
接下来,我需要确定代码的主要组成部分。根据引用中的信息,系统通常包括以下几个部分:
1. 人脸数据采集:通过摄像头捕获人脸图像并保存。
2. 数据训练:使用采集的数据训练模型,如LBPH或dlib的模型。
3. 实时识别与考勤:实时检测人脸,与数据库中的特征进行比对,并记录考勤。
我需要考虑用户可能需要的基本功能,比如注册用户、人脸录入、训练模型、实时识别以及考勤记录。同时,确保代码使用OpenCV和Python,可能需要结合dlib进行人脸检测和识别,但用户提到OpenCV,所以可能需要优先使用OpenCV自带的face模块,比如LBPHFaceRecognizer。
然后,我需要检查代码的正确性。例如,确保OpenCV的版本兼容性,因为有些函数在较新版本中可能有变化。例如,cv2.face.LBPHFaceRecognizer_create()在OpenCV-contrib-python包中,所以用户需要安装正确的包。
另外,引用3提到欧式距离小于等于0.4时进行匹配,这可能涉及到人脸特征值的比较。不过,在示例代码中使用LBPH模型,其predict函数会返回标签和置信度,所以可能需要根据置信度来判断是否匹配。
数据库部分,用户可能需要存储用户信息和考勤记录。示例中使用SQLite是合适的,因为它是轻量级的,适合小型项目。
在编写代码时,需要注意异常处理,例如摄像头是否打开成功,文件路径是否存在等。同时,线程的使用可以提高实时检测的效率,避免界面卡顿,这在引用2中提到了多线程的应用。
此外,用户可能需要界面,但根据问题,用户可能只需要核心代码,所以示例可能不包含GUI部分,或者简单使用控制台输出。
最后,测试各个模块是否能正常工作,例如数据采集是否保存图像,训练是否生成模型文件,实时识别是否能正确检测和记录考勤。
总结下来,我需要分步骤编写代码,确保每个部分的功能明确,并提供必要的注释。同时,在相关问题部分,考虑用户可能进一步询问的优化方法、性能分析或其他功能扩展。</think>以下是一个基于OpenCV和Python的人脸考勤系统完整实现示例,包含核心功能模块和代码说明:
```python
import cv2
import os
import numpy as np
import sqlite3
from datetime import datetime
# 创建数据库连接
conn = sqlite3.connect('attendance.db')
c = conn.cursor()
# 创建数据表
c.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
face_id INTEGER UNIQUE)''')
c.execute('''CREATE TABLE IF NOT EXISTS attendance
(id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
check_time DATETIME,
FOREIGN KEY(user_id) REFERENCES users(id))''')
# 初始化人脸检测器
face_detector = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()
def register_user(name):
"""注册新用户"""
# 生成face_id
face_id = get_new_face_id()
c.execute("INSERT INTO users (name, face_id) VALUES (?, ?)", (name, face_id))
conn.commit()
return face_id
def get_new_face_id():
"""获取新face_id"""
c.execute("SELECT MAX(face_id) FROM users")
result = c.fetchone()
return 1 if result[0] is None else result[0] + 1
def collect_dataset(face_id, sample_count=30):
"""采集人脸样本"""
cam = cv2.VideoCapture(0)
print("正在采集人脸数据...")
count = 0
dataset_path = 'dataset'
if not os.path.exists(dataset_path):
os.makedirs(dataset_path)
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
# 保存人脸样本
cv2.imwrite(f"{dataset_path}/User.{face_id}.{count}.jpg", gray[y:y+h,x:x+w])
cv2.imshow('采集数据', img)
if cv2.waitKey(100) & 0xff == 27 or count >= sample_count:
break
cam.release()
cv2.destroyAllWindows()
def train_model():
"""训练识别模型"""
path = 'dataset'
image_paths = [os.path.join(path,f) for f in os.listdir(path)]
faces = []
labels = []
for image_path in image_paths:
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
face_id = int(os.path.split(image_path)[-1].split(".")[1])
faces.append(img)
labels.append(face_id)
recognizer.train(faces, np.array(labels))
recognizer.save('trainer.yml')
print("模型训练完成")
def mark_attendance(user_id):
"""记录考勤"""
now = datetime.now()
c.execute("INSERT INTO attendance (user_id, check_time) VALUES (?, ?)",
(user_id, now.strftime("%Y-%m-%d %H:%M:%S")))
conn.commit()
def realtime_recognition():
"""实时识别考勤"""
cam = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
face_roi = gray[y:y+h, x:x+w]
label, confidence = recognizer.predict(face_roi)
if confidence < 60: # 置信度阈值
c.execute("SELECT id FROM users WHERE face_id=?", (label,))
result = c.fetchone()
if result:
user_id = result[0]
mark_attendance(user_id)
cv2.putText(img, f'ID:{label}', (x,y-5), font, 1, (0,255,0), 2)
else:
cv2.putText(img, 'Unknown', (x,y-5), font, 1, (0,0,255), 2)
cv2.imshow('人脸考勤', img)
if cv2.waitKey(10) & 0xff == 27:
break
cam.release()
cv2.destroyAllWindows()
# 使用示例
if __name__ == "__main__":
# 注册新用户
user_name = input("请输入用户名: ")
face_id = register_user(user_name)
# 采集人脸数据
collect_dataset(face_id)
# 训练模型
train_model()
# 启动实时考勤
realtime_recognition()
conn.close()
```
阅读全文
相关推荐


















