如何用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库构建一个基于人脸识别的门禁系统。该系统将识别已注册的人脸,并仅允许授权人员进入。如果您按照上述步骤执行,则应该能够轻松构建一个强大的门禁系统。