基于OpenCV的人脸识别:FisherFaceRecognizer算法

引言

在计算机视觉领域,人脸识别是一个重要且实用的研究方向。本文将介绍如何使用Python和OpenCV库构建一个简单的人脸识别系统,能够区分不同的人物并显示识别结果。

一、概述

这个系统使用OpenCV的FisherFaceRecognizer算法,通过训练少量样本图片,实现对输入图像的分类识别。系统主要功能包括:

  1. 加载训练图像并预处理
  2. 训练FisherFace识别器
  3. 对测试图像进行预测
  4. 在图像上显示中文识别结果

二、代码实现

1. 中文文本显示函数

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))  # 转换到PIL格式
    draw = ImageDraw.Draw(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格式

这个函数解决了OpenCV原生不支持中文显示的问题,通过将图像转换为PIL格式,使用PIL的文本绘制功能添加中文,再转换回OpenCV格式。

2. 图像预处理

def image_re(image):
    a = cv2.imread(image, 0)  # 以灰度模式读取图像
    a = cv2.resize(a, (120, 180))  # 统一尺寸
    images.append(a)

所有训练图像都会被转换为灰度图并调整到相同尺寸(120×180),这是人脸识别算法的常见预处理步骤。

3. 训练数据准备

images = []
image_re('linyuner 1.jpg')
image_re('linyuner 3.jpg')
image_re('chendulin 1.jpg')
image_re('chendulin 2.jpg')

labels = [0, 0, 1, 1]  # 0代表林允儿,1代表陈都灵

这里我们准备了4张训练图片,2张林允儿(标签0),2张陈都灵(标签1)。

4. 创建和训练识别器

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

我们使用FisherFace算法创建识别器,并设置阈值为5000。FisherFace是一种基于线性判别分析(LDA)的人脸识别算法

5. 预测和结果显示

pre_image = cv2.imread('chendulin 3.jpg', 0)
pre_image = cv2.resize(pre_image, (120, 180))

label, confidence = recognizer.predict(pre_image)
dic = {0: '林允儿', 1: '陈都灵', -1: '无法识别'}
print("这人是:", dic[label])
print('置信度为:', confidence)

# 在图像上显示中文结果
aa = cv2AddChineseText(cv2.imread('chendulin 3.jpg').copy(), dic[label], (10, 30), textColor=(255, 0, 0))
aa = cv2.resize(aa, dsize=None, fy=0.6, fx=0.6)
cv2.imshow('xx', aa)
cv2.waitKey(0)

三、系统效果

运行程序后,系统会:

  1. 读取测试图像并进行预处理
  2. 使用训练好的模型进行预测
  3. 在控制台输出识别结果和置信度
  4. 在原图上显示中文识别结果,并缩小显示

在这里插入图片描述
在这里插入图片描述

总结

这个简单的系统展示了如何使用OpenCV实现基本的人脸识别功能。虽然只使用了少量训练样本,但已经能够完成基本的分类任务。实际应用中,我们可以:

  1. 增加更多训练样本提高准确性
  2. 使用更先进的算法如LBPH或深度学习模型
  3. 添加人脸检测步骤实现全自动识别
  4. 构建更完善的用户界面

完整代码已在上文展示,读者可以根据需要调整参数或扩展功能。希望这篇教程能帮助你入门人脸识别技术!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值