OpenCV中的LBPH人脸识别

一、介绍

本次使用OpenCV的LBPH(局部二值模式直方图)算法进行人脸识别的python代码,下面我将从整体流程、关键步骤、算法原理、参数含义、与EigenFace的对比、潜在问题与改进建议六个方面进行详细讲解。

该程序的目标与之前EigenFace一致:

1.用4张已知身份的人脸图像(黎明2张。安志杰2张)训练一个LBPH识别器。

2.对测试图像预测身份,并输出标签与置信度。

3.与EigenFace不同的是,没有进行图像尺寸缩放 ,也没有显示图像,仅输出控制台结果。

二、核心代码讲解

2.1导入库与图像读取

使用cv2.IMREAD_GRAYSCALE明确以灰度模式读取。

关键区别 :这里没有 对图像进行resize操作。因为LBPH算法不要求所有图像尺寸一致,二EigenFace必须要求统一尺寸。但为了更好的效果,通常建议统一尺寸。

2.2标签与测试图像

标签对应每个人的ID:0代表"黎明",1代表"安志杰"。前两张是黎明,后两张是安志杰。

下面同样以灰度读入并缩放到相同尺寸,保证与训练样本维度匹配。

2.3创建LBPH识别器

无参数创建,使用默认参数:

半径(radius)=1

邻域点数(neighbors)=8

网格划分(grid_x,grid_y)=(8,8)

阈值(threshold)=浮点数最大值

2.4训练与预测

train()训练模型,内部提取每张图像的LBPH特征向量并存储。

predict()返回标签和置信度。LBPH的置信度表示欧式距离,数值越小表示匹配度越高。

三、LBPH算法核心原理

LBPH是一种纹理描述符,对光照变化具有较强鲁棒性,计算步骤如下:

1.局部二值模式(LBP)编码

对每个像素,以它为中心,比较其与周围邻域的灰度值。

若邻点灰度>=中心灰度,则该位为1,否则为0.

将8位二进制数转为十进制(0-255),作为该像素的LBP值。

2.分块直方图统计

将图像划分为若干小网络(如8*8网格)

对每个网格,统计LBP值的直方图(256个bin)。

将所有网格的直方图串联,形成该图像的特征向量。

3.直方图相似度度量

训练时存储每张图像的特征向量及对应标签。

预测时计算测试图像与所有训练图像的直方图距离。

返回距离最近者的标签和距离值。

优点:对光照、姿态变化较鲁棒,计算效率高,无需图像尺寸统一。

相关推荐
天天代码码天天1 小时前
把 PP-OCR 塞进一个纯 C Runtime:从 Tiny 到 Medium,再到单文件 HTML OCR
人工智能
xsd202411181 小时前
Stremio-WebStremio:开源流媒体自由聚合平台
人工智能
Aloudata1 小时前
语义治理 vs 知识治理:AI 数据分析需要业务知识库还是可执行语义层
大数据·人工智能·数据分析·data agent·语义层
阿黎梨梨1 小时前
LangGraph 核心机制:从状态管理到人机协同
人工智能·langchain
小兵金林1 小时前
初识 Transformer
人工智能
小白的后端世界1 小时前
数据分析基础学习
人工智能·学习·数据分析
wangfpp1 小时前
手写 ReAct 循环:搞懂 Agent 工具调用
人工智能
leluckys1 小时前
AI-DeepSeek使用与提示词工程
人工智能
dunge20261 小时前
2026年9月9日|ChatGPT Pro + Codex:GPT‑6 Astra 自动测试与代码审查
人工智能·gpt·chatgpt