匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

如何用Python编写一个基于人脸识别的门禁系统?

如何用Python编写一个基于人脸识别的门禁系统?

在本文中,我将向您展示如何使用Python语言和OpenCV库构建一个基于人脸识别的门禁系统,该系统旨在识别已注册的人脸,并仅允许具有授权的人员进入。让我们开始吧!

技术准备:

为了构建这个门禁系统,您需要安装以下库:

- OpenCV - 用于处理图像和视频
- Pillow - 用于调整图像大小
- numpy - 提供多维数组
- face_recognition - 用于人脸识别

OpenCV安装:pip install opencv-python

Pillow安装:pip install pillow

numpy安装:pip install numpy

face_recognition安装:pip install face_recognition

步骤1:采集人脸数据

首先,我们需要采集需要进入安全区域的人员的数据,以便将其添加到系统的人脸库中。为此,我们将使用OpenCV捕获图像。以下是一些示例代码,演示如何捕获从摄像头传输的图像。

import cv2
 
cap = cv2.VideoCapture(0)
 
while True:
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
 
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
cap.release()
cv2.destroyAllWindows()

上述代码将捕获从摄像头传输的视频,并显示在窗口中。现在,我们需要将这些图像保存在系统中,以用于将来的人脸识别。

import cv2
import os
 
cap = cv2.VideoCapture(0)
 
# 您需要替换'person1'具有实际人名
person_name = 'person1'
 
directory = 'dataset'
path = os.path.join(directory, person_name)
 
# 创建一个目录来保存人脸数据
if not os.path.exists(path):
    os.makedirs(path)
 
# 以下代码将保存10个不同的图像
count = 0
while count < 10:
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
 
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
    if ret:
        # 将每张图像保存到磁盘
        file_name = os.path.join(path, '{}_{}.jpg'.format(person_name, count))
        cv2.imwrite(file_name, frame)
        count += 1
 
cap.release()
cv2.destroyAllWindows()

在上述代码中,我们定义了一个“person_name”变量,该变量是正在采集人脸数据的人员名称。此外,我们在系统中创建了一个名为“dataset”的目录,并将每个人的人脸数据保存到各自的目录中。默认情况下,我们将保存10张不同的图像,以确保我们可以捕获不同的面部表情和姿势。

步骤2:训练机器学习模型

接下来,我们需要使用OpenCV和face_recognition库训练机器学习模型,该模型将用于在以后的步骤中识别人脸。

以下是训练模型的示例代码:

import os
import cv2
import face_recognition
 
# 数据集目录
directory = 'dataset'
 
# 加载人脸数据并处理编码
known_encodings = []
known_names = []
 
for dirpath, dirnames, filenames in os.walk(directory):
    for name in filenames:
        if name.endswith('.jpg'):
            person_name = os.path.basename(dirpath)
            file_name = os.path.join(dirpath, name)
 
            image = face_recognition.load_image_file(file_name)
            encoding = face_recognition.face_encodings(image)[0]
 
            known_encodings.append(encoding)
            known_names.append(person_name)
 
# 训练模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
 
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:
        roi_color = frame[y:y + h, x:x + w]
        roi_color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB)
 
        # 获取人脸编码并识别人名
        face_encodings = face_recognition.face_encodings(roi_color)
        for face_encoding in face_encodings:
            match = face_recognition.compare_faces(known_encodings, face_encoding)
            name = "Unknown"
 
            if True in match:
                match_index = match.index(True)
                name = known_names[match_index]
 
            # 绘制人脸识别结果
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            cv2.putText(frame, name, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
 
    cv2.imshow('frame', frame)
 
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
cap.release()
cv2.destroyAllWindows()

该代码将加载采集的人脸数据,并使用face_recognition库对其进行编码。然后,我们采用OpenCV接口训练模型来识别图像中的人脸。最后,我们使用模型识别图像中的人脸,并将其与已知的人脸进行比较。

步骤3:构建门禁系统

现在,我们已经训练好了机器学习模型。接下来,我们将创建一个简单的门禁系统,只允许已授权的人员通过。以下是门禁系统的示例代码:

import os
import cv2
import face_recognition
 
# 数据集目录
directory = 'dataset'
 
# 加载人脸数据并处理编码
known_encodings = []
known_names = []
 
for dirpath, dirnames, filenames in os.walk(directory):
    for name in filenames:
        if name.endswith('.jpg'):
            person_name = os.path.basename(dirpath)
            file_name = os.path.join(dirpath, name)
 
            image = face_recognition.load_image_file(file_name)
            encoding = face_recognition.face_encodings(image)[0]
 
            known_encodings.append(encoding)
            known_names.append(person_name)
 
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
 
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)
 
    found_persons = []
 
    for (x, y, w, h) in faces:
        roi_color = frame[y:y + h, x:x + w]
        roi_color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB)
 
        # 获取人脸编码并识别人名
        face_encodings = face_recognition.face_encodings(roi_color)
        for face_encoding in face_encodings:
            match = face_recognition.compare_faces(known_encodings, face_encoding)
            name = "Unknown"
 
            if True in match:
                match_index = match.index(True)
                name = known_names[match_index]
                found_persons.append(name)
 
            # 绘制人脸识别结果
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            cv2.putText(frame, name, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
 
    # 检查找到的人是否已授权
    authorized_persons = ['person1', 'person2', 'person3']  # 替换为已授权人员的名称
 
    for person in found_persons:
        if person not in authorized_persons:
            cv2.putText(frame, 'Unauthorized', (0, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2)
            break
 
    cv2.imshow('frame', frame)
 
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
cap.release()
cv2.destroyAllWindows()

该代码将使用OpenCV和face_recognition库来构建门禁系统。它将加载已经训练好的机器学习模型,并使用它来识别人脸。接下来,它将检查找到的人是否已授权。如果已授权,则允许该人通过门禁系统,否则将显示“未经授权”的文本。

结论:

在本文中,我们介绍了如何使用Python语言和OpenCV库构建一个基于人脸识别的门禁系统。该系统将识别已注册的人脸,并仅允许授权人员进入。如果您按照上述步骤执行,则应该能够轻松构建一个强大的门禁系统。