# 实时人脸识别系统:基于 OpenCV 和 Python 的实现

发布于:2025-04-03 ⋅ 阅读:(19) ⋅ 点赞:(0)

实时人脸识别系统:基于 OpenCV 和 Python 的实现

在当今数字化时代,人脸识别技术已经广泛应用于各种场景,从手机解锁到安防监控,再到智能门禁系统。今天,我将通过一个完整的代码示例,详细讲解如何使用 Python 和 OpenCV 实现一个实时人脸识别系统。这个系统不仅可以检测摄像头中的面部,还能识别出人脸的身份,并在图像上显示中文标签。

一、项目背景

人脸识别技术的核心在于能够快速、准确地识别出人脸,并将其与已知的身份进行匹配。OpenCV 是一个强大的计算机视觉库,它提供了丰富的图像处理和机器学习功能,非常适合用于实现人脸识别系统。在这个项目中,我们将结合 OpenCV 的人脸检测和识别功能,以及 Python 的灵活性,构建一个实时人脸识别系统。

二、技术栈

  • Python:一种广泛使用的高级编程语言,具有丰富的库和框架支持。
  • OpenCV:一个开源的计算机视觉库,提供了大量图像和视频处理功能。
  • Pillow:一个 Python 图像处理库,用于处理图像中的中文文本。

三、代码实现

1. 添加中文文本到图像

OpenCV 默认不支持中文字符,因此我们需要借助 Pillow 库来实现中文文本的绘制。以下是一个自定义函数 cv2AddChineseText,用于在图像上添加中文文本:

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
    """ 向图片中添加中文 """
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 实现array到image的转换
    draw = ImageDraw.Draw(img)  # 在img图片上创建一个绘图的对象
    # 字体的格式
    fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
    draw.text(position, text, textColor, font=fontStyle)  # 绘制文本
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # 转换回OpenCV格式

2. 准备训练数据

为了实现人脸识别,我们需要准备一些人脸图像作为训练数据。这些图像可以是同一人物的多张照片,也可以是不同人物的照片。我们将这些图像加载到一个列表中,并为每张图像分配一个标签:

def image_re(image):
    a = cv2.imread(image, 0)  # 以灰度模式读取图像
    a = cv2.resize(a, (120, 180))  # 调整图像大小
    images.append(a)

images = []
image_re('wp1.png')  # 加载人物1的图像1
image_re('wp2.png')  # 加载人物1的图像2
image_re('zjl1.png')  # 加载人物2的图像1
image_re('zjl2.png')  # 加载人物2的图像2

labels = [0, 0, 1, 1]  # 为每张图像分配标签,0表示人物1,1表示人物2

3. 训练人脸识别模型

我们将使用 OpenCV 提供的 FisherFace 人脸识别算法来训练模型。FisherFace 是一种经典的人脸识别算法,基于线性判别分析(LDA)来优化特征提取:

recognizer = cv2.face.FisherFaceRecognizer_create(threshold=20000)
recognizer.train(images, np.array(labels))

4. 实时人脸检测与识别

接下来,我们将使用 OpenCV 的 Haar 特征级联分类器来检测摄像头中的面部,并使用训练好的模型进行识别。以下是完整的代码:

# 加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

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

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    for (x, y, w, h) in faces:
        face = gray[y:y+h, x:x+w]  # 提取人脸区域
        face = cv2.resize(face, (120, 180))  # 调整人脸大小以匹配训练数据
        label, confidence = recognizer.predict(face)  # 使用模型进行识别
        dic = {0: '我', 1: '周杰伦', -1: '无法识别'}  # 创建字典,将标签映射为人物名称
        text = dic.get(label, '未知')  # 获取识别结果
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)  # 绘制矩形框
        frame = cv2AddChineseText(frame, text, (x, y-10), textColor=(255, 0, 0))  # 添加中文标签

    cv2.imshow('Face Recognition', frame)  # 显示结果

    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按下 'q' 键退出
        break

cap.release()  # 释放摄像头资源
cv2.destroyAllWindows()  # 关闭所有窗口

四、运行效果

运行上述代码后,摄像头将打开并实时显示视频流。当检测到人脸时,程序会绘制一个矩形框,并在框上方显示识别结果(如“我”或“周杰伦”)。按下 'q' 键即可退出程序。

五、总结

通过上述代码,我们实现了一个完整的实时人脸识别系统。这个系统不仅能够检测摄像头中的面部,还能识别出人脸的身份,并在图像上显示中文标签。你可以根据自己的需求扩展这个系统,例如增加更多的人脸数据、优化识别算法或改进用户界面。

如果你对这个项目感兴趣,或者有任何问题,欢迎在评论区留言交流!