【深度学习】OpenCV 人脸识别实战:EigenFace 算法实现人脸识别
文章目录
完整代码一览
import cv2
import numpy as np
# 读取训练图像,注意:图片大小需要一致
images = []
a = cv2.imread('qzl1.png', flags=0)
a = cv2.resize(a, (120, 180))
b = cv2.imread('qzl2.png', flags=0)
b = cv2.resize(b, (120, 180))
c = cv2.imread('pyy1.png', flags=0)
c = cv2.resize(c, (120, 180))
d = cv2.imread('pyy2.png', flags=0)
d = cv2.resize(d, (120, 180))
images.append(a)
images.append(b)
images.append(c)
images.append(d)
labels = [0, 0, 1, 1]
pre_image = cv2.imread('pyy.png', 0)
pre_image = cv2.resize(pre_image, (120, 180))
# 创建 EigenFace 人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create(threshold=5000)
# 训练识别器
recognizer.train(images, np.array(labels))
# 预测
label, confidence = recognizer.predict(pre_image)
dic = {0: 'hg', 1: 'pyy', -1: '-1'}
print('这人是:', dic[label])
print('置信度为:', confidence)
# 在测试图像上绘制识别结果
img = cv2.imread('pyy.png')
img = cv2.putText(img.copy(), dic[label], (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow('xx', img)
cv2.waitKey(0)
安装 opencv-contrib-python
EigenFace 识别器属于 OpenCV 的 contrib 扩展模块,如果你使用的是标准版 opencv-python,运行时会报错 module ‘cv2’ has no attribute ‘face’。请先卸载标准版,然后安装:
pip install opencv-contrib-python
安装后,cv2.face 模块即可使用。
导入库
import cv2
import numpy as np
准备训练数据(图像与标签)
读取图像并统一尺寸
images = []
a = cv2.imread('qzl1.png', flags=0)
a = cv2.resize(a, (120, 180))
b = cv2.imread('qzl2.png', flags=0)
b = cv2.resize(b, (120, 180))
c = cv2.imread('pyy1.png', flags=0)
c = cv2.resize(c, (120, 180))
d = cv2.imread('pyy2.png', flags=0)
d = cv2.resize(d, (120, 180))
images.append(a)# 将 4 张图像存入列表 images
images.append(b)
images.append(c)
images.append(d)
我们准备了 4 张人脸图像(灰度图,因为 flags=0 表示以灰度模式读取),分别是 qzl1.png、qzl2.png(属于“qzl”),pyy1.png、pyy2.png(属于“pyy”)。
EigenFace 要求所有训练图像尺寸完全一致,所以我们用 cv2.resize 统一为 宽度 120,高度 180 像素。实际项目中,你应该先用人脸检测器对齐和裁剪人脸,再统一尺寸。
设置标签
labels = [0, 0, 1, 1]# 前两张(qzl1, qzl2)标签为 0,后两张(pyy1, pyy2)标签为 1
创建 EigenFace 识别器
recognizer = cv2.face.EigenFaceRecognizer_create(threshold=5000)
cv2.face.EigenFaceRecognizer_create() 创建 EigenFace 识别器对象。
参数 threshold=5000:这是识别阈值。预测时,如果计算出的置信度大于此阈值,则认为“不认识”,返回标签 -1。
EigenFace 的置信度范围通常为 0~20000,5000 是一个常用值。你可以根据实际测试调整——值越小越严格(容易误拒),值越大越宽松(容易误识)。
训练模型
recognizer.train(images, np.array(labels))
使用训练数据(images和labels)来训练识别器
函数FaceRecognizer.train用给定的数据和相关标签生成的实例模型。
该函数的语法格式为None = cv2.faceFaceRecognizer.train(src, labels )
参数的含义如下:
src: 训练图像,用来学习的人脸图像。
labels: 标签,人脸图像对应的标签。
预测新图像
pre_image = cv2.imread('pyy.png', 0)
pre_image = cv2.resize(pre_image, (120, 180))
label, confidence = recognizer.predict(pre_image)
读取一张待识别图像 pyy.png(也转为灰度图),并 resize 到相同的 120×180 尺寸(必须与训练尺寸一致)。
predict() 返回两个值:
label:识别出的标签(若置信度超过阈值则返回 -1)。
confidence:置信度,越小表示越匹配。
输出结果与可视化
dic = {0: 'qzl', 1: 'pyy', -1: '-1'}
print('这人是:', dic[label])
print('置信度为:', confidence)
只要置信度低于5000都被认为是可靠的结果
img = cv2.imread('pyy.png')
img = cv2.putText(img.copy(), dic[label], (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow('xx', img)
cv2.waitKey(0)
重新读取测试图(彩色),在上面用红色文字显示识别结果(放在左上角)。
img.copy() 避免直接修改原图。
更多推荐




所有评论(0)