计算机视觉与图像处理学习笔记之人脸识别的三种方法

2023-10-29

        人脸检测是指在图像中完成人脸定位的过程,而人脸识别是在人脸检测的基础上进一步判断人的身份,OpenCV提供了三种人脸识别的方法:EigenFaces(特征脸)、FisherFaces(人鱼脸)、Local Binary Patterns Histograms,LBPH(局部二进制编码直方图)。

1、EigenFaces

EigenFaces人脸识别的基本步骤:

(1)调用cv2.face.EigenFaceRecognizer_create()方法创建EigenFaces识别器;

(2)调用识别器的train()方法以便使用已知图像训练模型;

(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。

用到的函数:

recognizer=cv2.face.EigenFaceRecognizer_create([num_components[,threshold]])

参数说明:recognizer为返回的EigenFaces识别器对象

                  num_components为分析时的分量个数,默认为0,表示根据实际输入决定

                  threshold为人脸识别时采用的阈值

recognizer.train(src, labels)

参数说明:src为用于训练的已知图像数组

                  labels为标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值

label, confidence = recognizer.predict(testimg)

参数说明:testimg为未知人脸图像

                  label为返回的标签值

                  confidence为返回的可信度,表示未知人脸和模型中已知人脸之间的距离,0表示完全匹配,低于5000可认为是可靠的匹配结果

代码如下:

import cv2
import numpy as np
img1 = cv2.imread('xxx', 0)
img2 = cv2.imread('xxx', 0)
img3 = cv2.imread('xxx', 0)
img4 = cv2.imread('xxx', 0)
img5 = cv2.imread('xxx', 0)
img1 = cv2.resize(img1, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img2 = cv2.resize(img2, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img3 = cv2.resize(img3, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img4 = cv2.resize(img4, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img5 = cv2.resize(img5, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 创建训练图像数组
train_images = [img1, img2, img3, img4, img5]
# 创建标签数组,表示训练图像数组中人脸的身份
labels = np.array([1, 2, 3, 4, 5])
# 创建EigenFaces识别器
recognizer = cv2.face.EigenFaceRecognizer_create()
# 执行训练操作
recognizer.train(train_images, labels)
# 打开测试图像
testimg = cv2.imread('xxx', 0)
testimg = cv2.resize(testimg, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 识别人脸
label, confidence = recognizer.predict(testimg)
# 输出识别结果
print('匹配标签:', label)
print('可信度:', confidence)

 注意:读取图像时必须转换为灰度图;

            所有的用于训练的已知人脸图像和用于测试的未知人脸图像的尺寸必须一致(程序中已体现这一点,可以根据自己的实际和需要设置尺寸);

            recognizer = cv2.face.EigenFaceRecognizer_create()函数中的face来自于OpenCV的贡献库,所以需要安装opencv-contrib-python,并且要与opencv-python的版本一致,否则程序会报错。

下面分别是用与训练图像数组完全一样和完全不一样的图片下的结果:

 2、FisherFaces

FisherFaces人脸识别的基本步骤:

(1)调用cv2.face.FisherFaceRecognizer_create()方法创建FisherFaces识别器;

(2)调用识别器的train()方法以便使用已知图像训练模型;

(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。

 代码与EigenFaces类似,只要将创建识别器

 recognizer=cv2.face.EigenFaceRecognizer_create()改为recognizer=cv2.face.FisherFaceRecognizer_create()即可。

3、LBPH

LBPH算法处理图像的基本原理:

        取像素x周围(邻域)的8个像素与其比较,像素值比像素x大的取0,否则取1。将8个像素对应的0、1连接得到一个8为二进制数,将其转换为十进制数,作为像素x的LBP值;

        对图像的所有像素按相同的方法进行处理,得到整个图像的LBP图像,该图像的直方图就是图像的LBPH。

LBPH人脸识别的基本步骤:

(1)调用cv2.face.LBPHFaceRecognizer_create()方法创建LBPH识别器;

(2)调用识别器的train()方法以便使用已知图像训练模型;

(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。

用到的函数:

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

参数说明:recognizer为返回的LBPH识别器对象

                  radius为邻域的半径大小

                  neighbors为邻域内像素点的数量,默认为8

                  grid_x为将LBP图像划分为多个单元格时,水平方向上的单元格数量,默认为8

                  grid_x为将LBP图像划分为多个单元格时,垂直方向上的单元格数量,默认为8

                  threshold为人脸识别时采用的阈值

recognizer.train(src, labels)

参数说明:src为用于训练的已知图像数组

                  labels为标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值

label, confidence = recognizer.predict(testimg)

参数说明:testimg为未知人脸图像

                  label为返回的标签值

                  confidence为返回的可信度,表示未知人脸和模型中已知人脸之间的距离,0表示完全匹配,低于50可认为是可靠的匹配结果

代码实现:

import cv2
import numpy as np
img1 = cv2.imread('xxx', 0)
img2 = cv2.imread('xxx', 0)
img3 = cv2.imread('xxx', 0)
img4 = cv2.imread('xxx', 0)
img5 = cv2.imread('xxx', 0)
#
img1 = cv2.resize(img1, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img2 = cv2.resize(img2, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img3 = cv2.resize(img3, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img4 = cv2.resize(img4, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img5 = cv2.resize(img5, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 创建训练图像数组
train_images = [img1, img2, img3, img4, img5]
# 创建标签数组,表示训练图像数组中人脸的身份
labels = np.array([1, 2, 3, 4, 5])
# 创建EigenFaces识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 执行训练操作
recognizer.train(train_images, labels)
# 打开测试图像
testimg = cv2.imread('xxx', 0)
testimg = cv2.resize(testimg, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 识别人脸
label, confidence = recognizer.predict(testimg)
# 输出识别结果
print('匹配标签:', label)
print('可信度:', confidence)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机视觉与图像处理学习笔记之人脸识别的三种方法 的相关文章

  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • BRISK 特征检测器检测零个关键点

    下面显示的 Brisk 探测器没有给我任何关键点 有人可以提出一个问题吗 我将尝试用一些代码解释我在下面所做的事情 include opencv2 features2d features2d hpp using namespace cv u
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • opencv水印周围的轮廓

    我想在图像中的水印周围画一个框 我已经提取了水印并找到了轮廓 但是 不会在水印周围绘制轮廓 轮廓是在我的整个图像上绘制的 请帮我提供正确的代码 轮廓坐标的输出为 array 0 0 0 634 450 634 450 0 dtype int
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 深度估计的准确性 - 立体视觉

    我正在研究立体视觉 我对这个问题的深度估计的准确性感兴趣 这取决于几个因素 例如 适当的立体校准 旋转 平移和失真提取 图像分辨率 相机和镜头质量 失真越小 色彩捕捉正确 两个图像之间的匹配特征 假设我们没有低成本的相机和镜头 没有廉价的网
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • Opencv 2.4.2 代码讲解-人脸识别

    我参考OpenCV提供的文档制作了一个人脸识别程序 可以识别多个人脸 并且工作正常 在文档中 他们制作了省略号来突出显示脸部 我不明白的是他们如何计算椭圆的中心 他们的计算如下 for int i 0 i lt faces size i P
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 将图像加载到现有 Mat 中

    有没有办法将图像加载到现有的 Mat 中 如果没有 有没有办法控制 OpenCV 在调用 cv imread 时分配内存的位置 我只是为您的类创建一个构造函数 该构造函数接受 imread 的输入参数并将图像直接加载 并分配 到您的类中 所
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 在 opencv 中一次性将旋转和平移结合起来

    我有一段用于旋转和平移图像的代码 Point2f pt 0 in rows double angle atan trans c trans b 180 M PI Mat r getRotationMatrix2D pt angle 1 0
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 在openCV内部调用Gstreamer

    我需要在 openCV 代码中调用 Gstremaer 本质上是打开摄像机 当我查看源代码时 modules highgui src cap gstreamer cpp似乎是我正在寻找的文件 我用 Gstreamer 标志编译了 OpenC
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误

    我已经在Windows操作系统中安装了opencv 3 0 0 我已运行该应用程序并已成功将其安装在C 驱动器并还复制了cv2 pyd文件输入C Python27 Lib site packages正如我在几个教程视频中看到的那样 在我的
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op

随机推荐

  • 数据结构--二叉排序树

    目录 二叉排序树的定义 二叉排序树的查找 二叉排序树的插入 二叉排序树的构造 二叉排序树的删除 查找效率分析 回顾 二叉排序树的定义 二叉排序树的查找 查找成功的情况 查找失败的情况 二叉排序树的插入 注意 1 二叉排序树不允许出现重复的值
  • Vue3的自定义指令,项目中的运用

    目录 一 什么是自定义指令 1 定义 2 什么时候使用自定义指定 二 Vue3中的自定义指令 1 全局自定义指令 2 组件自定义指令 三 指令钩子 1 钩子 2 钩子参数 四 自定义指令的常见用法 1 添加事件监听 2 操作DOM 一 什么
  • 信息熵与信息增益

    信息熵 information entropy 是度量样本集合纯度 不确定度最常用的指标之一 但要注意 信息熵越小 表示不确定度越低 确定度越高 纯度越高 E n t D
  • element-ui 动态表单实现一行两列

    借鉴element ui的文档 再用el row与el col相结合实现表单一行两列功能 下面是代码
  • 分布式配置管理系统QConf

    分布式配置管理系统QConf 分布式配置管理系统QConf是360公司开源的系统 详见 https github com Qihoo360 QConf 整体架构图如下 资料 1 https github com Qihoo360 QConf
  • 第4章_瑞萨MCU零基础入门系列教程之瑞萨 MCU 源码设计规范

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do
  • 【git】用好 stash,工作超nice

    一 介绍 如果修改后的内容还不想commit 就可以用git stash命令 它会将工作区和暂存区中的修改 也就是还没commit的内容 都会被保存到堆栈里 并在之后恢复到任意指定的分支上 二 应用场景 1 在分支a进行开发feature
  • python统计秒数

    code 1 没有cuda的版本 import time s time time for i in range 100 pass t time time print time sec format t s 2 cuda 同步 torch c
  • DC/DC电路——自举电容(boost)的作用

    DCDC电路中 偶尔存在有自举电容的情况 手册对该电容的定义如下 假如该点的电压低于MOSFET的最小开启电压 MOSFET将保持关断状态 看芯片手册的内部结构 此芯片的MOSFET为N沟道的MOSFET N沟道的MOSFET开通电压VGS
  • 第36.4节 动画-路径动画中的角度控制问题

    目录 本节功能 关键点 所有代码 本节功能 本节创建了一个高高低低的三维的路径 在楼顶和地面之间穿梭 一个飞机沿着这个路径进行飞行 如下图所示 请使用浏览器打开 平时遇到问题或加群也可以加我微信 13324598743 击此打开网盘资源链接
  • 使用jiraRestClient报错java.lang.ClassNotFoundException: com.google.common.base.MoreObjects

    问题是swagger需要guava依赖 导入依赖解决
  • 【工欲善其事必先利其器】论文编辑及文献管理(Endnote,Latex,JabRef ,overleaf)资源下载及使用指南

    EndnoteX9 百度网盘下载及安装 Download 百度网盘 链接 https pan baidu com s 1 WWYVkwF0uAUVvv73XZM6Q 提取码 mnd9 参考链接 EndNote X9 3 3 Build 13
  • 字节跳动面试题 —— 水壶问题

    原题 给你一个装满水的 8 升满壶和两个分别是 5 升 3 升的空壶 请想个优雅的办法 使得其中一个水壶恰好装 4 升水 每一步的操作只能是倒空或倒满 图片 理解了这个题目的意思之后 我们的第一个方法肯定就是使用强大的脑力来进行暴力破解法
  • 关于常量指针的用法

    一 指向常量的指针 例1 int main int num 5 const int fun 100 int pi const int pci pi num pci fun printf num addr p value d n num nu
  • LocalDateTime、LocalDate、Date的相互转换

    目录 使用背景 转换方法 LocalDateTime 转 LocalDate LocalDate 转 LocalDateTime LocalDate 转 Date Date转LocalDate LocalDateTime转Date Date
  • 跑一跑NeuralAnnot

    GitHub 传送阵 一 运行 这东西标注器代码西八兄弟没开源 我搞完之后才发现是标注结果展示 1 环境 西八兄弟好像没给环境配置 和环境有关的就这句话 1 python 3 8或以上 不然会报错 2 pycocotools 3 libgl
  • Vue3 引入Element Plus

    Element Plus 是为适配 Vue3 而对 Element UI 进行重构后产生的前端组件库 包含丰富的基础组件 下面先贴出 官方文档 里面的介绍已经十分全面和详细 大家遇到的很多问题都可以在上面找到答案 假设现在我们已经用 vue
  • 社区发现算法(二)

    GN算法 本算法的具体内容请参考Finding and evaluating community structure in networks Newman and Girvan 重要概念 边介数 betweenness 网络中任意两个节点通
  • linux与centos的区别与联系

    linux与centos的区别与联系 1 centos是基于linux建立的操作系统 2 linux属于内核系统 只有终端命令界面 无图形界面 3 centos同时拥有终端命令界面和图形界面 4 linux和centos都是属于开源系统 一
  • 计算机视觉与图像处理学习笔记之人脸识别的三种方法

    人脸检测是指在图像中完成人脸定位的过程 而人脸识别是在人脸检测的基础上进一步判断人的身份 OpenCV提供了三种人脸识别的方法 EigenFaces 特征脸 FisherFaces 人鱼脸 Local Binary Patterns His