用python写一个人脸识别的门禁系统
时间: 2024-05-10 17:14:51 浏览: 180
要实现人脸识别门禁系统,一般需要以下步骤:
1.采集人脸数据:使用摄像头或者其他设备采集人脸图像,可以使用OpenCV库来实现。
2.提取人脸特征:使用人脸检测算法(如Haar特征检测器或者深度学习模型),将人脸从图像中提取出来,并提取出人脸的特征向量(如使用OpenFace或者FaceNet等模型)。
3.训练模型:使用机器学习算法或深度学习模型来训练人脸识别模型,例如使用SVM或者神经网络模型训练。
4.门禁系统:使用训练好的模型实现门禁系统,对于访客或者未注册用户,需要进行注册,将其人脸数据存储在数据库中,以便后续识别。
下面是一个简单的人脸识别门禁系统的实现代码:
```
import cv2
import numpy as np
import os
# 加载训练好的人脸识别模型
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.read('model.yml')
# 加载人脸检测器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 加载训练集人员名单
with open('names.txt') as f:
names = f.read().splitlines()
# 采集人脸数据
def capture_face():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
for (x, y, w, h) in faces:
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
# 提取人脸特征向量
features = extract_features(roi_gray)
# 进行人脸识别
label, confidence = face_recognizer.predict(features)
# 显示人脸区域和识别结果
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
if confidence < 100:
name = names[label]
cv2.putText(frame, name, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
else:
cv2.putText(frame, "Unknown", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# 提取人脸特征向量
def extract_features(roi_gray):
face_resize = cv2.resize(roi_gray, (100, 100))
features = np.array(face_resize, 'uint8')
return features.flatten()
# 添加新用户
def add_user(name):
cap = cv2.VideoCapture(0)
count = 0
while True:
ret, frame = cap.read()
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
for (x, y, w, h) in faces:
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
# 保存人脸图像
cv2.imwrite('dataset/' + name + '/' + str(count) + '.jpg', roi_gray)
count += 1
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.putText(frame, "Capturing Face", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q') or count == 30:
break
cap.release()
cv2.destroyAllWindows()
# 训练人脸识别模型
train_model()
# 训练人脸识别模型
def train_model():
faces = []
labels = []
for name in os.listdir('dataset'):
label = names.index(name)
for image_name in os.listdir('dataset/' + name):
image_path = 'dataset/' + name + '/' + image_name
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
features = extract_features(image)
faces.append(features)
labels.append(label)
face_recognizer.train(faces, np.array(labels))
face_recognizer.write('model.yml')
print('Training complete.')
# 主函数
if __name__ == '__main__':
while True:
print('1. 开始识别')
print('2. 添加用户')
print('3. 退出程序')
choice = input('请输入选项: ')
if choice == '1':
capture_face()
elif choice == '2':
name = input('请输入姓名: ')
os.makedirs('dataset/' + name, exist_ok=True)
add_user(name)
elif choice == '3':
break
else:
print('无效选项,请重新输入。')
```
这个程序可以实现基本的人脸识别门禁系统,可以识别已注册用户的人脸,并允许其进入,对于未注册用户可以要求其进行注册。但是这个程序还可以做得更加完善,例如可以添加人脸活体检测,提高识别的准确性,也可以使用更加先进的人脸识别模型来提高识别的准确性和效率。
阅读全文