计算机视觉OpenCV中的FisherFace人脸识别
2026/9/15 8:04:19 网站建设 项目流程

一、介绍

本次实现了一个基于OpenCV的FisherFace人脸识别的小示例,先读取几张已知人脸作为训练集,再读取一张待识别图片,训练FisherFace模型并预测它属于谁,最后把识别结果用中文画在图片上显示。

二、核心代码讲解

2.1导入库

cv2:OpenCV,用于读图、缩放、人脸识别、显示图像。

numpy:用于数值操作,训练标签需要转成np.array。

PIL:Python Imaging Library,这里主要用来在OpenCV图像上绘制中文,因为OpenCV自带的cv2.putText不支持中文。

2.2中文绘制函数

cv2AddChineseText这个函数的作用是:在OpenCV图像上写中文。

img:OpenCV图像。

text:要写的中文。

position:文字左上角坐标,例如(30,10)。

textColor:RGB颜色,默认绿色(0,255,0)。

textSize:字号。

关键点:

1.OpenCV默认颜色顺序是BGR,而PIL默认是RGB。

所以先用cv2.cvtColor(img,cv2.COLOR_RGB2BGR)把OpenCV图像转成PIL能正确显示的颜色。

2.使用ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")加载宋体字体。

3.draw.text(position, text, textColor, font=fontStyle)在指定位置画文字。

4.最后再转回OpenCV的BGR格式,方便cv2.imshow显示。

2.3读取并预处理训练图片

cv2.imread(img,0):以灰度图方式读取图片。

FisherFace训练通常使用灰度图,因为颜色信息对身份识别帮助不大,还会增加计算量。

cv2.resize(a,(120 180)):把图片统一缩放成宽120、高180。所有人脸图片必须尺寸一致,否则无法训练。

images.append(a):把处理后的图片加入全局列表images。

2.4准备训练数据并读取待预测图片

前两张是黎明,标签为0。

后两张是安志杰,标签为1。

读取待识别图片liming.png,同样转灰度并缩放到120*180

模型理想情况下应预测为0,即“黎明”。

2.5创建FisherFace识别器

这行创建一个FisherFace人脸识别模型。

FisherFace的核心思想是:

使用LDA,线性判别分析。

它不只想PCA那样保留最大方差方向,而是利用类别标签,让同类样本尽量聚在一起,不同类样本尽量分开。

因此,FisherFace通常比EigenFace更适合做分类。

OpenCV内部通常会先做PCA降维,再做LDA,避免类内散度矩阵不可逆。

threshold=5000是预测阈值:

predict()会返回一个confidence,可以理解为距离或置信度,越小表示越可信。

如果最小距离大于5000,模型就认为无法识别,返回标签-1。

2.6训练模型和预测

images:训练图片列表,每张都是120*180的灰度图。

labels:对应标签,必须转成np.array。

训练后,模型会学习如何把不同人脸投影到一个更容易区分的空间。

label:预测出的类别标签。

confidence:置信度,越小越好。

2.7结果

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询