怎样使用OpenCV进行人脸识别

上传人:206****923 文档编号:40641543 上传时间:2018-05-26 格式:DOCX 页数:36 大小:1.11MB
返回 下载 相关 举报
怎样使用OpenCV进行人脸识别_第1页
第1页 / 共36页
怎样使用OpenCV进行人脸识别_第2页
第2页 / 共36页
怎样使用OpenCV进行人脸识别_第3页
第3页 / 共36页
怎样使用OpenCV进行人脸识别_第4页
第4页 / 共36页
怎样使用OpenCV进行人脸识别_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《怎样使用OpenCV进行人脸识别》由会员分享,可在线阅读,更多相关《怎样使用OpenCV进行人脸识别(36页珍藏版)》请在金锄头文库上搜索。

1、怎样使用 OpenCV 进行人脸识别本文大部分来自 OpenCV 官网上的 Face Reconition with OpenCV 这节内容(http:/docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html),小弟我尝试翻译一些重要内容。这部分内容是 Philipp Wagner 写的,他的 github:https:/ OpenCV 的安装和配置,会用 C+,用过一些 OpenCV 函数。基本的图像处理和矩阵知识也是需要的。gm:我是箫鸣的注释由于我仅仅是翻译,对于六级才过的我,肯定有一些翻译错的或者不当的地方,所

2、以请大家纠错。1.1.1.1. 介绍 Introduction从 OpenCV2.4 开始,加入了新的类 FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在 OpenCV 的opencvmodulescontribdocfacerecsrc 下找到,当然也可以在他的 github 中找到,如果你想研究源码,自然可以去看看,不复杂)目前支持的算法有Eigenfaces 特征脸createEigenFaceRecognizer()Fisherfaces createFisherFaceRecognizer()Local

3、 Binary Patterns Histograms 局部二值直方图 createLBPHFaceRecognizer()下面所有的例子中的代码在 OpenCV 安装目录下的 samples/cpp 下面都能找到,所有的代码商用或者学习都是免费的。1.2.1.2. 人脸识别 Face Recognition对人类来说,人脸识别很容易。文献Tu06告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张

4、图像,大脑是如何对它编码的?David Hubel 和 Torsten Wiesel 向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在Kanade73中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特

5、征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献Bru92中有描述。一个 22 维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。特征脸方法在文献TP91中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没

6、有把标签问题考虑进去。gm:读懂这段需要一些机器学习知识。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(Linear Discriminant Analysis,LDA)的特定类投影方法被提出来解决人脸识别问题BHK97。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(Gabor Wa

7、elets)(Wiskott97) ,离散傅立叶变换(Discrete Cosinus Transform,DCT)(Messer06) ,局部二值模式(Local Binary Patterns,LBP)(AHP04)。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。1.3.1.3. 人脸库 Face Database我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里(http:/face-rec.org/databases/)下载一个。AT0假

8、设/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。下面你根据自己的情况修改替

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

10、p;0J:FacesORLs110.bmp;0J:FacesORLs12.bmp;0J:FacesORLs13.bmp;0J:FacesORLs14.bmp;0J:FacesORLs15.bmp;0J:FacesORLs16.bmp;0J:FacesORLs17.bmp;0J:FacesORLs18.bmp;0J:FacesORLs19.bmp;0J:FacesORLs101.bmp;1J:FacesORLs1010.bmp;1J:FacesORLs102.bmp;1J:FacesORLs103.bmp;1J:FacesORLs104.bmp;1J:FacesORLs105.bmp;1J:Fa

11、cesORLs106.bmp;1。自然还有 c+编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来。(遍历多个文件夹,标上标签)特征脸 Eigenfaces我们讲过,图像表示的问题是他的高维问题。二维灰度图像 p*q 大小,是一个 m=qp 维的向量空间,所以一个 100*100 像素大小的图像就是 10,000 维的图像空间。问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息。主成分分析(Principal Component Analysis,PCA)是 Karl Pearson (1901

12、)独立发表的,而 Harold Hotelling (1933)把一些可能相关的变量转换成一个更小的不相关的子集。想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息。PCA 方法寻找数据中拥有最大方差的方向,被称为主成分。算法描述 Algorithmic Description令 表示一个随机特征,其中 .1. 计算均值向量 2. 计算协方差矩阵 S3. 计算 的特征值 和对应的特征向量 4. 对特征值进行递减排序,特征向量和它顺序一致. K 个主成分也就是 k 个 最大的特征值对应的特征向量。x 的 K 个主成份:其中 (11).PCA 基的重构:其

13、中 .然后特征脸通过下面的方式进行人脸识别:A 把所有的训练数据投影到 PCA 子空间B 把待识别图像投影到 PCA 子空间C 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。还有一个问题有待解决。比如我们有 400 张图片,每张 100*100 像素大小,那么 PCA 需要解决协方差矩阵的求解,而 X 的大小是 10000*400,那么我们会得到 10000*10000 大小的矩阵,这需要大概 0.8GB 的内存。解决这个问题不容易,所以我们需要另一个计策。就是转置一下再求,特征向量不变化。文献 Duda01中有描述。gm:这个 PCA 还是自己搜着看吧,这里的讲的不清楚,不适合

14、初学者看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 sr

15、c = _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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号