opencv进阶11-LBPH 人脸识别(人脸对比)

人脸识别的第一步,就是要找到一个模型可以用简洁又具有差异性的方式准确反映出每个人脸的特征。识别人脸时,先将当前人脸采用与前述同样的方式提取特征,再从已有特征集中找出当前特征的最邻近样本,从而得到当前人脸的标签。

OpenCV 提供了三种人脸识别方法,分别是 LBPH 方法、EigenFishfaces 方法、Fisherfaces方法。本节主要对 LBPH 方法进行简单介绍。

LBPH(Local Binary Patterns Histogram,局部二值模式直方图)所使用的模型基于 LBP(Local
Binary Pattern,局部二值模式)算法。LBP
最早是被作为一种有效的纹理描述算子提出的,由于在表述图像局部纹理特征上效果出众而得到广泛应用。

基本原理

LBP 算法的基本原理是,将像素点 A 的值与其最邻近的 8 个像素点的值逐一比较:

  • 如果 A 的像素值大于其临近点的像素值,则得到 0。
  • 如果 A 的像素值小于其临近点的像素值,则得到 1。

最后,将像素点 A 与其周围 8 个像素点比较所得到的 0、1 值连起来,得到一个 8 位的二进制序列,将该二进制序列转换为十进制数作为点 A 的 LBP 值。

下面以图 23-6 中左侧 3×3 区域的中心点(像素值为 76 的点)为例,说明如何计算该点的LBP 值。计算时,以其像素值 76 作为阈值,对其 8 邻域像素进行二值化处理,

  • 将像素值大于 76 的像素点处理为 1。例如,其邻域中像素值为 128、251、99、213 的点,都被处理为 1,填入对应的像素点位置上。
  • 将像素值小于 76 的像素点处理为 0。例如,其邻域中像素值为 36、9、11、48 的点,都被处理为 0,填入对应的像素点位置上。

根据上述计算,可以得到图 23-6 中右图所示的二值结果。

在这里插入图片描述
完成二值化以后,任意指定一个开始位置,将得到的二值结果进行序列化,组成一个 8 位的二进制数。

例如,从当前像素点的正上方开始,以顺时针为序得到二进制序列“01011001”。最后,将二进制序列“01011001”转换为所对应的十进制数“89”,作为当前中心点的像素值,如图 23-7 所示。

在这里插入图片描述
对图像逐像素用以上方式进行处理,就得到 LBP 特征图像,这个特征图像的直方图被称为 LBPH,或称为 LBP 直方图。

为了得到不同尺度下的纹理结构,还可以使用圆形邻域,将计算扩大到任意大小的邻域内。圆形邻域可以用(P, R)表示,其中 P 表示圆形邻域内参与运算的像素点个数,R 表示邻域的半径。

例如,在图 23-8 中就分别采用了不同的圆形邻域。

  • 左侧使用的是(4, 1)邻域,比较当前像素与邻域内 4 个像素点的像素值大小,使用的半径是 1。

  • 右侧使用的是(8, 2)邻域,比较当前像素与邻域内 8 个像素点的像素值大小,使用的半径是 2。在参与比较的 8 个邻域像素点中,部分邻域可能不会直接取实际存在的某个位置上的像素点,而是通过计算构造一个“虚拟”像素值来与当前像素点进行比较。
    在这里插入图片描述
    人脸的整体灰度由于受到光线的影响,经常会发生变化,但是人脸各部分之间的相对灰度会基本保持一致。LBP 的主要思想是以当前点与其邻域像素的相对关系作为处理结果,正是因为这一点,在图像灰度整体发生变化(单调变化)时,从 LBP 算法中提取的特征能保持不变。
    因此,LBP 在人脸识别中得到了广泛的应用。

从上面的介绍可以看到,LBP 特征与 Haar 特征很相似,都是图像的灰度变化特征。

函数介绍

在 OpenCV 中,可以用函数 cv2.face.LBPHFaceRecognizer_create()生成 LBPH 识别器实例模型,然后应用 cv2.face_FaceRecognizer.train() 函数完成训练,最后用cv2.face_FaceRecognizer.predict()函数完成人脸识别。
下面分别介绍上述三个函数。

  1. 函数cv2.face.LBPHFaceRecognizer_create()
    函数 cv2.face.LBPHFaceRecognizer_create()的语法格式为:

retval = cv2.face.LBPHFaceRecognizer_create( [, radius[, neighbors[,
grid_x[, grid_y[, threshold]]]]])

其中全部的参数都是可选的,含义如下:

  • radius:半径值,默认值为 1。
  • neighbors:邻域点的个数,默认采用 8 邻域,根据需要可以计算更多的邻域点。
  • grid_x:将 LBP 特征图像划分为一个个单元格时,每个单元格在水平方向上的像素个数。
    该参数值默认为 8,即将 LBP 特征图像在行方向上以 8 个像素为单位分组。
  • grid_y:将 LBP 特征图像划分为一个个单元格时,每个单元格在垂直方向上的像素个数。
    该参数值默认为 8,即将 LBP 特征图像在列方向上以 8 个像素为单位分组。
  • threshold:在预测时所使用的阈值。如果大于该阈值,就认为没有识别到任何目标对象。
  1. 函数cv2.face_FaceRecognizer.train()
    函数 cv2.face_FaceRecognizer.train()对每个参考图像计算 LBPH,得到一个向量。每个人脸
    都是整个向量集中的一个点。该函数的语法格式为:

None = cv2.face_FaceRecognizer.train( src, labels )

式中各个参数的含义为:

  • src:训练图像,用来学习的人脸图像。
  • labels:标签,人脸图像所对应的标签。
    该函数没有返回值。
  1. 函数cv2.face_FaceRecognizer.predict()
    函数 cv2.face_FaceRecognizer.predict()对一个待测人脸图像进行判断,寻找与当前图像距离最近的人脸图像。与哪个人脸图像最近,就将当前待测图像标注为其对应的标签。当然,如果待测图像与所有人脸图像的距离都大于函数 cv2.face.LBPHFaceRecognizer_create()中参数
    threshold 所指定的距离值,则认为没有找到对应的结果,即无法识别当前人脸。
    函数 cv2.face_FaceRecognizer.predict()的语法格式为:

label, confidence = cv2.face_FaceRecognizer.predict( src )

式中参数与返回值的含义为:

  • src:需要识别的人脸图像。
  • label:返回的识别结果标签。
  • confidence:返回的置信度评分。置信度评分用来衡量识别结果与原有模型之间的距离。
    0 表示完全匹配。通常情况下,认为小于 50 的值是可以接受的,如果该值大于 80 则认为差别较大。

示例:完成一个简单的人脸识别程序

import cv2
import numpy as np
images=[]
images.append(cv2.imread("face\\face2.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("face\\face3.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("face\\face4.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("face\\face5.png",cv2.IMREAD_GRAYSCALE))
labels=[0,0,1,1]
#print(labels)
recognizer = cv2.face.LBPHFaceRecognizer.create()
recognizer.train(images, np.array(labels))
predict_image=cv2.imread("face\\face4.png",cv2.IMREAD_GRAYSCALE)

label,confidence= recognizer.predict(predict_image)
print("label=",label)
print("confidence=",confidence)

其中的图片是我随便到网上下载的明星的图片。总体识别度不高,而且如果识别不到会直接返回0.这个在深度的时候也会有这个问题。需要调整判断逻辑。

返回结果:

label= 1
confidence= 0.0

先熟悉了解下,后续在集中对比下几个人脸识别的算法的区别及更合适的应用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子电路学习笔记之SA1117BH-1.2TR——LDO低压差线性稳压器

关于LDO调节器(Low Dropout Regulator)是一种电压稳压器件,常用于电子设备中,用于将高电压转换为稳定的低电压。它能够在输入电压和输出电压之间产生较小的差异电压,因此被称为"低压差稳压器"。 LDO调节器通…

【vue】更改角色权限后,实现页面不刷新更改其可展示的导航菜单

登入的角色本身属于领导级别(集团权限),没有下级的不同权限: 切换不同身份(公司),以获得相应部门的不同导航菜单及权限 这里实现:更改角色权限后,实现页面 不刷新 更改…

安卓主板定制_电磁屏/电容屏安卓平板基于MTK联发科方案定制

定制化行业平板 在各行各业中的地位越来越重要,甚至在行业转型和发展中发挥着不可替代的作用。随着工业化社会的快速发展,工业生产对智控设备要求越来越高,运用的范畴也越来越普遍广泛,工业级平板就是其中一种应用广泛的设备。 新…

jenkins 日志输出显示时间戳的方式

网上很多方式比较片面,最新版插件直接使用即可无需更多操作。 使用方式如下: 1.安装插件 Timestamper 2.更新全局设置 系统设置-找到 Timestamper 勾选 Enabled for all Pipeline builds 也可修改时间戳格式。 帮助信息中显示 When checked, timesta…

R package org.Hs.eg.db to convert gene id

文章目录 install使用org.Hs.egENSEMBL将Ensembl id convert to gene idorg.Hs.egGENENAME 将Ensembl id convert to gene nameorg.Hs.egSYMBOL 将 gene symbol convert to gene id我现在有一些ensembl id 如何转为 gene name注意你会遇到一些record不全的情况,gtf文…

基于Element-ui的颜色选取器,增加最近使用的颜色。

8个预设颜色值&#xff0c;使用一个颜色后&#xff0c;将颜色放到第一个预设颜色&#xff0c;去重&#xff0c;保存到本地。 完整代码自取 <template><div><el-color-picker :value"value" show-alpha :predefine"predefineColors" chan…

有没有免费格式转换工具推荐?PDF转化为PPT的方法

在当今职场生活中&#xff0c;掌握文件格式转换技能变得异常重要。将PDF文档转换为PPT格式可以在演讲、报告等场合更好地展示和传达信息&#xff0c;为我们的专业形象增添亮点&#xff0c;接下来我们可以一起来看一下“有没有免费格式转换工具推荐?PDF转化为PPT的方法”相关的…

Lua与C++交互(一)————堆栈

Lua与C交互&#xff08;一&#xff09;————堆栈 Lua虚拟机 什么是Lua虚拟机 Lua本身是用C语言实现的&#xff0c;它是跨平台语言&#xff0c;得益于它本身的Lua虚拟机。 虚拟机相对于物理机&#xff0c;借助于操作系统对物理机器&#xff08;CPU等硬件&#xff09;的一…

微信小程序canvas type=2d生成海报保存到相册、文字换行溢出显示...、文字删除线、分享面板

做个简单的生成二维码海报分享&#xff0c;我做的时候也找简单的方法看能不能实现页面直接截图那种生成图片&#xff0c;原生小程序不支持&#xff0c;不多介绍下面有全部代码有注释、参数自行替换运行看看&#xff0c;有问题可以咨询我&#xff0c;我写的已经上线 效果如图&a…

Excel带数值的计算公式

问题描述 如图&#xff0c;想实现在第三列单元格中实现带数值的计算表达式 解决方法 单元格 & "/" & 单元格 & "" & TEXT(单元格/单元格, "0.00%")& 为简单的 与 符号 最后设定单元格数值与格式&#xff08;保留两位小数…

【Rust】Rust学习 第十七章Rust 的面向对象特性

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种模式化编程方式。对象&#xff08;Object&#xff09;来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构中对象之间的消息传递。他在 1967 年创造了 面向对…

[MySQL]主从服务器布置

配置主服务器 配置文件 /etc/my.cnf 在[mysqld]下进行配置 log_binON //启动二进制日志 log-bin mysql-bin //启用二进制日志&#xff0c;用于记录主服务器的更新操作 server-id 1 // 用来表示mysql服务id,保证集成环境中的唯一性 , 范围 [1,2^32) read-only0 // 1表示只…

Android Studio 接入OpenCV最简单的例子 : 实现灰度图效果

1. 前言 上文 我们在Windows电脑上实现了人脸功能&#xff0c;接下来我们要把人脸识别的功能移植到Android上。 那么首先第一步&#xff0c;就是要创建一个Native的Android项目&#xff0c;并且配置好OpenGL&#xff0c;并能够调用成功。 这里我们使用的是openCV-4.8.0&#x…

SOLIDWORKS有限元分析

SOLIDWORKS是一款广泛使用的三维计算机辅助设计软件&#xff0c;同时它还具有强大的有限元分析功能。有限元分析是一种工程分析方法&#xff0c;它将复杂的实体分解成许多小的有限元素&#xff0c;以便对其进行数学建模和分析。SOLIDWORKS的有限元分析功能可以帮助工程师预测和…

在Flutter应用内部实现分屏功能

前言 这一次被要求实现屏幕上同时展示两个页面&#xff0c;并且两个页面的逻辑&#xff0c;功能互不影响&#xff0c;通俗一点讲就是在Flutter内部实现一个类似于分屏的功能&#xff0c;这可难不倒我。 方法 要在 Flutter 中实现一个屏幕的上半部分和下半部分展示不同的页面…

金融市场中的机器学习;快手推出自研语言模型“快意”

&#x1f989; AI新闻 &#x1f680; OpenAI可能面临《纽约时报》的起诉&#xff0c;侵犯知识产权引发争议 摘要&#xff1a;OpenAI使用《纽约时报》的文章和图片来训练AI模型&#xff0c;违反了《纽约时报》的服务条款&#xff0c;可能面临巨大损失。此前&#xff0c;也有其…

无涯教程-PHP - XML

简单的XML解析器解析 Name&#xff0c; attributes 和 textual content&#xff0c;简单的XML函数如下所示- simplexml_load_file() 此函数接受文件路径作为第一个参数&#xff0c;这是必需的。 simplexml_load_file(($fileName,$class,$options,$ns,$is_prefix) simplexml…

韩语字母及输入法介绍

韩语字母及输入法介绍 字母由来 朝鲜语字母的由来为如下&#xff1a;十五世纪的朝鲜王国世宗大王 和他的集贤殿大臣在思考&#xff0c;创制自己本国的文字&#xff0c;仿照了“天地人思想”和“发音器官的形象”而创制了朝鲜语字母。 ​ 元音是由三个要素而组成的&#xff1…

Confluent kafka 异常退出rd_tmpabuf_alloc0: rd kafka topic info_new_with_rack

rd_tmpabuf_alloc0: rd kafka topic info_new_with_rack 根据网上的例子&#xff0c;做了一个测试程序。 C# 操作Kafka_c# kafka_Riven Chen的博客-CSDN博客 但是执行下面一行时&#xff0c;弹出上面的异常&#xff0c;闪退。 consumer.Subscribe(queueName) 解决方案&…

TensorRT推理手写数字分类(三)

系列文章目录 &#xff08;一&#xff09;使用pytorch搭建模型并训练 &#xff08;二&#xff09;将pth格式转为onnx格式 &#xff08;三&#xff09;onxx格式转为engine序列化文件并进行推理 文章目录 系列文章目录前言一、TensorRT是什么&#xff1f;二、如何通过onnx生成en…
最新文章