简单的Python人脸识别系统

  

简单的Python人脸识别系统

概述

Python人脸识别系统一般由以下几个模块构成:

  1. 摄像头模块:通过电脑或者外接摄像头采集照片或者视频
  2. 人脸检测模块:使用人脸检测算法从采集的照片或者视频中提取人脸图像
  3. 人脸特征提取与比对模块:对于每个人,在系统中维护一个特征向量用于表示一个人的特征,新采集到的人脸图像与系统中维护的人脸特征向量进行比对,判断是否为同一人

安装依赖包

Python人脸识别系统需要借助一些第三方库实现,需要通过pip安装。以下是需要安装的库:

pip install opencv-python
pip install face-recognition
pip install numpy

示例1:采集人脸图像并提取特征

import cv2
import face_recognition

# 打开摄像头
cap = cv2.VideoCapture(0)

# 循环采集人脸图像直到按下q键结束
while True:
    # 获取当前摄像头采集的帧
    ret, frame = cap.read()

    # 翻转图像,因为摄像头默认将图像水平翻转
    frame = cv2.flip(frame, 1)

    # 将图像从BGR颜色空间转换到RGB颜色空间
    rgb_frame = frame[:, :, ::-1]

    # 检测人脸
    face_locations = face_recognition.face_locations(rgb_frame)

    if len(face_locations) > 0:
        # 提取人脸特征
        face_encoding = face_recognition.face_encodings(rgb_frame, known_face_locations=face_locations)[0]

        # 在摄像头采集的图像上绘制人脸边框
        for top, right, bottom, left in face_locations:
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # 将采集到的人脸特征保存到文件,文件名为当前时间戳
        with open(str(int(time.time())) + ".fe", "wb") as f:
            f.write(pickle.dumps(face_encoding))

    # 显示处理后的图像
    cv2.imshow('Video', frame)

    # 按下q键结束程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源和窗口
cap.release()
cv2.destroyAllWindows()

上述代码逻辑为:

  1. 打开摄像头
  2. 循环采集人脸图像直到按下q键结束
  3. 获取当前摄像头采集的帧
  4. 将图像从BGR颜色空间转换到RGB颜色空间
  5. 检测人脸
  6. 如果检测到人脸,提取人脸特征,并在采集到的图像上绘制人脸边框
  7. 将采集到的人脸特征保存到文件
  8. 显示处理后的图像
  9. 按下q键结束程序

示例2:对比采集人脸和系统中的人脸库进行比对

import glob
import pickle
import cv2
import face_recognition

# 加载已经保存的人脸数据
known_face_encodings = []
known_face_names = []
for file in glob.glob("*.fe"):
    with open(file, "rb") as f:
        known_face_encodings.append(pickle.load(f))
        known_face_names.append(file[:-3])

# 打开摄像头
cap = cv2.VideoCapture(0)

# 循环采集人脸图像直到按下q键结束
while True:
    # 获取当前摄像头采集的帧
    ret, frame = cap.read()

    # 翻转图像,因为摄像头默认将图像水平翻转
    frame = cv2.flip(frame, 1)

    # 将图像从BGR颜色空间转换到RGB颜色空间
    rgb_frame = frame[:, :, ::-1]

    # 检测人脸
    face_locations = face_recognition.face_locations(rgb_frame)

    if len(face_locations) > 0:
        # 提取人脸特征
        face_encoding = face_recognition.face_encodings(rgb_frame, known_face_locations=face_locations)[0]

        # 将采集到的人脸和系统中的人脸进行比对
        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]

        # 在摄像头采集的图像上绘制人脸边框和名字
        for top, right, bottom, left in face_locations:
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
            cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 1)

    # 显示处理后的图像
    cv2.imshow('Video', frame)

    # 按下q键结束程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源和窗口
cap.release()
cv2.destroyAllWindows()

上述代码逻辑为:

  1. 加载已经保存的人脸数据
  2. 打开摄像头
  3. 循环采集人脸图像直到按下q键结束
  4. 获取当前摄像头采集的帧
  5. 将图像从BGR颜色空间转换到RGB颜色空间
  6. 检测人脸
  7. 如果检测到人脸,提取人脸特征
  8. 将采集到的人脸和系统中的人脸进行比对
  9. 检索和采集人脸最相似的人脸
  10. 在摄像头采集的图像上绘制人脸边框和名字
  11. 显示处理后的图像
  12. 按下q键结束程序

以上两个示例包含了Python人脸识别系统的两个核心功能:采集人脸图像并提取特征和对比采集人脸和系统中的人脸库进行比对。

相关文章