使用face_recognition
和OpenCV
库完成人脸检测和识别任务:
# 导入必要的库
import cv2 # OpenCV库,用于图像处理
import face_recognition # 人脸识别库
import numpy as np # 数值计算库
# 步骤1:加载已知人脸的图片并编码
# 加载乔布斯的图片并编码
jobs_image = face_recognition.load_image_file("known_people/jobs.jpg")
jobs_encoding = face_recognition.face_encodings(jobs_image)[0] # 提取第一张人脸的编码
# 加载盖茨的图片并编码
gates_image = face_recognition.load_image_file("known_people/gates.jpg")
gates_encoding = face_recognition.face_encodings(gates_image)[0]
# 创建已知人脸编码和对应姓名的列表
known_face_encodings = [jobs_encoding, gates_encoding]
known_face_names = ["Steve Jobs", "Bill Gates"]
# 步骤2:加载待识别的未知图片
unknown_image = face_recognition.load_image_file("unknown_person/test.jpg")
# 将图片从BGR颜色空间转换为RGB(face_recognition使用RGB格式)
unknown_image_rgb = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)
# 步骤3:在未知图片中查找所有人脸并编码
# 检测人脸位置
face_locations = face_recognition.face_locations(unknown_image_rgb)
# 提取人脸编码
face_encodings = face_recognition.face_encodings(unknown_image_rgb, face_locations)
# 步骤4:遍历未知图片中的每张人脸进行识别
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
# 比较当前人脸与已知人脸库
matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
name = "Unknown" # 默认标记为未知
# 计算与已知人脸的相似度距离
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
# 获取最相似的人脸索引
best_match_index = np.argmin(face_distances)
# 如果找到匹配项
if matches[best_match_index]:
name = known_face_names[best_match_index]
# 步骤5:在图片上绘制人脸框和名称
cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2) # 绘制绿色矩形框
cv2.putText(unknown_image, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX,
0.8, (0, 255, 0), 2) # 在框上方添加名称
# 步骤6:显示识别结果
cv2.imshow('Face Recognition', unknown_image)
cv2.waitKey(0) # 等待任意按键
cv2.destroyAllWindows() # 关闭所有窗口
代码解析及行作用说明:
-
库导入
import cv2 import face_recognition import numpy as np
cv2
:OpenCV库,用于图像处理和显示face_recognition
:基于dlib的人脸识别库numpy
:数值计算库,处理数组数据
-
加载并编码已知人脸
jobs_image = face_recognition.load_image_file("known_people/jobs.jpg") jobs_encoding = face_recognition.face_encodings(jobs_image)[0]
load_image_file
:加载图片文件face_encodings
:提取人脸的特征编码(返回列表,取第一个元素)
-
创建已知人脸数据库
known_face_encodings = [jobs_encoding, gates_encoding] known_face_names = ["Steve Jobs", "Bill Gates"]
- 存储已知人脸的编码和对应的姓名
-
处理待识别图片
unknown_image = face_recognition.load_image_file("unknown_person/test.jpg") unknown_image_rgb = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)
- 加载待识别图片
- 将颜色空间从BGR转换为RGB(face_recognition需要RGB格式)
-
检测并编码未知人脸
face_locations = face_recognition.face_locations(unknown_image_rgb) face_encodings = face_recognition.face_encodings(unknown_image_rgb, face_locations)
face_locations
:检测图片中所有人脸的位置(返回坐标列表)face_encodings
:提取每张人脸的特征编码
-
人脸识别与匹配
matches = face_recognition.compare_faces(known_face_encodings, face_encoding) face_distances = face_recognition.face_distance(known_face_encodings, face_encoding) best_match_index = np.argmin(face_distances)
compare_faces
:比较当前人脸与已知人脸库,返回布尔值列表face_distance
:计算与每个已知人脸的相似度距离argmin
:找到最相似人脸的索引
-
绘制识别结果
cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(unknown_image, name, (left, top - 10), ...)
- 用绿色矩形框标记人脸位置
- 在人脸框上方显示识别出的姓名
-
显示结果图像
cv2.imshow('Face Recognition', unknown_image) cv2.waitKey(0) cv2.destroyAllWindows()
- 显示处理后的图片
- 等待用户按键后关闭窗口
详细解析
-
安装依赖库
pip install opencv-python pip install face-recognition
-
准备图片
- 创建文件夹结构:
├── known_people/ │ ├── jobs.jpg │ └── gates.jpg └── unknown_person/ └── test.jpg
- 图片建议使用正面清晰的人脸照片
- 创建文件夹结构:
-
运行代码
- 将代码中的图片路径替换为实际路径
- 直接运行Python脚本
工作原理
- 人脸编码:将人脸转换为128维的特征向量
- 特征比对:通过计算欧氏距离比较人脸相似度
- 阈值判断:默认距离小于0.6则认为匹配(可通过
tolerance
参数调整)
扩展方向
- 添加实时摄像头识别功能
- 增加人脸数据库规模
- 添加人脸识别置信度显示
- 集成到Web应用中