人脸检测是指在图像中完成人脸定位的过程,而人脸识别是在人脸检测的基础上进一步判断人的身份,OpenCV提供了三种人脸识别的方法:EigenFaces(特征脸)、FisherFaces(人鱼脸)、Local Binary Patterns Histograms,LBPH(局部二进制编码直方图)。
1、EigenFaces
EigenFaces人脸识别的基本步骤:
(1)调用cv2.face.EigenFaceRecognizer_create()方法创建EigenFaces识别器;
(2)调用识别器的train()方法以便使用已知图像训练模型;
(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。
用到的函数:
recognizer=cv2.face.EigenFaceRecognizer_create([num_components[,threshold]])参数说明:recognizer为返回的EigenFaces识别器对象
num_components为分析时的分量个数,默认为0,表示根据实际输入决定
threshold为人脸识别时采用的阈值
recognizer.train(src, labels)参数说明:src为用于训练的已知图像数组
labels为标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值
label, confidence = recognizer.predict(testimg)参数说明:testimg为未知人脸图像label为返回的标签值
confidence为返回的可信度,表示未知人脸和模型中已知人脸之间的距离,0表示完全匹配,低于5000可认为是可靠的匹配结果
代码如下:
import cv2import numpy as npimg1 = cv2.imread('xxx', 0)img2 = cv2.imread('xxx', 0)img3 = cv2.imread('xxx', 0)img4 = cv2.imread('xxx', 0)img5 = cv2.imread('xxx', 0)img1 = cv2.resize(img1, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img2 = cv2.resize(img2, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img3 = cv2.resize(img3, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img4 = cv2.resize(img4, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img5 = cv2.resize(img5, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)# 创建训练图像数组train_images = [img1, img2, img3, img4, img5]# 创建标签数组,表示训练图像数组中人脸的身份labels = np.array([1, 2, 3, 4, 5])# 创建EigenFaces识别器recognizer = cv2.face.EigenFaceRecognizer_create()# 执行训练操作recognizer.train(train_images, labels)# 打开测试图像testimg = cv2.imread('xxx', 0)testimg = cv2.resize(testimg, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)# 识别人脸label, confidence = recognizer.predict(testimg)# 输出识别结果print('匹配标签:', label)print('可信度:', confidence)注意:读取图像时必须转换为灰度图;
所有的用于训练的已知人脸图像和用于测试的未知人脸图像的尺寸必须一致(程序中已体现这一点,可以根据自己的实际和需要设置尺寸);
recognizer = cv2.face.EigenFaceRecognizer_create()函数中的face来自于OpenCV的贡献库,所以需要安装opencv-contrib-python,并且要与opencv-python的版本一致,否则程序会报错。
下面分别是用与训练图像数组完全一样和完全不一样的图片下的结果:
2、FisherFaces
FisherFaces人脸识别的基本步骤:
(1)调用cv2.face.FisherFaceRecognizer_create()方法创建FisherFaces识别器;
(2)调用识别器的train()方法以便使用已知图像训练模型;
(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。
代码与EigenFaces类似,只要将创建识别器
recognizer=cv2.face.EigenFaceRecognizer_create()改为recognizer=cv2.face.FisherFaceRecognizer_create()即可。
3、LBPH
LBPH算法处理图像的基本原理:
取像素x周围(邻域)的8个像素与其比较,像素值比像素x大的取0,否则取1。将8个像素对应的0、1连接得到一个8为二进制数,将其转换为十进制数,作为像素x的LBP值;
对图像的所有像素按相同的方法进行处理,得到整个图像的LBP图像,该图像的直方图就是图像的LBPH。
LBPH人脸识别的基本步骤:
(1)调用cv2.face.LBPHFaceRecognizer_create()方法创建LBPH识别器;
(2)调用识别器的train()方法以便使用已知图像训练模型;
(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。
用到的函数:
recognizer=cv2.face.LBPHFaceRecognizer_create([,radius[,neighbors[,grid_x[,grid_y[,threshold]]]]])参数说明:recognizer为返回的LBPH识别器对象
radius为邻域的半径大小
neighbors为邻域内像素点的数量,默认为8
grid_x为将LBP图像划分为多个单元格时,水平方向上的单元格数量,默认为8
grid_x为将LBP图像划分为多个单元格时,垂直方向上的单元格数量,默认为8
threshold为人脸识别时采用的阈值
recognizer.train(src, labels)参数说明:src为用于训练的已知图像数组
labels为标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值
label, confidence = recognizer.predict(testimg)参数说明:testimg为未知人脸图像label为返回的标签值
confidence为返回的可信度,表示未知人脸和模型中已知人脸之间的距离,0表示完全匹配,低于50可认为是可靠的匹配结果
代码实现:
import cv2import numpy as npimg1 = cv2.imread('xxx', 0)img2 = cv2.imread('xxx', 0)img3 = cv2.imread('xxx', 0)img4 = cv2.imread('xxx', 0)img5 = cv2.imread('xxx', 0)#img1 = cv2.resize(img1, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img2 = cv2.resize(img2, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img3 = cv2.resize(img3, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img4 = cv2.resize(img4, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)img5 = cv2.resize(img5, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)# 创建训练图像数组train_images = [img1, img2, img3, img4, img5]# 创建标签数组,表示训练图像数组中人脸的身份labels = np.array([1, 2, 3, 4, 5])# 创建EigenFaces识别器recognizer = cv2.face.LBPHFaceRecognizer_create()# 执行训练操作recognizer.train(train_images, labels)# 打开测试图像testimg = cv2.imread('xxx', 0)testimg = cv2.resize(testimg, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)# 识别人脸label, confidence = recognizer.predict(testimg)# 输出识别结果print('匹配标签:', label)print('可信度:', confidence)