计算机视觉OpenCV中的FisherFace人脸识别

一、介绍

本次实现了一个基于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结果

相关推荐
EchoMind-Henry4 小时前
Muse外设两条接入路,成本该怎么算
人工智能·ai
Zootopia6264 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
阿部多瑞 ABU5 小时前
空能指的再生产:一个符号政治经济学的分析框架
人工智能·ai写作
xx_xxxxx_5 小时前
论文阅读-SAR
人工智能·深度学习·机器学习
桃西西呀5 小时前
LangChain 之七:回调与可观测
人工智能·langchain·llm
2601_960356385 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
桃西西呀5 小时前
LangChain 之六:记忆与历史
人工智能·langchain·llm
周杰伦fans5 小时前
8GB显存下模型量化实战指南
人工智能·后端·c#
秦先生在广东5 小时前
gstack 深度解析:AI 驱动的单人虚拟工程团队与端到端自动化
人工智能
Yyyyyy~5 小时前
【Anaconda】安装
人工智能·python