赞
踩
33.OpenCV的人脸检测和识别——人脸识别
人脸识别是在人脸检测的基础上进一步判断人的身份。
OpenCV提供了3中人脸识别的方法:特征脸(EigenFaces)、人鱼脸(FisherFaces)、局部二进制编码直方图(Local Binary Patterns Histograms,LBPH)。
EigenFaces人脸识别使用主要成分分析(Principal Component Analysis,PCA)方法将人脸数据从高维处理成低维后,获得人脸数据的主要成分信息,进而完成人脸识别。
EigenFaces人脸识别的基本步骤如下:
(1) 调用cv2.face.EigenFaceRecognizer_create()方法创建EigenFace识别器。
(2) 调用识别器的train()方法以便使用已知图像训练模型。
(3) 调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。
cv2.face.EigenFaceRecognizer_create()函数的基本格式如下:
recognizer = cv2.face.EigenFaceRecognizer_create([num_components[, threshold]])
recognizer为返回的EigenFaces识别器对象
num_components为分析时的分量数量, 默认为0, 表示根据实际输入决定
threshold为人脸识别时采用的阈值
EigenFaces识别器的train()方法的基本格式如下:
recognizer.train(src, label)
src为用于训练的已知图像数组, 所有图像必须为灰度图且大小要相同
label为标签数组, 与已知图像数组中的人脸一一对应, 同一个人的人脸标签应设置为相同值
EigenFaces识别器的predict()方法的基本格式如下:
label, confidence = recoginer.predict(testimg)
label为返回的标签值
confidence为返回的可信度, 表示未知人脸和模型中已知人脸之间的距离, 0表示完全匹配, 低于5000可认为是可靠的匹配结果
test_img为未知人脸图像, 图像必须为灰度图且大小要与训练图像相同
# 特征脸(EigenFaces) import cv2 import numpy as np img11 = cv2.imread("xl11.jpg", cv2.IMREAD_GRAYSCALE) img12 = cv2.imread("xl12.jpg", cv2.IMREAD_GRAYSCALE) img13 = cv2.imread("xl13.jpg", cv2.IMREAD_GRAYSCALE) img21 = cv2.imread("xl21.jpg", cv2.IMREAD_GRAYSCALE) img22 = cv2.imread("xl22.jpg", cv2.IMREAD_GRAYSCALE) img23 = cv2.imread("xl23.jpg", cv2.IMREAD_GRAYSCALE) train_images = [img11, img12, img13, img21, img22, img23] labels = np.array([0, 0, 0, 1, 1, 1]) recoginer = cv2.face.EigenFaceRecognizer_create() recoginer.train(train_images, labels) test_img = cv2.imread('test1.jpg', cv2.IMREAD_GRAYSCALE) label, confidence = recoginer.predict(test_img) print("匹配标签:",label) print("可信度:",confidence)
程序中的训练图像(灰度图):
程序中用于测试的未知人脸图像:
程序输出结果如下:
FisherFaces人脸识别使用线性判别分析(Linear Discriminant Analysis,LDA)方法实现人脸识别。
FisherFaces人脸识别的基本步骤如下:
(1) 调用cv2.face.FisherFaceRecognizer_create()方法创建FisherFaces识别器。
(2) 调用识别器的train()方法以便使用已知图像训练模型。
(3) 调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。
在OpenCV中,cv2.face.EigenFaceRecognizer类和cv2.face.FisherFaceRecognizer类同属于cv2.face.BasicFaceRecognizer类、cv2.face.FaceRecognizer类和cv2.Algorithm类的子类,对应的xxx_create()、train()和predict()等方法的基本格式与用法相同。
# 人鱼脸(FisherFaces) import cv2 import numpy as np img11 = cv2.imread("xl11.jpg", cv2.IMREAD_GRAYSCALE) img12 = cv2.imread("xl12.jpg", cv2.IMREAD_GRAYSCALE) img13 = cv2.imread("xl13.jpg", cv2.IMREAD_GRAYSCALE) img21 = cv2.imread("xl21.jpg", cv2.IMREAD_GRAYSCALE) img22 = cv2.imread("xl22.jpg", cv2.IMREAD_GRAYSCALE) img23 = cv2.imread("xl23.jpg", cv2.IMREAD_GRAYSCALE) train_images = [img11, img12, img13, img21, img22, img23] labels = np.array([0, 0, 0, 1, 1, 1]) recoginer = cv2.face.FisherFaceRecognizer_create() recoginer.train(train_images, labels) test_img = cv2.imread('test1.jpg', cv2.IMREAD_GRAYSCALE) label, confidence = recoginer.predict(test_img) print("匹配标签:",label) print("可信度:",confidence)
程序中的训练图像(灰度图):
程序中用于测试的未知人脸图像:
程序输出结果如下:
LBPH算法处理图像的基本原理如下:
(1) 取像素x周围(领域)的8个像素与其比较,像素值比像素x大的取0,否则取1。将8个像素对应的0、1连接得到一个8位二进制数,将其转换为十进制,作为像素x的LBP值。
(2) 对像素的所有像素按相同的方法进行处理,得到整个图像的LBP值,该图像的直方图就是图像的LBPH。
LBPH人脸识别的基本步骤如下;
(1) 调用cv2.face.LBPHFaceRecognizer_create()方法创建LBPH识别器。
(2) 调用识别器的train()方法以便使用已知图像训练模型。
(3) 调用识别器的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识别器的train()方法的基本格式如下:
recognizer.train(src, label)
src为用于训练的已知图像数组, 所有图像必须为灰度图且大小要相同
label为标签数组, 与已知图像数组中的人脸一一对应, 同一个人的人脸标签应设置为相同值
LBPH识别器的predict()方法的基本格式如下:
label, confidence = recoginer.predict(testimg)
label为返回的标签值
confidence为返回的可信度, 表示未知人脸和模型中已知人脸之间的距离, 0表示完全匹配, 低于50可认为是非常可靠的匹配结果
test_img为未知人脸图像, 图像必须为灰度图且大小要与训练图像相同
# 局部二进制编码直方图(Local Binary Patterns Histograms,LBPH) import cv2 import numpy as np img11 = cv2.imread("xl11.jpg", cv2.IMREAD_GRAYSCALE) img12 = cv2.imread("xl12.jpg", cv2.IMREAD_GRAYSCALE) img13 = cv2.imread("xl13.jpg", cv2.IMREAD_GRAYSCALE) img21 = cv2.imread("xl21.jpg", cv2.IMREAD_GRAYSCALE) img22 = cv2.imread("xl22.jpg", cv2.IMREAD_GRAYSCALE) img23 = cv2.imread("xl23.jpg", cv2.IMREAD_GRAYSCALE) train_images = [img11, img12, img13, img21, img22, img23] labels = np.array([0, 0, 0, 1, 1, 1]) recoginer = cv2.face.LBPHFaceRecognizer_create() recoginer.train(train_images, labels) test_img = cv2.imread('test2.jpg', cv2.IMREAD_GRAYSCALE) label, confidence = recoginer.predict(test_img) print("匹配标签:",label) print("可信度:",confidence)
程序中的训练图像(灰度图):
程序中用于测试的未知人脸图像:
程序输出结果如下:
OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码
以上内容介绍了OpenCV-Python的人脸识别,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。