使用Python3和OpenCV进行简单的人脸识别教程

需积分: 10 0 下载量 161 浏览量 更新于2024-12-21 收藏 3.39MB ZIP 举报
资源摘要信息:"face_recognition::woman_light_skin_tone:随时随地进行人脸识别" 人脸识别技术是计算机视觉领域中的一项重要技术,它可以识别和验证人脸图像中的人物。随着技术的进步,人脸识别系统已经从最初的科研领域逐渐走入普通大众的生活,成为了安全验证、智能相册分类、人机交互等场景中的关键技术之一。本资源将提供一个使用Python 3语言结合开源库face_recognition进行人脸识别的简单入门指南。 face_recognition是一个易于使用的Python库,专为简化人脸识别任务而设计。它基于Dlib的深度学习模型构建,支持人脸检测、识别和学习等功能。该库在GitHub上拥有较高的star数,表明了其广泛的社区支持和受欢迎程度。 使用face_recognition库进行人脸识别的基本步骤如下: 1. 准备数据集:收集并整理人脸图片,每个需要识别的人创建一个单独的文件夹,并将该人的图片放入对应的文件夹中。文件夹的名字即为人名,例如,“张三”文件夹下的所有图片都是张三的正面照片。 2. 安装依赖项:人脸识别项目通常需要安装一些特定的依赖库。在本资源描述中,需要安装CMake,build-essential,cmake,pkg-config等基本构建工具,以及通过pip3安装face_recognition库所需的依赖项。 3. 安装face_recognition库:在命令行中运行sudo pip3 install -r requirements.txt命令来安装所有必需的依赖项。这个步骤可能会花费一些时间,因为Dlib的安装需要从源代码构建。 4. 使用face_recognition库进行人脸识别:一旦安装完成,开发者可以编写Python代码来读取准备好的数据集,并使用库中的函数进行人脸识别和处理。例如,可以创建一个人脸数据库,然后将新的图片与数据库中已有的人脸进行比对,以验证身份。 5. 数据集存储建议:虽然不是强制性的,但是建议将所有包含人脸图片的目录移动到一个名为data/raw_data/的文件夹下。这样做有助于保持项目结构的清晰,并使得数据管理变得更加方便。 本资源的标签包括"neural-networks"(神经网络)、"face-detector"(面部检测器)、"face-recognition"(人脸识别)和"Python"(Python语言)。这些标签凸显了该资源的主要内容和技能要求。 标签中的"neural-networks"表明在人脸识别过程中,可能会涉及到深度学习技术,特别是神经网络的训练和应用。"face-detector"提示该资源会教授如何利用face_recognition库进行人脸检测,这是人脸识别的一个重要前置步骤。"face-recognition"直接指出本资源的重点,即如何利用Python实现人脸识别功能。最后,"Python"作为编程语言,说明了本资源会涉及的编程语言知识。 "face_recognition-master"是压缩包子文件的文件名称列表,表明这是一个开源项目,用户可以下载该项目的源代码以供研究或应用。在使用前,开发者需要解压该文件,通常可以使用unzip等命令行工具来完成解压工作。 总之,本资源提供了一个非常实用的指南,帮助开发者使用Python和face_recognition库来搭建一个简单的人脸识别系统。通过遵循上述步骤,开发者可以快速开始构建和实现自己的人脸识别项目。

import face_recognition import cv2 import os unknow_people_list = [i for i in os.listdir('unknow_people') if (i.endswith('.jpg')) or (i.endswith('.png')) or (i.endswith('.jpeg'))] know_people_list = [i for i in os.listdir('know_people') if (i.endswith('.jpg')) or (i.endswith('.png')) or (i.endswith('.jpeg'))] def face_select(): for unknow_people in unknow_people_list: # 读取待识别图片 unknow = face_recognition.load_image_file('unknow_people/' + unknow_people) # 将待识别图片转化为特征向量 unknow_encode = face_recognition.face_encodings(unknow)[0] flag = False for know_people in know_people_list: # 读取计算机已经认识的图片 know = face_recognition.load_image_file('know_people/' + know_people) # 获得面部位置 face_location1 = face_recognition.face_locations(know) face_location2 = face_recognition.face_locations(unknow) # 提取面部关键点 face_landmarks_list1 = face_recognition.face_landmarks(know) face_landmarks_list2 = face_recognition.face_landmarks(unknow) # 图片转化为特征向量 know_encode = face_recognition.face_encodings(know)[0] # 两张图片进行比较的结果 res = face_recognition.compare_faces([know_encode], unknow_encode, tolerance=0.5) if res[0]: flag = True name = know_people.split(".")[0] break if flag: print(f'{name}匹配成功!') else: print(f'匹配失败') name = "UNKNOWN" # 绘制人脸特征点和矩形框 for (x1, y1, w1, h1) in face_location1: cv2.rectangle(know, (y1, x1), (h1, w1), (255, 0, 0), 2) cv2.putText(know, name, (y1 - 10, x1 - 10), cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 0), 2) for face_landmarks in face_landmarks_list1: for facial_feature in face_landmarks.keys(): for pt_pos in face_landmarks[facial_feature]: cv2.circle(know, pt_pos, 1, (192, 192, 192), 2) for (x1, y1, w1, h1) in face_location2: cv2.rectangle(unknow, (y1, x1), (h1, w1), (255, 0, 0), 2) cv2.putText(unknow, name, (y1 - 10, x1 - 10), cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 0), 2) for face_landmarks in face_landmarks_list2: for facial_feature in face_landmarks.keys(): for pt_pos in face_landmarks[facial_feature]: cv2.circle(unknow, pt_pos, 1, (192, 192, 192), 2) # 显示图片 cv2.imshow("known", know) cv2.imshow("unknown", unknow) cv2.waitKey(0) if __name__ == '__main__': face_select()

2023-06-02 上传

import cv2 import face_recognition import numpy as np from PIL import Image, ImageDraw,ImageFont video_capture = cv2.VideoCapture(r'C:/Users/ALIENWARE/123.mp4')#如果输入是(0)为摄像头输入 #现输入为MP4进行识别检测人脸 first_image = face_recognition.load_image_file("1.jpg") first_face_encoding = face_recognition.face_encodings(first_image)[0] Second_image = face_recognition.load_image_file("2.jpg") Second_face_encoding = face_recognition.face_encodings(Second_image)[0] third_image = face_recognition.load_image_file("3.jpg") third_face_encoding = face_recognition.face_encodings(third_image)[0] inside_face_encodings = [first_face_encoding,Second_face_encoding,third_face_encoding] inside_face_names = ['A','B','C'] face_locations = [] face_encodings = [] face_names = [] process_this_frame = True while True: ret, frame = video_capture.read() small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) rgb_small_frame = small_frame[:, :, ::-1] if process_this_frame: face_locations = face_recognition.face_locations(rgb_small_frame) face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) face_names = [] for face_encoding in face_encodings: matches = face_recognition.compare_faces(inside_face_encodings, face_encoding) name = '未录入人脸' if True in matches: first_match_index = matches.index(True) name = inside_face_names[first_match_index] face_names.append(name) process_this_frame = not process_this_frame for (top, right, bottom, left), name in zip(face_locations, face_names): top *= 4 right *= 4 bottom *= 4 left *= 4 cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) img_pil = Image.fromarray(frame) draw = ImageDraw.Draw(img_pil) fontStyle = ImageFont.truetype("C:/Windows/Fonts/simsun.ttc", 32, encoding="utf-8") draw.text((left + 6, bottom - 6), name, (0, 200, 0), font=fontStyle) frame = np.asarray(np.array(img_pil)) cv2.imshow('face_out', frame) if cv2.waitKey(1) & 0xFF == ord('q'): #退出需要按下Q键否则内核会崩溃 break video_capture.release() cv2.destroyAllWindows()

2023-06-07 上传