如何使用深度学习框架 建立基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI @[toc] 以下文字及代码仅供参考。
基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI
预实现功能:
Python+opencv库+tk库
输入姓名学号录入人脸采集数据,保存信息后可进行人脸识别
识别出来的人脸信息可以进行签到,会显示对应的签到信息
所有录入的人脸和签到的内容会保存在对应的表内,可以打开查看
看如何建立这套检测人脸的签到系统
要构建一个基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI。以下是一个完整的实现步骤,包括数据录入、人脸采集、保存信息、人脸识别和签到功能。
首先安装必要的库:
pip install opencv-python-headless numpy pillow tkinter创建一个文件夹来存储人脸图像和签到记录。
mkdir dataset
mkdir dataset/faces
mkdir dataset/checkins我们将分步编写代码,包括数据录入、人脸采集、保存信息、人脸识别和签到功能。
import cv2
import os
import tkinter as tk
from tkinter import messagebox, simpledialog
from PIL import Image, ImageTk
# 创建主窗口
root = tk.Tk()
root.title("人脸识别签到系统")
# 输入框和按钮
name_entry = tk.Entry(root)
name_entry.grid(row=0, column=1)
id_entry = tk.Entry(root)
id_entry.grid(row=1, column=1)
def capture_faces():
name = name_entry.get()
id = id_entry.get()
if not name or not id:
messagebox.showerror("错误", "请输入姓名和学号")
return
# 创建目录
path = f"dataset/faces/{name}_{id}"
os.makedirs(path, exist_ok=True)
# 捕捉人脸
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
count = 0
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
count += 1
cv2.imwrite(f"{path}/{count}.jpg", gray[y:y+h, x:x+w])
cv2.imshow('Capture Faces', frame)
k = cv2.waitKey(100) & 0xff
if k == 27: # ESC键退出
break
elif count >= 30: # 捕捉30张图片后退出
break
cap.release()
cv2.destroyAllWindows()
messagebox.showinfo("成功", "人脸采集完成")
capture_button = tk.Button(root, text="拍摄照片", command=capture_faces)
capture_button.grid(row=2, column=1)
save_button = tk.Button(root, text="保存信息", command=lambda: messagebox.showinfo("保存", "信息已保存"))
save_button.grid(row=3, column=1)
# 显示人脸采集总数
total_label = tk.Label(root, text="人脸采集总数: 0")
total_label.grid(row=4, column=1)
root.mainloop()import cv2
import os
import numpy as np
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
# 加载人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 加载训练好的模型
recognizer = cv2.face.LBPHFaceRecognizer_create()
def train_recognizer():
# 获取所有人脸图像和对应的标签
paths = [os.path.join('dataset/faces', f) for f in os.listdir('dataset/faces')]
faces = []
ids = []
for path in paths:
images = [os.path.join(path, f) for f in os.listdir(path)]
for image_path in images:
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
faces.append(img)
ids.append(int(os.path.split(path)[-1].split('_')[1]))
recognizer.train(faces, np.array(ids))
recognizer.save('dataset/trained_model.yml')
train_recognizer()
def recognize_face():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
id, confidence = recognizer.predict(gray[y:y+h, x:x+w])
if confidence < 100:
id = int(id)
name = get_name_from_id(id)
confidence = " {0}%".format(round(100 - confidence))
else:
name = "unknown"
confidence = " {0}%".format(round(100 - confidence))
cv2.putText(frame, str(name), (x+5, y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
cv2.putText(frame, str(confidence), (x+5, y+h-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 1)
cv2.imshow('Recognize Face', frame)
k = cv2.waitKey(100) & 0xff
if k == 27: # ESC键退出
break
cap.release()
cv2.destroyAllWindows()
def get_name_from_id(id):
# 假设有一个数据库或文件存储了 ID 和姓名的对应关系
# 这里只是一个示例
names = {
1: "张三",
2: "李四",
3: "王五"
}
return names.get(id, "未知")
# 创建主窗口
root = tk.Tk()
root.title("人脸识别签到系统")
# 开始识别按钮
start_button = tk.Button(root, text="开始识别", command=recognize_face)
start_button.pack(pady=20)
# 退出按钮
exit_button = tk.Button(root, text="退出", command=root.quit)
exit_button.pack(pady=20)
root.mainloop()为了记录签到信息,我们可以使用 SQLite 数据库来存储签到记录。
pip install sqlite3import sqlite3
conn = sqlite3.connect('checkins.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS checkins
(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
date TEXT,
time TEXT)''')
conn.commit()
conn.close()def sign_in(name):
conn = sqlite3.connect('checkins.db')
c = conn.cursor()
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
c.execute("INSERT INTO checkins (name, date, time) VALUES (?, ?, ?)",
(name, current_time[:10], current_time[11:]))
conn.commit()
conn.close()将上述代码整合在一起,形成一个完整的系统。
运行上述代码,启动应用程序,进行人脸录入、识别和签到。
- 确保摄像头正常工作。
- 根据实际需求调整人脸检测和识别参数。
- 可以进一步优化界面和功能。
通过以上步骤,同学可以构建基本的人脸识别签到系统。


