一个简单的人脸识别demo

使用face_recognitionOpenCV库完成人脸检测和识别任务:

# 导入必要的库
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()  # 关闭所有窗口

代码解析及行作用说明:

  1. 库导入

    import cv2
    import face_recognition
    import numpy as np
    
    • cv2:OpenCV库,用于图像处理和显示
    • face_recognition:基于dlib的人脸识别库
    • numpy:数值计算库,处理数组数据
  2. 加载并编码已知人脸

    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:提取人脸的特征编码(返回列表,取第一个元素)
  3. 创建已知人脸数据库

    known_face_encodings = [jobs_encoding, gates_encoding]
    known_face_names = ["Steve Jobs", "Bill Gates"]
    
    • 存储已知人脸的编码和对应的姓名
  4. 处理待识别图片

    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格式)
  5. 检测并编码未知人脸

    face_locations = face_recognition.face_locations(unknown_image_rgb)
    face_encodings = face_recognition.face_encodings(unknown_image_rgb, face_locations)
    
    • face_locations:检测图片中所有人脸的位置(返回坐标列表)
    • face_encodings:提取每张人脸的特征编码
  6. 人脸识别与匹配

    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:找到最相似人脸的索引
  7. 绘制识别结果

    cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2)
    cv2.putText(unknown_image, name, (left, top - 10), ...)
    
    • 用绿色矩形框标记人脸位置
    • 在人脸框上方显示识别出的姓名
  8. 显示结果图像

    cv2.imshow('Face Recognition', unknown_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 显示处理后的图片
    • 等待用户按键后关闭窗口

详细解析

  1. 安装依赖库

    pip install opencv-python
    pip install face-recognition
    
  2. 准备图片

    • 创建文件夹结构:
      ├── known_people/
      │   ├── jobs.jpg
      │   └── gates.jpg
      └── unknown_person/
          └── test.jpg
      
    • 图片建议使用正面清晰的人脸照片
  3. 运行代码

    • 将代码中的图片路径替换为实际路径
    • 直接运行Python脚本

工作原理

  1. 人脸编码:将人脸转换为128维的特征向量
  2. 特征比对:通过计算欧氏距离比较人脸相似度
  3. 阈值判断:默认距离小于0.6则认为匹配(可通过tolerance参数调整)

扩展方向

  • 添加实时摄像头识别功能
  • 增加人脸数据库规模
  • 添加人脸识别置信度显示
  • 集成到Web应用中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值