在前面一篇教程中,我们学习了OpenCV中基于特征脸的人脸识别的代码实现,我们通过代码

Ptr<FaceRecognizer> model = createEigenFaceRecognizer();

创建了人脸识别模型类,该识别模型类基于特征值人脸。该类有几个重要的成员:

int _num_components;
double _threshold;
vector<Mat> _projections;
Mat _labels;
Mat _eigenvectors;
Mat _eigenvalues;
Mat _mean;

     _num_components表示我们的特征脸识别算法通过PCA降维后保留的特征向量数目,如果在创建人脸识别类时没有指定它的值,则它会保留所有的特征向量,比如我们例子中有399个采样图片,每个图片都为10304维,则最多的特征值数目为399,_num_components的值即为399。_threshold是判定输入的图像属于那一个特征脸时使用。如果类创建时候,没有指定它的值,则默认它会被赋予一个很大的值。我们可以通过下面的代码在类初始化时指定他们的值。

int num_components = 10;
double threshold = 10.0;
Ptr<FaceRecognizer> model = createEigenFaceRecognizer(num_components, threshold);

创建人脸识别模型类之后,我们首先要调用train函数:

model->train(images, labels);

    该函数参数为样本图像集合以及样本图像标签集合,在该函数中,会通过PCA算法,得到采样集合的特征值和特征向量,并把每个采样图像投影到PCA子空间,放在变量 _projections中。所谓的投影PCA空间,就是用当前采样图向量减去均值向量,然后用特征向量乘以它,得到的y值。

详细参考http://www.cnblogs.com/mikewolf2002/p/3432243.html

进过train函数后,我就得到了一系列的PCA空间投影图。

然后,我们会调用predict函数,传入带识别的人脸图像,该函数会返回检测到的人脸标签号。

int predictedLabel = model->predict(testSample);

   在该函数中,会首先把testSample投影到PCA空间,然后和_projections中保存的特征图像挨个比较,距离最近的特征图标签号即为输入图像对应的人。注意在比较中,用到域值_threshold,如果所有特征图距离都大于域值,则会返回-1,没有在模型中找到对应的人脸。

for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {

    double dist = norm(_projections[sampleIdx], q, NORM_L2);

   if((dist < minDist) && (dist < _threshold)) {

        minDist = dist;

        minClass = _labels.at<int>((int)sampleIdx);

    }

}

人脸识别模型类中还有两个重要的函数:load, save,我们在工程FirstOpenCV31中增加save函数:

model->save("face.data");

在工程FirstOpenCV33中,我们跳过train环节,直接load, face.data,这样可以加快程序执行速度。

model->load("face.data");

程序代码:FirstOpenCV31,FirstOpenCV33

 

OpenCV学习(37) 人脸识别(2)的更多相关文章

  1. OpenCV学习(38) 人脸识别(3)

                前面我们学习了基于特征脸的人脸识别,现在我们学习一下基于Fisher脸的人脸识别,Fisher人脸识别基于LDA(线性判别算法)算法,算法的详细介绍可以参考下面两篇教程内容: ...

  2. OpenCV学习(36) 人脸识别(1)

    本文主要参考OpenCV人脸识别教程:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html 1.OpenCV ...

  3. OpenCV学习(40) 人脸识别(4)

    在人脸识别模式类中,还实现了一种基于LBP直方图的人脸识别方法.LBP图的原理参照:http://www.cnblogs.com/mikewolf2002/p/3438698.html       在 ...

  4. 【从零学习openCV】IOS7人脸识别实战

    前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集 ...

  5. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  6. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  7. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【二】人脸预处理

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  8. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  9. 基于Opencv快速实现人脸识别(完整版)

    无耻收藏网页链接: 基于OpenCV快速实现人脸识别:https://blog.csdn.net/beyond9305/article/details/92844258 基于Opencv快速实现人脸识 ...

随机推荐

  1. 001 Java 深拷贝、浅拷贝及Cloneable接口

    原本写过,后来在阅读的时候,感觉自己都不是太明白了,删除后参考人家的又重新写了一份. 一:开篇 1.复制一个变量 举例是int类型. 其他其中七种原始数据类型同样适用. 原始类型:boolean,ch ...

  2. linux下文件转码

    一.工具介绍 enca是一个很好用的文件转码工具,使用命令 sudo apt-get install enca 即可安装 二.基本用法 1.查看文件编码 $ enca filename 2.文件转码 ...

  3. Eclipse中syso 快捷键 Alt + / 不能使用的问题

    通过使用windows-preferences-java-editor-templates中的快捷键,可以显著提升输入速度.快捷键的设置一般是在这里以及general下面的keys里面设置. 但是,在 ...

  4. Ionic Js十五:对话框

    $ionicPopup ionic 对话框服务允许程序创建.显示弹出窗口. $ionicPopup 提供了3个方法:alert(), prompt(),以及 confirm() . 实例 HTML 代 ...

  5. MapReduce与批处理------《Designing Data-Intensive Applications》读书笔记14

    之前的文章大量的内容在和大家探讨分布式存储,接下来的章节进入了分布式计算领域.坦白说,个人之前专业的重心侧重于存储,对许多计算的内容理解可能不是和确切,如果文章中的理解有所不妥,愿虚心赐教.本篇将和大 ...

  6. CSUOJ 1979 古怪的行列式

    Description 这几天,子浩君潜心研究线性代数. 行列式的值定义如下: 其中,τ(j1j2...jn)为排列j1j2...jn的逆序数. 子浩君很厉害的,但是头脑经常短路,所以他会按照行列式值 ...

  7. MDP中值函数的求解

    MDP概述   马尔科夫决策过程(Markov Decision Process)是强化学习(reinforcement learning)最基本的模型框架.它对序列化的决策过程做了很多限制.比如状态 ...

  8. redis 客户端命令

    Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接 1 .CLIENT LIST 返回连接到 redis 服务的客户端列表 2 .CLIENT SETNA ...

  9. luoguP4491 [HAOI2018]染色 广义容斥原理 + FFT

    非常明显的摆了一个NTT模数.... 题目中求恰好\(k\),那么考虑求至少\(k\) 记\(g(k)\)表示至少\(k\)中颜色出现了恰好\(S\)次 那么,\[g(k) = \binom{M}{k ...

  10. Eclipse 工具下Maven 项目的快速搭建

    Eclipse 工具下Maven 项目的搭建 参考博文:https://www.cnblogs.com/iflytek/p/7096481.html 什么是Maven项目 简单来说,传统的Web项目: ...