【OpenCV-Python】33.OpenCV的人脸检测和识别——人脸识别

33.OpenCV的人脸检测和识别——人脸识别



前言

  人脸识别是在人脸检测的基础上进一步判断人的身份。
  OpenCV提供了3中人脸识别的方法:特征脸(EigenFaces)、人鱼脸(FisherFaces)、局部二进制编码直方图(Local Binary Patterns Histograms,LBPH)。


一、特征脸(EigenFaces)人脸识别

  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)人脸识别

  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)

  程序中的训练图像(灰度图):
请添加图片描述
  程序中用于测试的未知人脸图像:

在这里插入图片描述
  程序输出结果如下:
在这里插入图片描述


三、局部二进制编码直方图(Local Binary Patterns Histograms,LBPH)人脸识别

  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-Python测试用图片、中文官方文档、opencv-4.5.4源码


总结

  以上内容介绍了OpenCV-Python的人脸识别,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值