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

news2025/5/12 5:33:18

文章目录

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

引言

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

一、概述

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

二、代码实现

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. 导入库解析

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

3. 训练数据准备

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. 标签系统

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

5. 待识别图像加载

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

6. LBPH识别器创建

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

7. 模型训练

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

8. 预测执行

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

9. 结果输出

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实现基础的人脸识别功能。虽然这个系统比较简单,但它展示了人脸识别的基本原理和工作流程。随着样本数量的增加和算法的优化,系统的识别准确率可以进一步提高。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙 使用动画 简单使用

鸿蒙 使用动画 简单使用 动画就两个,属性动画和转场动画 属性动画只是组件的属性发生变化,而转场动画是指对将要出现或消失的组件做动画,而文档的其他动画只是给这两个动画效果锦上添花罢了 这篇文章简单介绍这两个动画,其他的…

arcgis和ENVI中如何将数据输出为tif

一、arcgis中转换为tif 右键图层: Data -> Export Data, 按照图示进行选择,选择tiff格式导出即可,还可以选择其他类型的格式,比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)

文章目录 1. 相关资源2. 核心特性3. 安装与部署3.1 环境准备3.2 部署RagFlow3.3 更新RagFlow3.4 系统配置 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步骤4.1.2 常见问题 4.2 接入 VLLM 模型 5. 应用场景6. 总结 1. 相关资源 官网GitHub文档中心 2. 核心特性 &#x1f…

计算机网络 4-2-1 网络层(IPv4)

2 IPv4分组 各协议之间的关系 IP协议(Internet Protocol, 网际协议)是互联网的核心&#xff01; ARP协议用于查询同一网络中的<主机IP地址&#xff0c;MAC地址>之间的映射关系 ICMP协议用于网络层实体之间相互通知“异常事件” IGMP协议用于实现IP组播 2.1 结构<首…

Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)

一、模型评估 1. 准确率&#xff08;Accuracy&#xff09;&#xff1a;这是最基本的评估指标之一&#xff0c;表示模型在测试集上正确 分类样本的比例。对于分类任务而言&#xff0c;准确率是衡量模型性能的直观标准。 2. 损失函数值&#xff08;Loss&#xff09;&#xff1…

Linux工作台文件操作命令全流程解析(高级篇之vim和nano精讲)

全文目录 1 简单易用的 Nano (入门之选)1.1 适用场景1.2 安装命令1.3 基础操作1.4 优点 2 功能强大的 Vim2.1 适用场景2.2 安装命令2.3 模式说明‌2.4 常用命令2.4.1 普通模式2.4.2 编辑模式2.4.3 可视模式2.4.4 命令行模式 3 参考文献 写在前面 作为运维或者研发&#xff0c;日…

大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现

文章目录 大数据产品销售数据分析&#xff1a;基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构数据可视化模块设计图后台管理模块设计数据库设计 五、开发技术介绍Flask框架Python爬…

VS2022 Qt配置Qxlsx

目录 1、下载QXlsx&#xff0c;并解压文件夹 ​编辑2、打开VS2022配置QXlsx 3、VS配置Qxslx库 方法一&#xff1a;常规方法 方法二&#xff1a;直接使用源码 方法三&#xff1a;将QXlsx添加到Qt安装目录&#xff08;暂时尝试未成功&#xff09; 1、下载QXlsx&#xff0c;…

OSPF案例

拓扑图&#xff1a; 要求&#xff1a; 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;…

《用MATLAB玩转游戏开发》贪吃蛇的百变玩法:从命令行到AI对战

《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08;2D图形交互&#xff09;-&#x1f40d; 贪吃蛇的百变玩法&#xff1a;从命令行到AI对战 &#x1f3ae; 欢迎来到这篇MATLAB贪吃蛇编程全攻略&#xff01;本文将带你从零开始&#xff0c;一步步…

【数据结构与算法】图的基本概念与遍历

目录 一、图的基本概念 1.1 图的基本组成 1.2 图的分类 1.3 顶点的度数 1.4 路径与回路 1.5 子图与特殊图 二. 图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、深度优先遍历 3.1 原理 3.2 实现步骤 3.3 代码实现 四、广度优先遍历 4.1 原理 4.2 实现步骤 4.3 代码…

Linux云服务器配置git开发环境

文章目录 1. 安装 git2. git clone3. git add .4. git commit -m 提交记录5. git push&#x1f351; 异常原因&#x1f351; 解决办法 6. git pull7. git log8. git rm9. git mv10. git status 1. 安装 git sudo yum install git -y2. git clone 此命令的作用是从远程仓库把代…

手机浏览器IP归属地查询全指南:方法与常见问题解答

在当今数字化时代&#xff0c;手机浏览器已成为人们日常生活中不可或缺的工具之一。然而&#xff0c;在使用手机浏览器的过程中&#xff0c;有时我们需要了解当前网络连接的IP归属地信息&#xff0c;那么&#xff0c;手机浏览器IP归属地怎么查看呢&#xff1f;本文将详细介绍几…

Microsoft Azure DevOps针对Angular项目创建build版本的yaml

Azure DevOps针对Angular项目创建build版本的yaml&#xff0c;并通过变量控制相应job的执行与否。 注意事项&#xff1a;代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容&#xff1a; 1. 自动触发build 通过指定code branch使提交到此代码库的…

Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 0.准备 1&#xff09;防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

如何通过ABAP获取SAP生产订单的目标成本

SAP存储生产订单成本的主要底表包括&#xff1a; COBK: CO凭证表头COEP: CO凭证行项目COSS: 来自CO内部的汇总数据COSP: 来自CO外部部的汇总数据 先说结论&#xff1a;SAP 对生产订单的目标成本是没有保存到底表的。那么如何通过代码的方式获取呢&#xff1f; K_KKB_KKBCS_O…

【leetcode100】最长重复子数组

1、题目描述 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。示例 2&…

基于Django框架的股票分红数据爬虫和展示系统

项目截图 一、项目简介 本项目是一个基于 Django 框架的股票分红数据爬虫和展示系统。它可以从东方财富网站爬取股票分红数据&#xff0c;并将数据存储到 Django 数据库中&#xff0c;同时提供数据查询、导出和图表展示功能。该系统为用户提供了一个方便的平台&#xff0c;用于…

QT高级(1)QTableView自定义委托集合,一个类实现若干委托

自定义委托集合 1同系列文章2 功能3 源码 1同系列文章 QT中级&#xff08;1&#xff09;QTableView自定义委托&#xff08;一&#xff09;实现QSpinBox、QDoubleSpinBox委托 QT中级&#xff08;2&#xff09;QTableView自定义委托&#xff08;二&#xff09;实现QProgressBar委…

小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?

在科技飞速发展的今天&#xff0c;半导体行业作为信息技术的核心领域之一&#xff0c;其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而&#xff0c;随着芯片制造工艺的不断进步&#xff0c;传统的单片集成方式逐渐遇到了技术瓶颈&#xff0c;如摩尔定律逐渐逼近…