基于OpenCV的人脸识别:FisherFaceRecognizer算法
文章目录
- 引言
- 一、概述
- 二、代码实现
- 1. 中文文本显示函数
- 2. 图像预处理
- 3. 训练数据准备
- 4. 创建和训练识别器
- 5. 预测和结果显示
- 三、系统效果
- 总结
引言
在计算机视觉领域,人脸识别是一个重要且实用的研究方向。本文将介绍如何使用Python和OpenCV库构建一个简单的人脸识别系统,能够区分不同的人物并显示识别结果。
一、概述
这个系统使用OpenCV的FisherFaceRecognizer算法,通过训练少量样本图片,实现对输入图像的分类识别。系统主要功能包括:
- 加载训练图像并预处理
- 训练FisherFace识别器
- 对测试图像进行预测
- 在图像上显示中文识别结果
二、代码实现
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)
三、系统效果
运行程序后,系统会:
- 读取测试图像并进行预处理
- 使用训练好的模型进行预测
- 在控制台输出识别结果和置信度
- 在原图上显示中文识别结果,并缩小显示
总结
这个简单的系统展示了如何使用OpenCV实现基本的人脸识别功能。虽然只使用了少量训练样本,但已经能够完成基本的分类任务。实际应用中,我们可以:
- 增加更多训练样本提高准确性
- 使用更先进的算法如LBPH或深度学习模型
- 添加人脸检测步骤实现全自动识别
- 构建更完善的用户界面
完整代码已在上文展示,读者可以根据需要调整参数或扩展功能。希望这篇教程能帮助你入门人脸识别技术!