opencv中人脸识别算法的基本原理

2023-11-13

opencv中人脸识别算法的基本原理(一)

使用opencv中自带的三种人脸识别算法进行实验后,特意去了解学习了一下其基本原理,在这里记录下。

opencv人脸识别

关于如何使用opencv实现人脸识别的过程可以参考:
http://blog.csdn.net/wanghz999/article/details/78773643
http://blog.csdn.net/wanghz999/article/details/78776240
这两篇博客。这里不再赘述。opencv支持3种人脸识别的算法,分别是:

  1. Eigen Faces
  2. Fisher Faces
  3. Local Binary Pattern Histograms(局部二值模式直方图)

本文对三种算法的基本原理进行介绍。

Eigenfaces的原理

Eigenfaces就是特征脸的意思,是一种从主成分分析(Principal Component Analysis,PCA)中导出的人脸识别和描述技术。特征脸方法的主要思路就是将输入的人脸图像看作一个个矩阵,通过在人脸空间中一组正交向量,并选择最重要的正交向量,作为“主成分”来描述原来的人脸空间。为了更好地理解特征脸方法,需要先了解PCA的主要过程。

PCA主要过程

在很多应用中,需要对大量数据进行分析计算并寻找其内在的规律,但是数据量巨大造成了问题分析的复杂性,因此我们需要一些合理的方法来减少分析的数据和变量同时尽量不破坏数据之间的关联性。于是这就有了主成分分析方法,PCA作用:

  • 数据降维。减少变量个数;确保变量独立;提供一个合理的框架解释。
  • 去除噪声,发现数据背后的固有模式。

PCA的主要过程:

  1. 特征中心化:将每一维的数据(矩阵A)都减去该维的均值,使得变换后(矩阵B)每一维均值为0;
  2. 计算变换后矩阵B的协方差矩阵C;
  3. 计算协方差矩阵C的特征值和特征向量;
  4. 选取大的特征值对应的特征向量作为”主成分”,并构成新的数据集;

特征脸方法

特征脸方法就是将PCA方法应用到人脸识别中,将人脸图像看成是原始数据集,使用PCA方法对其进行处理和降维,得到“主成分”——即特征脸,然后每个人脸都可以用特征脸的组合进行表示。这种方法的核心思路是认为同一类事物必然存在相同特性(主成分),通过将同一目标(人脸图像)的特性寻在出来,就可以用来区分不同的事物了。人脸识别嘛,就是一个分类的问题,将不同的人脸区分开来。特征脸方法的过程(先计算特征脸,然后识别人脸):

  1. 将训练集中的N个人脸拉成一列(reshape(1,1)),然后组合在一起形成一个大矩阵A。若人脸图像大小为m * m,则矩阵A的维度是m * m * N;
  2. 将N个人脸在对应的维度求平均,得到一个“平均脸”;
  3. 将矩阵A中N个图像都减去“平均脸”,得到新矩阵B;
  4. 计算B的协方差矩阵;
  5. 计算协方差矩阵的特征值和特征向量(特征脸);
  6. 将训练集图像和测试集图像都投影到特征向量空间中,再使用聚类方法(最近邻或k近邻等)得到里测试集中的每个图像最近的图像,进行分类即可。

在opencv中void EigenFaceRecognizer::train();就是对训练集进行处理最终得到特征向量和阈值的过程,其中的阈值用于后面对测试图像的识别。int EigenFaceRecognizer:: predict(InputArray src) const;是对测试图像进行识别。

特征脸识别的局限性

要让系统准确识别需要保证人脸图像满足:

  1. 待识别图像中人脸尺寸接近特征脸中人脸的尺寸;
  2. 待识别人脸图像必须为正面人脸图像。

若不满足此条件,识别错误率很高。从PCA方法的过程可以看出,特征脸识别的方法是以每张人脸的一个维度(可以看出是矩阵的一列)为单位进行处理的,求得的特征向量(特征脸)中包含训练集每个纬度的绝大部分信息。但是若测试集中人脸尺寸不同,那么与特征脸中维度的也就没法对应起来。

Fisherfaces

在将Fisherfaces之前需要对线性判别进行一定的说明。

Fisher线性判别分析(linear discriminant analysis,LDA)

线性判别分析是由Fisher提出的线性判别方法,可以用来处理两类的线性判别问题。两类的线性判别问题可以看做所有的样本投影到一个方向(或者说是一个维度空间中),然后再这个空间中确定一个分类的阈值。过这个阈值点且与投影方向垂直的超平面就是分类面。判别思路是选择投影方向,使得投影后两类相隔尽可能远,类内又尽可能聚集(类间方差最大,类内方差最小)。
它的过程分为:

  1. 确定最优的投影方向:
  2. 在这个方向上确定分类阈值;

Fisherfaces方法

Fisherfaces方法结合了PCA和LDA的优点,其具体过程如下:

  1. PCA降维:对原始样本进行PCA处理,获取PCA处理之后的新样本;
  2. LDA特征提取:对降维后的样本使用Fisher线性判别方法,确定一个最优的投影方向,构造一个一维的特征空间(这就被称为Fisherfaces),将多维的人脸图像投影到Fisherfaces特征空间,利用类内样本数据形成一组特征向量,这组特征向量就代表了人脸的特征。

在opencv中void FisherFaceRecognizer::train();就是对训练集进行处理最终得到特征向量和阈值的过程,其中的阈值用于后面对测试图像的识别。int FisherFaceRecognizer:: predict(InputArray src) const;是对测试图像进行识别。

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

opencv中人脸识别算法的基本原理 的相关文章

  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh
  • 从凸点获取角点

    我编写了算法来提取图像中显示的点 它们形成凸形 我知道它们的顺序 如何从这些点中提取角点 顶部 3 个和底部 3 个 我正在使用opencv 如果你已经有了物体的凸包 并且该包包含角点 那么你需要做的就是简化包直到它只有 6 个点 有很多方
  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • 类型错误:只有长度为 1 的数组可以转换为 Python 标量

    我是 openCV 的初学者 正在尝试分析数独求解器的现有代码 有这一段代码会引发错误 samples np float32 np loadtxt feature vector pixels data responses np float3
  • 如何识别与我的对象相关的轮廓并找到它们的几何质心

    问题陈述和背景信息 EDIT 约束 法兰上的红色会随着时间的推移而变化 所以我此时不会尝试使用颜色识别来识别我的对象 除非它足够强大 此外 外部照明也可能是一个因素 因为将来这将是在室外区域 我有 RGB 深度相机 有了它 我就能捕捉到这个
  • OpenCv 与 Android studio 1.3+ 使用新的 gradle - 未定义的参考

    我在使用原生 OpenCv 2 4 11 3 0 0 也可以 和 Android Studio 1 3 以及新的 ndk 支持时遇到问题 所有关于 mk 文件的教程 但我想将它与新的实验性 gradle 一起使用 使用 Kiran 答案An
  • 体系结构 x86_64 的未定义符号:用于 caffe 构建

    我收到此错误的原因是caffe http caffe berkeleyvision org 建造 我该如何修复它 我使用的是 Mac OSX Yosemite 10 10 1 控制台日志 Machida no MacBook Air caf
  • 如何根据图像中的对象大小(以像素为单位)来测量现实世界中的对象大小(例如英寸、厘米等)?

    我计算了物体的大小pixel来自包含对象的图像 我想测量现实世界中物体的大小 有没有办法找出乘数来测量实际尺寸 我目前正在使用python以便实施 通常 您将使用相机获取图像 该相机通过镜头将 3 维场景投影到 2 维传感器上 垂直 高度
  • 多线程中的 OpenCV CascadeClassifier C++ 接口

    我想在多个线程中使用 CascadeClassifier 对象运行 OpenCV C 接口 我的程序的工作方式是我的主线程将 some file xml 加载到 CascadeClassifier 对象中 生成三个或更多线程并向它们传递级联
  • OpenCV:RGB 到 YUV 转换,并显示维基百科等通道

    我一直在寻找这种转换有一段时间了 在Linux上使用Python将RGB图像转换为YUV图像并访问Y U和V通道有哪些方法 使用 opencv skimage 等 更新 我用的是opencv img yuv cv2 cvtColor ima
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • 如何在Python中解码视频(内存文件/字节字符串)并逐帧浏览它?

    我正在使用 python 进行一些基本的图像处理 并希望将其扩展为逐帧处理视频 我从服务器获取视频作为 blob webm 编码 并将其作为字节字符串放入 python 中 b x1aE xdf xa3 xa3B x86 x81 x01B
  • Django manage.py runserver 优雅重载

    我正在开发一个 Django 项目 它集成了网络摄像头和 OpenCV 对于网络摄像头访问 我使用以下代码 如果我使用的话 网络摄像头可以被释放Ctrl C结束正在运行的服务器 但如果服务器在代码更改后重新加载 则网络摄像头无法正确释放 因
  • OpenCv SVM 输出文件格式

    我正在实现我自己的 SVM 而不是使用 OpenCV 的 svm 类 如果我愿意 我希望我的 SVM 用于保存其输出的 XML 文件将来可以由 OpenCV 的 SVM 加载和使用 为此我需要做什么 简而言之 OpenCV 使用什么格式来存
  • 找不到 tbb.dll

    我在 opencv 2 3 中使用 cvCanny 函数 它编译得很好 但在执行时出现错误 提示 tbb dll 未找到 这个dll有什么用处 在哪里可以找到这个 thanks 它是英特尔的一部分线程构建块 http threadingbu
  • 检测霍夫圆android

    我正在尝试使用 android 检测圆圈 我成功实现了检测线算法 但在尝试绘制霍夫圆算法时没有显示任何内容 这是我的代码 Mat thresholdImage new Mat getFrameHeight getFrameHeight 2
  • 将黑白图像完全转换为一组线条(也称为仅使用线条进行矢量化)

    我有许多黑白图像 想将它们转换为一组线条 这样我就可以完全或至少接近完全地从线条重建原始图像 换句话说 我试图将图像矢量化为一组线条 我已经看过了霍夫线变换 https docs opencv org2 4 modules imgproc
  • 将浮点数组图像转换为可用于 opencv 的格式

    我想知道是否有一种简单的方法可以将浮点数组图像转换为 iplimage 可以用opencv来处理 当然 我可以创建一个具有相同大小的空 iplimage 然后将浮点数组图像中的每个像素复制到空 iplimage 但是是否有更优雅的解决方案
  • python - opencv - 将像素从 bgr 转换为 hsv

    img cv2 imread example jpg img hsv cv2 cvtColor img cv2 COLOR BGR2HSV lower mask 0 10 lower red np array 0 50 50 upper r

随机推荐

  • 手机投屏不是全屏怎么办_手机投屏怎么满屏

    手机投屏是很多小伙伴们都喜欢玩的 不少小伙伴们小伙伴们在使用手机投屏的时候发现不能满屏 想要知道方法的小伙伴们 就让小编给大家详细的讲讲满屏方法吧 手机投屏怎么满屏 1 手机具有投屏的功能 目前大多数手机都已经具备发无线投屏的功能 2 电视
  • Linux 部署 Mycat 实现 MariaDB 分库分表

    安装请参照Mycat 实现 Mysql 集群读写分离 高飞的博客 CSDN博客MySQL 读写分离的概述https blog csdn net gaofei0428 article details 117503469 spm 1001 20
  • 【Stable Diffusion】安装过程中常见报错解决方法

    转自 https openai wiki stable diffusion error html 如何查看报错 在你安装时可能经常遇到各种各样的问题 但是对于一堆陌生的英文和各种各样的错误 大家可能经常无从下手 下面我将会教大家如何查看报错
  • SQL Server研习录(29)——sql server 设置列自增长

    SQL Server研习录 29 sql server 设置列自增长 版权声明 一 设置列自增长 1 创建表时 2 创建表后 版权声明 本文原创作者 清风不渡 博客地址 https blog csdn net WXKKang 一 设置列自增
  • kali Linux2021安装VMwareTools更新源(详解)

    VMwareTools安装 1 点击虚拟机设置 点击安装VMwareTools 2 打开kali进入界面 双击界面中的VMwareTools 3 进入界面中VMwareTools所在文件中复制压缩包到 目录中的tmp里 4 在tmp中打开终
  • 基于 Android 13 的 Activity 启动流程分析

    对于 Android 客户端开发者来说 Activity 是我们再熟悉不过的一个组件了 它是 Android 四大组件之一 是一个用于直接与用户交互的展示型 UI 组件 在开发过程中 启动并创建一个 Activity 流程非常简单 而在系统
  • 平面二维任意椭圆数据拟合算法推导及程序实现详解

    在刚刚过去的2017全国大学生数学建模比赛中 笔者有幸指导了一组本科学生参赛 对于赛题A CT系统参数标定及成像 中的CT系统参数标定 经过将问题进一步的提炼 问题最终变成了在平面二维空间中对任意椭圆进行拟合的问题 笔者花了大概四个小时的时
  • 战斗系统设计

    战斗设计 战斗技能 技能分类 普通攻击 被动技能 1 战斗开始时 2 间隔N次普攻后触发 3 阵亡时 4 生命低于x 触发 5 概率触发 优先级最低 6 替换普攻 7 有FindTargetRange单位靠近自身N米时触发 主动技能 属性技
  • 微信小程序text控件部分字体文字大小和颜色设置四

    在我们android中有的时候会要求textview控件显示文字部分颜色不同而且大小也不同 这个在微信小程序中怎么做呢 因为在微信小程序中所有的显示都是通过标签来实现的 那么标签时可以嵌套的 比如显示hello world 要求hello颜
  • Qt下使用DbgHelp和SetUnhandledExceptionFilter来获取Crash log/dump文件

    第一步 在pro中链接Lib LIBS lDbgHelp 第二步 在main源文件中添加 include
  • 计算机自顶向下WireShark实验2:DNS

    前言 本博客仅记录我自己做实验所用 在码云上看到一份比较好的自顶向下的实验记录 大家可以参考计算机自顶向下实验 实验内容 1 运行nslookup获取亚洲一个Web服务器的IP地址 那台服务器的IP地址是什么 答 对自己的学校采用即可 2
  • win10下web漏洞扫描工具:AWVS安装教程

    01 AWVS安装 windows上安装其实很简单 以安装AWVS12版本为例子 具体步骤如下 01 双击exe安装 02 点击 Next 03 选择我同意 04 设置用户名和密码 这里用户名是以邮箱为准的 密码需要复杂点 不然会提示密码太
  • 八、Linux编程之递归遍历目录

    八 Linux编程之递归遍历目录 目录 八 Linux编程之递归遍历目录 一 步骤分析 二 isFile 函数 三 isDir 函数 int sprintf char str const char format 四 main 主函数 五 运
  • linux audit 日志 查看用户_一项一项教你测等保2.0——Linux安全审计

    一 前言 前边我们已经讲了windows系统下的安全审计 现在我们讲讲Linux系统下的安全审计 其实两个系统下的测评项都是一样的 不一样的就是不同的系统查看系统配置的方法不一样 windows系统使用的都是图形交互界面 而且我们平时使用w
  • 荣誉加冕!八方锦程再次荣获招聘与任用价值大奖

    智享会ALL IN 2023 人力资源服务展汇聚了全国32个省市地区 21个行业的HR从业者 上下游客户 9月19 20日齐聚上海跨国采购会展中心 共同见证ALL IN 2023的盛大开幕 作为人力资源行业的奋进者 八方锦程与智享会同行走过
  • 【C语言机器学习】

    C语言机器学习
  • Java--JDBC编程练习题

    1 下面选项中 能够将游标从当前位置向下移一行的方法是 单选 A next B absolute introw C previous D last 参考答案 A 答案说明 absolute int row 将游标移动到此 ResultSet
  • 解决Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for

    解决Clipping input data to the valid range for imshow with RGB data 0 1 for floats or 0 255 for integers 报错描述 img plt imre
  • sarscape 将dem文件转化成stl_从STL文件生成有限元FEA网格

    随着计算机图形 硬件 以及3D打印技术的发展 基于面片网格的图形渲染及其格式变得越来越普及 有限元分析 FEA 中 工程师们也常常拿到基于面片网格的几何文件 如STL文件等 并进行后续的分析工作 由于面片网格和有限元实体网格有着根本性的区别
  • opencv中人脸识别算法的基本原理

    opencv中人脸识别算法的基本原理 一 使用opencv中自带的三种人脸识别算法进行实验后 特意去了解学习了一下其基本原理 在这里记录下 opencv人脸识别 关于如何使用opencv实现人脸识别的过程可以参考 http blog csd