别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

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 人脸识别的基本步骤如下:

  1. 调用 cv2.face.LBPHFaceRecognizer_create()函数创建 LBPH识别器
  2. 调用识别器的 train0方法以便使用已知图像训练模型
  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 识别器 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日

------------------------------------------------------------------------------------------------------------*/

posted @ 2023-09-03 12:58  一路狂奔的乌龟  阅读(399)  评论(1)    收藏  举报
返回顶部