好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

怎样使用OpenCV进行人脸识别.docx

36页
  • 卖家[上传人]:206****923
  • 文档编号:40641543
  • 上传时间:2018-05-26
  • 文档格式:DOCX
  • 文档大小:1.11MB
  • / 36 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 怎样使用 OpenCV 进行人脸识别本文大部分来自 OpenCV 官网上的 Face Reconition with OpenCV 这节内容(http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html),小弟我尝试翻译一些重要内容这部分内容是 Philipp Wagner 写的,他的 github: OpenCV 的安装和配置,会用 C++,用过一些 OpenCV 函数基本的图像处理和矩阵知识也是需要的[gm:我是箫鸣的注释]由于我仅仅是翻译,对于六级才过的我,肯定有一些翻译错的或者不当的地方,所以请大家纠错1.1.1.1. 介绍 Introduction从 OpenCV2.4 开始,加入了新的类 FaceRecognizer,我们可以使用它便捷地进行人脸识别实验本文既介绍代码使用,又介绍算法原理他写的源代码,我们可以在 OpenCV 的opencv\modules\contrib\doc\facerec\src 下找到,当然也可以在他的 github 中找到,如果你想研究源码,自然可以去看看,不复杂)目前支持的算法有Eigenfaces 特征脸createEigenFaceRecognizer()Fisherfaces createFisherFaceRecognizer()Local Binary Patterns Histograms 局部二值直方图 createLBPHFaceRecognizer()下面所有的例子中的代码在 OpenCV 安装目录下的 samples/cpp 下面都能找到,所有的代码商用或者学习都是免费的。

      1.2.1.2. 人脸识别 Face Recognition对人类来说,人脸识别很容易文献[Tu06]告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?David Hubel 和 Torsten Wiesel 向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸第一个自动人脸识别系统在[Kanade73]中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)通过计算测试和训练图像的特征向量的欧氏距离来进行识别这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。

      一些几何特征人脸识别近期工作在文献[Bru92]中有描述一个 22 维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别特征脸方法在文献[TP91]中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单低维子空间低维是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找拥有最大方差的那个轴虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去[gm:读懂这段需要一些机器学习知识]想象一个情况,如果变化是基于外部来源,比如光照轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的因此,一个使用线性鉴别(Linear Discriminant Analysis,LDA)的特定类投影方法被提出来解决人脸识别问题[BHK97]其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大近年来,各种局部特征提取方法出现为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。

      有关局部特征提取的方法有盖伯小波(Gabor Waelets)([Wiskott97]) ,离散傅立叶变换(Discrete Cosinus Transform,DCT)([Messer06]) ,局部二值模式(Local Binary Patterns,LBP)([AHP04])使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息1.3.1.3. 人脸库 Face Database我们先获取一些数据来进行实验吧我不想在这里做一个幼稚的例子我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里(http://face-rec.org/databases/)下载一个AT0假设/path/to/image.ext 是图像,就像你在 windows 下的 c:/faces/person0/image0.jpg最后我们给它一个标签 0这个标签类似代表这个人的名字,所以同一个人的照片的标签都一样我们对下载的 ORL 数据库进行标识,可以获取到如下结果:./at/s1/1.pgm;0./at/s1/2.pgm;0..../at/s2/1.pgm;1./at/s2/2.pgm;1..../at/s40/1.pgm;39./at/s40/2.pgm;39想象我已经把图像解压缩在 D:/data/at 下面,而 CSV 文件在 D:/data/at.txt。

      下面你根据自己的情况修改替换即可一旦你成功建立 CSV 文件,就可以像这样运行示例程序:facerec_demo.exe D:/data/at.txt1.3.2Creating the CSV File你不需要手工来创建一个 CSV 文件,我已经写了一个 Python 程序来做这事[gm:说一个我实现的方法如果你会 cmd 命令,或者称 DOS 命令,那么你打开命令控制台假设我们的图片放在 J:下的 Faces 文件夹下,可以输入如下语句:J:\Faces\ORL>dir /b/s *.bmp > at.txt然后你打开 at.txt 文件可能看到如下内容(后面的 0,1..标签是自己加的):J:\Faces\ORL\s1\1.bmp;0J:\Faces\ORL\s1\10.bmp;0J:\Faces\ORL\s1\2.bmp;0J:\Faces\ORL\s1\3.bmp;0J:\Faces\ORL\s1\4.bmp;0J:\Faces\ORL\s1\5.bmp;0J:\Faces\ORL\s1\6.bmp;0J:\Faces\ORL\s1\7.bmp;0J:\Faces\ORL\s1\8.bmp;0J:\Faces\ORL\s1\9.bmp;0J:\Faces\ORL\s10\1.bmp;1J:\Faces\ORL\s10\10.bmp;1J:\Faces\ORL\s10\2.bmp;1J:\Faces\ORL\s10\3.bmp;1J:\Faces\ORL\s10\4.bmp;1J:\Faces\ORL\s10\5.bmp;1J:\Faces\ORL\s10\6.bmp;1。

      自然还有 c++编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来遍历多个文件夹,标上标签)]特征脸 Eigenfaces我们讲过,图像表示的问题是他的高维问题二维灰度图像 p*q 大小,是一个 m=qp 维的向量空间,所以一个 100*100 像素大小的图像就是 10,000 维的图像空间问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息主成分分析(Principal Component Analysis,PCA)是 Karl Pearson (1901)独立发表的,而 Harold Hotelling (1933)把一些可能相关的变量转换成一个更小的不相关的子集想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息PCA 方法寻找数据中拥有最大方差的方向,被称为主成分算法描述 Algorithmic Description令 表示一个随机特征,其中 .1. 计算均值向量 2. 计算协方差矩阵 S3. 计算 的特征值 和对应的特征向量 4. 对特征值进行递减排序,特征向量和它顺序一致. K 个主成分也就是 k 个 最大的特征值对应的特征向量。

      x 的 K 个主成份:其中 (11).PCA 基的重构:其中 .然后特征脸通过下面的方式进行人脸识别:A. 把所有的训练数据投影到 PCA 子空间B. 把待识别图像投影到 PCA 子空间C. 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个还有一个问题有待解决比如我们有 400 张图片,每张 100*100 像素大小,那么 PCA 需要解决协方差矩阵的求解,而 X 的大小是 10000*400,那么我们会得到 10000*10000 大小的矩阵,这需要大概 0.8GB 的内存解决这个问题不容易,所以我们需要另一个计策就是转置一下再求,特征向量不变化文献 [Duda01]中有描述[gm:这个 PCA 还是自己搜着看吧,这里的讲的不清楚,不适合初学者看]OpenCV 中使用特征脸 Eigenfaces in OpenCV给出示例程序源代码#include “opencv2/core/core.hpp“#include “opencv2/contrib/contrib.hpp“#include “opencv2/highgui/highgui.hpp“#include #include #include usingusing namespacenamespace cv;usingusing namespacenamespace std;staticstatic Mat norm_0_255(InputArray _src) {Mat src = _src.getMat();// 创建和返回一个归一化后的图像矩阵:Mat dst;switchswitch(src.channels()) {casecase 1:cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);breakbreak;casecase 3:cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3);breakbreak;defaultdefault:src.copyTo(dst);breakbreak;}returnreturn dst;}//使用 CSV 文件去读图像和标签,主要使用 stringstream 和 getline 方法staticstatic void read_csv(constconst string') {std::ifstream file(filename.c_str(), ifstream::in);ifif (!file) {string error_message = “No valid input file was given, please check the given filename.“;CV_Error(CV_StsBadArg, error_message);}strin。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.