python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法
- 互联网
- 2025-08-31 10:21:02

【1】引言
前序学习进程中,已经掌握了使用Eigenfaces算法进行的人脸识别。相关文章链接为:
python学opencv|读取图像(七十四)人脸识别:EigenFaces算法-CSDN博客
在此基础上,学习剩余两种人脸识别算法:Fisherfaces算法和LBPH算法。
【2】官网教程实际上,点击下述链接,可以直达三种算法的官网教程:
OpenCV: Face Recognition with OpenCV
对于Fisherfaces算法和LBPH算法,具体的应用流程和Eigenfaces算法一致:先确定用哪种算法后,就建立识别器,然后把样本放入训练器进行训练,最后输出识别效果。
【2.1】Fisherfaces算法点击下方链接,直达Fisherfaces算法的官网教程:
OpenCV: cv::face::FisherFaceRecognizer Class Reference
在官网,可以看到Fisherfaces算法识别器相关的说明:
图1 cv.face.FisherFaceRecognizer.create算法识别器
具体的,cv.face.FisherFaceRecognizer.create识别器有两个参数:
cv.face.FisherFaceRecognizer.create(
num_components #可选参数,PCA(主成分分析)中保留分量的个数
threshold ) #可选参数,人脸识别的阈值
【2.2】LBPH算法点击下方链接,直达LBPH算法的官网教程:
OpenCV: cv::face::LBPHFaceRecognizer Class Reference
在官网,可以看到LBPH算法识别器相关的说明:
图2 cv.face.LBPHFaceRecognizer.create算法识别器
具体的,cv.face.LBPHFaceRecognizer.create识别器有五个参数:
cv.face.LBPHFaceRecognizer.create(
radius #可选参数,圆形局部二进制模式的半径
neighbors #可选参数,圆形局部二进制模式的采样数目
grid_x #可选参数,水平方向上的单元格数
grid_y #可选参数,竖直方向上的单元格数
threshold ) #可选参数,识别用的阈值
【3】代码测试 【3.1】Fisherfaces算法对使用Fisherfaces算法的人脸识别,和使用Eigenfaces算法的人脸识别在代码上一样,所以可以直接使用先前的代码,只需要改一行旧代码即可:
# 创建人脸识别器 recognizer = cv.face.EigenFaceRecognizer.create()改后代码为:
# 创建人脸识别器 recognizer = cv.face.FisherFaceRecognizer.create()不过为了增强对比,这次用了两组图片,所以存储地址的列表变长了:
# 定义图片路径字典,键为标签,值为该标签对应的图片路径列表 image_paths_dict = { 0: [ r"D:\python\pythonworkspace\pythonProject3\0\01.jpg", r"D:\python\pythonworkspace\pythonProject3\0\02.jpg", r"D:\python\pythonworkspace\pythonProject3\0\03.jpg" ], 1: [ r"D:\python\pythonworkspace\pythonProject3\1\01.jpg", r"D:\python\pythonworkspace\pythonProject3\1\02.jpg", r"D:\python\pythonworkspace\pythonProject3\1\03.jpg" ] }这里的两组图片分别用了标签0和1。
待测试的图片也变成了两组:
# 定义测试图片路径列表 test_image_paths = [ r"D:\python\pythonworkspace\pythonProject3\zyz\11.jpg", r"D:\python\pythonworkspace\pythonProject3\s01\05.jpg" ]使用Fisherfaces算法的人脸识别和使用Eigenfaces算法的人脸识别在判断原理上也很类似,以5000为置信度标准,小于5000为图像识别成功,对比结果为0时表明两个图像完全一样,而超出为不能识别。
实际用的图像0有:
图3 训练样本0
图4 训练样本1
图5 待测图像1
图6 待测图像2
代码运行后,获得的识别效果为:
图7 待测图像1识别效果
图8 待测图像2识别效果
这个效果其实出乎预料,待测图像2本应被识别,但却未被认出。
不过用于训练的的样本的确太少,所以这样的识别效果也算正常。
此时的完整代码为:
import cv2 as cv import numpy as np # 定义图片路径字典,键为标签,值为该标签对应的图片路径列表 image_paths_dict = { 0: [ r"D:\python\pythonworkspace\pythonProject3\0\01.jpg", r"D:\python\pythonworkspace\pythonProject3\0\02.jpg", r"D:\python\pythonworkspace\pythonProject3\0\03.jpg" ], 1: [ r"D:\python\pythonworkspace\pythonProject3\1\01.jpg", r"D:\python\pythonworkspace\pythonProject3\1\02.jpg", r"D:\python\pythonworkspace\pythonProject3\1\03.jpg" ] } photos = [] # 定义photo空列表,用来存储图像 labels = [] # 定义lables空列表,用来存储图像对应的标签 # 定义图像尺寸信息 width = 600 # 定义一个初始宽度量 height = 600 # 定义一个初始高度量 target_size = (width, height) # 定义一个元组,存储宽度量和高度量 # 读取图片并调整尺寸 for label, paths in image_paths_dict.items(): for path in paths: # 以彩色模式读取图像 img = cv.imread(path) if img is not None: # 调整图像尺寸为与目标尺寸相同 img = cv.resize(img, target_size) # 将彩色图像转换为灰度图像用于训练 gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) photos.append(gray_img) labels.append(label) else: print(f"无法读取图片: {path}") # 定义标签映射 names = { 0: "su", 1: "other_person" } # 创建人脸识别器 recognizer = cv.face.FisherFaceRecognizer.create() # 训练人脸识别器 if photos and labels: recognizer.train(photos, np.array(labels)) # 训练器读入人脸样本和对应标签 # 定义测试图片路径列表 test_image_paths = [ r"D:\python\pythonworkspace\pythonProject3\zyz\11.jpg", r"D:\python\pythonworkspace\pythonProject3\s01\05.jpg" ] for test_image_path in test_image_paths: # 读取测试图片,以彩色模式读取 test_img = cv.imread(test_image_path) if test_img is not None: # 调整测试图像尺寸与目标尺寸一致 test_img = cv.resize(test_img, target_size) # 将彩色图像转换为灰度图像用于识别 gray_test_img = cv.cvtColor(test_img, cv.COLOR_BGR2GRAY) label, confidence = recognizer.predict(gray_test_img) # 设定识别阈值 threshold = 5000 # 可根据实际情况调整 if confidence > threshold: # 添加未识别标记 cv.putText(test_img, "Unrecognized", (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) else: print(f'confidence={confidence}') print(names[label]) # 添加识别结果标记 text = names[label] cv.putText(test_img, text, (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 输出图像 cv.imshow('Result Image', test_img) cv.waitKey(0) cv.destroyAllWindows() else: print(f"无法读取测试图片: {test_image_path}") 【3.2】LBPH算法对使用Fisherfaces算法、Eigenfaces算法的人脸识别,和使用LBPH算法的人脸识别在代码上的设计也一样,只是调用的参数不同,并且使用LBPH算法时的参数均可以由算法自动选择。
所以依然可以直接使用Fisherfaces算法的代码,只需将创建识别器的代码修改即可:
# 创建人脸识别器 recognizer = cv.face.LBPHFaceRecognizer.create()其余代码均无需修改,代码运行后获得的人脸识别效果为:
图9 待测图像1人脸识别效果
图10 待测图像2人脸识别效果
使用LBPH算法的人脸识别效果稍好,因为它正确识别了待测图像2。
【4】细节说明所有识别器均在对灰度图像进行识别时更高效,因此实际的识别过程大都是对灰度图像进行。
【5】总结掌握了使用python+opencv实现了使用Fisherfaces算法和LBPH算法进行人脸识别的技巧。
python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法”