上一篇
Python LBPH人脸识别完整教程 - OpenCV实现详解
- Python
- 2025-07-29
- 1211
Python LBPH人脸识别完整教程
使用OpenCV实现高效的LBPH人脸识别算法 - 从基础到实践
计算机视觉研究员
最后更新: 2023年10月15日 | 阅读时间: 10分钟
LBPH人脸识别简介
LBPH(Local Binary Patterns Histograms)是一种高效的人脸识别算法,它结合了局部二值模式(LBP)和直方图技术。LBPH的主要优势在于对光照变化不敏感,计算效率高,适用于实时人脸识别系统。
LBPH工作原理
- 将图像分成多个小区域
- 对每个区域计算LBP特征
- 生成每个区域的直方图
- 连接所有直方图形成特征向量
- 使用特征向量进行人脸识别
LBPH优势
- 对光照变化具有鲁棒性
- 计算效率高,适合实时应用
- 训练过程简单快速
- 内存占用小
- 实现相对简单
LBPH人脸识别实现步骤
1
准备数据集
收集人脸图像并组织成训练集,每个人一个文件夹
2
人脸检测
使用Haar级联检测器定位图像中的人脸
3
训练模型
使用处理后的图像训练LBPH识别器
4
人脸识别
使用训练好的模型识别新的人脸图像
Python代码实现
1. 安装依赖库
pip install opencv-python
pip install numpy
2. 准备数据集
创建如下目录结构,每个人一个文件夹:
dataset/
├── person1/
│ ├── 1.jpg
│ ├── 2.jpg
│ └── ...
├── person2/
│ ├── 1.jpg
│ ├── 2.jpg
│ └── ...
└── ...
3. 完整人脸识别代码
import cv2
import os
import numpy as np
# 加载人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
def detect_faces(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
return faces
def prepare_training_data(data_folder_path):
dirs = os.listdir(data_folder_path)
faces = []
labels = []
label_dict = {}
current_label = 0
for dir_name in dirs:
if not dir_name.startswith("."):
label_dict[current_label] = dir_name
subject_dir_path = os.path.join(data_folder_path, dir_name)
subject_images_names = os.listdir(subject_dir_path)
for image_name in subject_images_names:
if image_name.startswith("."):
continue
image_path = os.path.join(subject_dir_path, image_name)
image = cv2.imread(image_path)
# 检测人脸
faces_rect = detect_faces(image)
if len(faces_rect) != 1:
continue
(x, y, w, h) = faces_rect[0]
face = image[y:y+w, x:x+h]
face = cv2.resize(face, (200, 200))
face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
faces.append(face)
labels.append(current_label)
current_label += 1
return faces, labels, label_dict
# 准备训练数据
data_path = "dataset"
faces, labels, label_dict = prepare_training_data(data_path)
# 创建LBPH人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 训练模型
recognizer.train(faces, np.array(labels))
# 保存模型
recognizer.save("lbph_model.yml")
np.save("label_dict.npy", label_dict)
# 测试识别
def predict(test_img):
img = test_img.copy()
faces_rect = detect_faces(img)
for (x, y, w, h) in faces_rect:
face = img[y:y+w, x:x+h]
face = cv2.resize(face, (200, 200))
gray_face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
label, confidence = recognizer.predict(gray_face)
# 获取标签对应的名称
label_text = label_dict[label]
# 绘制结果
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(img, f"{label_text} ({confidence:.2f})", (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
return img
# 加载测试图像
test_img = cv2.imread("test.jpg")
predicted_img = predict(test_img)
# 显示结果
cv2.imshow("Prediction", predicted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
LBPH参数调优指南
参数 | 说明 | 推荐值 | 调整建议 |
---|---|---|---|
radius | LBP半径大小 | 1-3 | 值越大,特征越全局化 |
neighbors | 采样点数量 | 8 | 通常设置为8或16 |
grid_x | 水平方向网格数 | 8 | 值越大,特征越精细 |
grid_y | 垂直方向网格数 | 8 | 通常与grid_x相同 |
threshold | 识别阈值 | 50-80 | 值越小,识别越严格 |
提高识别准确率的技巧
- 使用高质量、多样化的训练图像(不同光照、角度)
- 确保每个人至少有10-20张训练图像
- 对图像进行预处理(直方图均衡化)
- 使用相同尺寸和位置的人脸图像
- 在相似条件下采集测试图像
- 定期更新模型以适应外观变化
LBPH人脸识别应用场景
📱
移动设备解锁
智能手机和平板电脑的人脸解锁功能
🏢
门禁系统
办公楼、实验室等场所的安全门禁
📊
考勤管理
企业和学校的自动考勤系统
🛍️
智能零售
识别VIP客户提供个性化服务
掌握LBPH人脸识别技术
本教程详细介绍了使用Python和OpenCV实现LBPH人脸识别的完整流程。通过合理的数据准备、模型训练和参数调优,您可以构建高效的人脸识别系统。LBPH算法因其计算效率和光照不变性,成为许多人脸识别应用的理想选择。
开始构建您的人脸识别系统吧!
本文由SimaJie于2025-07-29发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256804.html
发表评论