基于OpenCV的人脸识别:LBPH算法

文章目录

    • 引言
    • 一、概述
    • 二、代码实现
      • [1. 代码整体结构](#1. 代码整体结构)
      • [2. 导入库解析](#2. 导入库解析)
      • [3. 训练数据准备](#3. 训练数据准备)
      • [4. 标签系统](#4. 标签系统)
      • [5. 待识别图像加载](#5. 待识别图像加载)
      • [6. LBPH识别器创建](#6. LBPH识别器创建)
      • [7. 模型训练](#7. 模型训练)
      • [8. 预测执行](#8. 预测执行)
      • [9. 结果输出](#9. 结果输出)
    • [三、 LBPH算法原理解析](#三、 LBPH算法原理解析)
    • 四、关键点解析
    • 五、改进方向
    • 总结

引言

人脸识别是计算机视觉领域的一个重要应用,今天我将分享一个使用Python和OpenCV实现的简单人脸识别系统。这个系统能够识别特定人物的照片,并给出识别结果的置信度。

一、概述

这个系统使用了OpenCV的LBPH(Local Binary Patterns Histograms)人脸识别算法,通过训练已知的人脸图像,然后对新的图像进行预测识别。

二、代码实现

python 复制代码
import cv2
import numpy as np

# 加载训练用的人脸照片
images = []
images.append(cv2.imread('linyuner 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('linyuner 2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 2.jpg', cv2.IMREAD_GRAYSCALE))

# 对应标签(0代表林允儿,1代表陈都灵)
labels = [0, 0, 1, 1]

# 标签字典,用于将数字标签转换为可读名称
dic = {0: '林允儿', 1: '陈都灵', -1: '无法识别'}

# 加载待识别的人脸图像
predict_image = cv2.imread('chendulin 3.jpg', cv2.IMREAD_GRAYSCALE)

# 创建LBPH人脸识别器,设置阈值为80
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)

# 训练识别器
recognizer.train(images, np.array(labels))

# 进行预测
label, confidence = recognizer.predict(predict_image)

# 输出结果
print('这人是:', dic[label])
print('置信度', confidence)

1. 代码整体结构

这段代码实现了一个简单但完整的人脸识别系统,主要流程包括:

  1. 加载训练图像
  2. 准备对应标签
  3. 创建识别器
  4. 训练模型
  5. 预测新图像
  6. 输出结果

2. 导入库解析

python 复制代码
import cv2
import numpy as np
  • cv2:OpenCV库,提供计算机视觉相关功能,这里主要使用其人脸识别模块
  • numpy:Python科学计算基础库,用于处理数组和矩阵运算

3. 训练数据准备

python 复制代码
images = []
images.append(cv2.imread('linyuner 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('linyuner 2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 2.jpg', cv2.IMREAD_GRAYSCALE))
  • cv2.imread() :读取图像文件
    • 第一个参数:图像路径
    • 第二个参数cv2.IMREAD_GRAYSCALE:以灰度模式读取图像,因为人脸识别通常不需要颜色信息
  • 将读取的图像存储在images列表中

4. 标签系统

python 复制代码
labels = [0, 0, 1, 1]
dic = {0: '林允儿', 1: '陈都灵', -1: '无法识别'}
  • labels :与训练图像对应的数字标签
    • 0代表"林允儿"
    • 1代表"陈都灵"
  • dic :字典,将数字标签映射为可读的名称
    • -1表示无法识别的情况

5. 待识别图像加载

python 复制代码
predict_image = cv2.imread('chendulin 3.jpg', cv2.IMREAD_GRAYSCALE)
  • 同样以灰度模式加载待识别的图像
  • 放入一张陈都灵的照片进行检验,后面代码会显示预测结果

6. LBPH识别器创建

python 复制代码
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)
  • LBPH(Local Binary Patterns Histograms) :局部二值模式直方图
    • 一种高效的人脸识别算法
    • 对光照变化有一定鲁棒性
  • threshold=80 :设置识别阈值
    • 当预测的置信度距离大于此值时,返回-1(无法识别)
    • 这个值需要根据实际情况调整

7. 模型训练

python 复制代码
recognizer.train(images, np.array(labels))
  • 使用训练图像和对应标签训练模型
  • 将Python列表转换为numpy数组,这是OpenCV函数常见的输入要求

8. 预测执行

python 复制代码
label, confidence = recognizer.predict(predict_image)
  • predict():对新的图像进行预测
  • 返回两个值:
    • label:预测的标签(对应之前的0或1)
    • confidence:置信度(距离值),越小表示匹配度越高

9. 结果输出

python 复制代码
print('这人是:', dic[label])
print('置信度', confidence)
  • 使用字典将数字标签转换为可读名称
  • 输出识别结果和置信度
  • 结果输出如下:

三、 LBPH算法原理解析

LBPH工作的三个主要步骤:

  1. 局部二值模式(LBP)特征提取

    • 对每个像素与其邻域像素比较
    • 生成二进制模式
  2. 直方图构建

    • 将图像分成多个小区域
    • 为每个区域构建LBP直方图
  3. 比较直方图

    • 比较输入图像与训练图像的直方图
    • 使用卡方距离等度量方法

四、关键点解析

  1. 图像加载 :所有图像都以灰度模式加载(cv2.IMREAD_GRAYSCALE),因为人脸识别通常不需要颜色信息。

  2. 标签系统:使用数字标签(0,1)对应不同人物,并通过字典转换为可读名称。

  3. LBPH算法:Local Binary Patterns Histograms是一种高效的人脸识别算法,对光照变化有一定的鲁棒性。

  4. 阈值设置:阈值设为80,当预测的置信度高于此值时,返回-1(无法识别)。

  5. 训练与预测:先使用已知图像训练模型,然后对新的图像进行预测。

五、改进方向

  1. 增加更多的人脸样本以提高准确性
  2. 实现实时摄像头人脸识别
  3. 添加人脸检测功能,自动裁剪人脸区域
  4. 使用更先进的深度学习模型

总结

通过这个简单的示例,我们了解了如何使用OpenCV实现基础的人脸识别功能。虽然这个系统比较简单,但它展示了人脸识别的基本原理和工作流程。随着样本数量的增加和算法的优化,系统的识别准确率可以进一步提高。

希望这篇博客对你理解人脸识别技术有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

万事胜意,得偿所愿!加油各位!!!🚀🚀🚀

相关推荐
NAGNIP8 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab9 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab9 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP13 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年13 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼13 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS13 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区14 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈14 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang15 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx