Skip to content

QQ767172261/----Python---OpenCV---Tkinter---GUI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 

Repository files navigation

如何使用深度学习框架 建立基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI @[toc] 以下文字及代码仅供参考。

基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI 在这里插入图片描述

人脸识别系统(人脸签到) 在这里插入图片描述

预实现功能: Python+opencv库+tk库 输入姓名学号录入人脸采集数据,保存信息后可进行人脸识别 在这里插入图片描述

识别出来的人脸信息可以进行签到,会显示对应的签到信息

所有录入的人脸和签到的内容会保存在对应的表内,可以打开查看

看如何建立这套检测人脸的签到系统

要构建一个基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI。以下是一个完整的实现步骤,包括数据录入、人脸采集、保存信息、人脸识别和签到功能。

1. 安装依赖

首先安装必要的库:

pip install opencv-python-headless numpy pillow tkinter

2. 准备数据集

创建一个文件夹来存储人脸图像和签到记录。

mkdir dataset
mkdir dataset/faces
mkdir dataset/checkins

3. 编写代码

我们将分步编写代码,包括数据录入、人脸采集、保存信息、人脸识别和签到功能。

3.1 数据录入和人脸采集

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()

3.2 人脸识别和签到

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()

4. 签到记录

为了记录签到信息,我们可以使用 SQLite 数据库来存储签到记录。

4.1 安装 SQLite 库

pip install sqlite3

4.2 创建数据库和表

import 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()

4.3 更新签到记录

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()

5. 整合所有功能

将上述代码整合在一起,形成一个完整的系统。

6. 运行程序

运行上述代码,启动应用程序,进行人脸录入、识别和签到。

注意事项

  • 确保摄像头正常工作。
  • 根据实际需求调整人脸检测和识别参数。
  • 可以进一步优化界面和功能。

通过以上步骤,同学可以构建基本的人脸识别签到系统。

About

如何使用深度学习框架 建立基于 Python 的人脸识别签到系统,使用 OpenCV 进行人脸检测和识别,并使用 Tkinter 构建 GUI

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors