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

实时人脸识别系统:基于 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' 键即可退出程序。

    五、总结

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

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

    作者:www_pp_

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于 OpenCV 和 Python 实现实时人脸识别系统的方法

    发表回复