OpenCV 基于 LBPH 算法实现简易人脸识别(复制即可运行代码)
一、前言
人脸识别是计算机视觉入门经典项目,相比深度学习大模型,传统 LBPH 人脸识别算法轻量化、训练快、不需要大量算力,本地离线就能运行,非常适合新手学习。 本文使用 OpenCV 内置 LBPH 识别器,仅用少量人脸样本,完成周杰伦、林俊杰二人的人脸分类识别,代码极简易懂,附带完整注释与踩坑说明。
二、LBPH 算法简单介绍
LBPH(Local Binary Patterns Histogram,局部二值模式直方图)算法使用的模型基于LBP(Local Binary Pattern,局部二值模式)算法。LBP 算法最早是被作为一种有效的纹理描述算提出的,因在表述图像局部纹理特征方面效果出众而得到广泛应用。
1、以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;
2、再将LBP图像分为个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图。
通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。
LBPH 全称 Local Binary Pattern Histogram(局部二进制模式直方图),核心流程:
- 将人脸图划分小块,提取局部纹理二进制特征
- 统计纹理特征直方图,把图片转为特征向量
- 对比待测图与样本特征距离,返回分类标签与置信度 优势:对光照轻微变化鲁棒,无需 GPU,运行速度快。
三、环境安装
新版 opencv 把人脸相关模块拆分,必须安装两个包:
pip install opencv-python
pip install opencv-contrib-python
只装 opencv-python 会报找不到cv2.face模块。
四、完整项目代码
import cv2
import numpy as np
# 1. 加载训练人脸图片(灰度图)
images = []
# 周杰伦样本3张
images.append(cv2.imread('zjj1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('zjj2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('zjj3.jpg', cv2.IMREAD_GRAYSCALE))
# 林俊杰样本3张
images.append(cv2.imread('ljj1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('ljj2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('ljj3.jpg', cv2.IMREAD_GRAYSCALE))
# 2. 对应标签:0代表周杰伦,1代表林俊杰
labels = [0, 0, 0, 1, 1, 1]
# 标签映射字典,方便打印中文名称
name_dic = {0: '周杰伦', 1: '林俊杰', -1: '无法识别'}
# 3. 待识别图片
predict_image = cv2.imread('2222.jpg', cv2.IMREAD_GRAYSCALE)
# 4. 创建LBPH人脸识别器,threshold阈值80,超过阈值判定无法识别
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)
# 训练模型,labels转为numpy数组
recognizer.train(images, np.array(labels))
# 5. 预测识别
label, confidence = recognizer.predict(predict_image)
# 输出结果
print('识别结果:', name_dic[label])
print('匹配置信度:', confidence)
五、代码逐行解析
- 灰度图读取
cv2.IMREAD_GRAYSCALE直接读取灰度图像,LBPH 算法仅支持单通道灰度图,彩色图必须转灰度。 - 样本与标签对应 3 张周杰伦对应标签 0,3 张林俊杰对应标签 1,一一匹配,训练时模型通过标签区分不同人物。
- LBPH 识别器创建
threshold=80是匹配阈值:置信度数值越小代表匹配度越高;若相似度超过阈值,会返回 - 1 判定无法识别。 - 模型训练 train () 输入图片列表 + numpy 格式标签数组,完成特征提取与存储。
- predict 预测 返回两个值:label 匹配标签、confidence 置信度分数。
六、文件目录说明
把所有人脸图片和 py 代码放在同一个文件夹,文件名保持一致:
plaintext
项目文件夹
├─ zjj1.jpg
├─ zjj2.jpg
├─ zjj3.jpg
├─ ljj1.jpg
├─ ljj2.jpg
├─ ljj3.jpg
├─ 2222.jpg # 待识别图片
└─ face_rec.py # 运行代码
七、运行结果示例
识别结果:周杰伦
匹配置信度:42.68
数值越低,人脸匹配相似度越高;分数接近 / 大于 80,识别会判定为陌生人。
八、常见报错与解决
- AttributeError: module 'cv2' has no attribute 'face' 解决:安装
opencv-contrib-python,版本和 opencv-python 保持一致。 - 输出 None、识别全部乱码 解决:图片路径错误、文件名写错、图片损坏,检查图片是否正常读取。
- 识别准确率极低 解决:样本人脸尽量正面、光线均匀,裁剪只保留人脸区域,减少背景干扰。
九、总结
LBPH 传统人脸识别适合简单场景、小型数据集,上手门槛极低。如果需要更高精度、复杂场景识别,可以后续学习 MTCNN 人脸检测 + 深度学习人脸识别方案。 本项目可拓展:批量读取文件夹人脸、保存训练模型、调用摄像头实时识别。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)