ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

计算机视觉OpenCV中的FisherFace人脸识别 一、介绍本次实现了一个基于OpenCV的FisherFace人脸识别的小示例先读取几张已知人脸作为训练集再读取一张待识别图片训练FisherFace模型并预测它属于谁最后把识别结果用中文画在图片上显示。二、核心代码讲解2.1导入库cv2OpenCV,用于读图、缩放、人脸识别、显示图像。numpy用于数值操作训练标签需要转成np.array。PILPython Imaging Library这里主要用来在OpenCV图像上绘制中文因为OpenCV自带的cv2.putText不支持中文。2.2中文绘制函数cv2AddChineseText这个函数的作用是在OpenCV图像上写中文。imgOpenCV图像。text要写的中文。position文字左上角坐标例如3010。textColorRGB颜色默认绿色02550。textSize字号。关键点1.OpenCV默认颜色顺序是BGR而PIL默认是RGB。所以先用cv2.cvtColor(img,cv2.COLOR_RGB2BGR)把OpenCV图像转成PIL能正确显示的颜色。2.使用ImageFont.truetype(simsun.ttc, textSize, encodingutf-8)加载宋体字体。3.draw.text(position, text, textColor, fontfontStyle)在指定位置画文字。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避免类内散度矩阵不可逆。threshold5000是预测阈值predict()会返回一个confidence可以理解为距离或置信度越小表示越可信。如果最小距离大于5000模型就认为无法识别返回标签-1。2.6训练模型和预测images:训练图片列表每张都是120*180的灰度图。labels对应标签必须转成np.array。训练后模型会学习如何把不同人脸投影到一个更容易区分的空间。label预测出的类别标签。confidence置信度越小越好。2.7结果
返回列表