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.直方图相似度度量

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

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

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

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

相关推荐
Navicat中国14 分钟前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI36 分钟前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区1 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris3 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy3 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V3 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI3 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技3 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据3 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化
冬奇Lab4 小时前
开源项目第242期:HyperFrames —— 写 HTML 就能渲染视频,专为 AI Agent 设计的确定性视频框架
人工智能·开源·音视频开发