PythonOpenCV-人脸检测和识别-人脸识别
0. 简介
OpenCV 提供了 3 种人脸识别方法: 特征脸(EigenFaces )、人鱼脸(FisherFaces)和局部二进制编码直方图(Local Binary Patterns Histograms,LBPH)。
1. EigenFaces 人脸识别
EigenFaces 使用主要成分分析方法将人脸数据从高维处理成低维后,获得人脸数据的主要成分信息,进而完成人脸识别。
EigenFaces 人脸识别的基本步骤如下:
- 调用cv2.face.EigenFaceRecognizer_create()方法创建 EigenFaces 识别器
- 调用识别器的 train()方法以便使用已知图像训练模型
- 调用识别器的 predict()方法以便使用未知图像进行识别,确认其身份。
cv2.face.EigenFaceRecognizer_create()函数的基本格式如下:
recognizer = cv2.face.EigenFaceRecognizer_create([num_components[, threshold]])
参数说明:
recognizer:返回的 EigenFaces 识别器对象
num_components:分析时的分量个数;默认为0,表示根据实际输入决定threshold 为人脸识别时采用的闯值。
EigenFaces 识别器train()方法的基本格式如下:
recognizer, train(src, labels)
参数说明:
src:用于训练的已知图像数组。所有图像必须为灰度图像,且大小要相同
labels:标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值
EigenFaces 识别器 predict()方法的基本格式如下:
label, confidence = recognizer.predict(testimg)
参数说明:
testimg:未知人脸图像,必须为灰度图像,且与训练图像大小相同
label:返回的标签值
confidence:返回的可信度,表示未知人脸和模型中已知人脸之间的距离。0 表示完全匹配,低于 5000 可认为是可靠的匹配结果
代码示例:
import cv2 as cv import numpy as np img11 = cv.imread('xl11.jpg', 0) # 打开图像,灰度图 img12 = cv.imread('xl12.jpg', 0) # 打开图像,灰度图 img13 = cv.imread('xl13.jpg', 0) # 打开图像,灰度图 img21 = cv.imread('xl21.jpg', 0) # 打开图像,灰度图 img22 = cv.imread('xl22.jpg', 0) # 打开图像,灰度图 img23 = cv.imread('xl23.jpg', 0) # 打开图像,灰度图 train_images = [img11, img12, img13, img21, img22, img23] # 创建训练图像数组 labels = np.array([0, 0, 0, 1, 1, 1]) # 创建标签数组,0和1表示对应的训练图像数组中人脸的身份 recognizer = cv.face.EigenFaceRecognizer_create() # 创建FisherFaces识别器 recognizer.train(train_images, labels) # 执行训练操作 testimg = cv.imread('test1.jpg', 0) # 打开测试图像 label, confidence = recognizer.predict(testimg) # 识别人脸 print('匹配标签:', label) print('可信度:', confidence)
运行结果:
匹配标签: 0
可信度: 2121.875935493911
2. FisherFaces 人脸识别
FisherFaces 使用线性判别分析 ( Linear Discriminant Analysis,LDA)方法实现人脸识别。
FisherFaces 人脸识别的基本步骤如下:
- 调用 cv2.face.FisherFaceRecognizer_create()函数创建 FisherFaces 识别器
- 调用识别器的 train()方法以便使用已知图像训练模型
- 调用识别器的 predict()方法以便使用未知图像进行识别,确认其身份
在 OpenCV 中,cv2.face.EigenFaceRecognizer 类和 cv2face.FisherFaceRecognizer类同属于 cv2.face.BasicFaceRecognizer 类、cV2.face.FaceRecognizer 类和 cV2.Algorithm类的子类,对应的 xxx_create()、train()和 predict()等方法的基本格式与用法相同。
代码示例:
import cv2 as cv import numpy as np # 读入训练图像 img11 = cv.imread('xl11.jpg', 0) # 打开图像,灰度图 img12 = cv.imread('xl12.jpg', 0) # 打开图像,灰度图 img13 = cv.imread('xl13.jpg', 0) # 打开图像,灰度图 img21 = cv.imread('xl21.jpg', 0) # 打开图像,灰度图 img22 = cv.imread('xl22.jpg', 0) # 打开图像,灰度图 img23 = cv.imread('xl23.jpg', 0) # 打开图像,灰度图 train_images = [img11, img12, img13, img21, img22, img23] # 创建训练图像数组 labels = np.array([0, 0, 0, 1, 1, 1]) # 创建标签数组,0和1表示训练图像数组中人脸的身份 recognizer = cv.face.FisherFaceRecognizer_create() # 创建FisherFaces识别器 recognizer.train(train_images, labels) # 执行训练操作 testimg = cv.imread('test1.jpg', 0) # 打开测试图像 label, confidence = recognizer.predict(testimg) # 识别人脸 print('匹配标签:', label) print('可信程度:', confidence)
运行结果:
匹配标签: 0
可信程度: 774.9550554076943
3. LBPH 人脸识别
LBPH 算法处理图像的基本原理如下:
- 取像素x周围(邻域)的 8 个像素与其比较,像素值比像素x大的取0,否则取 1。将8 个像素对应的 0、1连接得到一个 8 位二进制数,将其转换为十进制数,作为像素x的 LBP 值
- 对图像的所有像素按相同的方法进行处理,得到整个图像的 LBP 图像,该图像的直方图就是图像的 LBPH
LBPH 人脸识别的基本步骤如下:
- 调用 cv2.face.LBPHFaceRecognizer_create()函数创建 LBPH识别器
- 调用识别器的 train0方法以便使用已知图像训练模型
- 调用识别器的 predict()方法以便使用未知图像进行识别,确认其身份
cv2.face.LBPHFaceRecognizer_create)()函数的基本格式如下:
recognizer =cv2.face.LBPHFaceRecognizer_create([,radius[,neighbors[, grid x[, grid y[, threshold]]]]])
参数说明:
recognizer:返回的 LBPH 识别器对象
radius:邻域的半径大小
neighbors:邻域内像素点的数量,默认为 8
grid_x 为将 LBP 图像划分为多个单元格时,水平方向上的单元格数量,默认为 8
grid_y 为将 LBP 图像划分为多个单元格时,垂直方向上的单元格数量,默认为 8
threshold 为人脸识别时采用的阈值
LBPH 识别器 train0方法的基本格式如下:
recognizer.train(src, labels)
参数说明:
src:用于训练的已知图像数组。所有图像必须为灰度图像,且大小要相同
labels:标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值
LBPH 识别器 predict0方法的基本格式如下:
label, confidence = recognizer.predict(testimg)
参数说明:
testimg:未知人脸图像,必须为灰度图像,且与训练图像大小相同
label:返回的识别标签值
confidence:返回的可信程度,表示未知人脸和模型中已知人脸之间的距离。0 表示完全匹配,低于 50 可认为是非常可靠的匹配结果
代码示例:
import cv2 as cv import numpy as np # 读入训练图像 img11 = cv.imread('xl11.jpg', 0) # 打开图像,灰度图 img12 = cv.imread('xl12.jpg', 0) # 打开图像,灰度图 img13 = cv.imread('xl13.jpg', 0) # 打开图像,灰度图 img21 = cv.imread('xl21.jpg', 0) # 打开图像,灰度图 img22 = cv.imread('xl22.jpg', 0) # 打开图像,灰度图 img23 = cv.imread('xl23.jpg', 0) # 打开图像,灰度图 train_images = [img11, img12, img13, img21, img22, img23] # 创建训练图像数组 labels = np.array([0, 0, 0, 1, 1, 1]) # 创建标签数组,0和1表示训练图像数组中人脸的身份 recognizer = cv.face.LBPHFaceRecognizer_create() # 创建LBPHFaces识别器 recognizer.train(train_images, labels) # 执行训练操作 testimg = cv.imread('test2.jpg', 0) # 打开测试图像 label, confidence = recognizer.predict(testimg) # 识别人脸 print('匹配标签:', label) print('可信程度:', confidence)
运行结果:
匹配标签: 1
可信程度: 72.49861447316063
/*-------------------------------------------------------------------------------------------------------
笔者说明:
该笔记来源于本人学习Python + OpenCv时的资料,
分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。
时间:2023年9月3日
------------------------------------------------------------------------------------------------------------*/

PythonOpenCV-人脸检测和识别-人脸识别
浙公网安备 33010602011771号