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