读书人

人脸辨别(不是检测,而是识别源码下

发布时间: 2012-06-20 20:37:21 作者: rapoo

人脸识别(不是检测,而是识别,源码下载)

之前写了一个能够在任意道路上的汽车识别技术(已经实现,详细解析:http://blog.csdn.net/qjttxz/article/details/7640501),然后有人就问识别有哪些途径,这就让我想起以前大学的时候曾经改用过PCA来做人脸识别,这也算是入门级别吧,现在发现新版本的OPENCV自己的PCA算法封装已经非常强大,PCA的使用已经很简单了。

在讲之前先解析几个基本概念:

Eigenface:是计算机视觉中处理人脸识别时使用的特征向量,Eigenfaces翻译为“特征脸”,意思应该是指“脸特征空间”。

PCA:主成分分析 ( Principal Component Analysis , PCA )是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。计算主成分的目的是将高维数据投影到较低维空间。给定 n 个变量的 m 个观察值,形成一个 n ′ m 的数据矩阵, n 通常比较大。对于一个由多个变量描述的复杂事物,人们难以认识,那么是否可以抓住事物主要方面进行重点分析呢?如果事物的主要方面刚好体现在几个主要变量上,我们只需要将这几个变量分离出来,进行详细分析。但是,在一般情况下,并不能直接找出这样的关键变量。这时我们可以用原有变量的线性组合来表示事物的主要方面, PCA 就是这样一种分析方法。

编译使用的是OPENCV2.4(以前的 PCA封装很多参数的,这里不说了,要讲太费劲了)

整个源码地址:http://download.csdn.net/detail/qjttxz/4375753

#include <iostream>#include "cv.h"#include "highgui.h" using namespace std;using namespace cv; Mat normalize(const Mat& src) {    Mat srcnorm;    normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1);    return srcnorm;} int main(int argc, char *argv[]) {    vector<Mat> db;     // 加载灰度图片( 下载地址 http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html)    db.push_back(imread("s1/1.pgm",0));    db.push_back(imread("s1/2.pgm",0));    db.push_back(imread("s1/3.pgm",0));     db.push_back(imread("s2/1.pgm",0));    db.push_back(imread("s2/2.pgm",0));    db.push_back(imread("s2/3.pgm",0));     db.push_back(imread("s3/1.pgm",0));    db.push_back(imread("s3/2.pgm",0));    db.push_back(imread("s3/3.pgm",0));     db.push_back(imread("s4/1.pgm",0));    db.push_back(imread("s4/2.pgm",0));    db.push_back(imread("s4/3.pgm",0));     int total = db[0].rows * db[0].cols;     // 构建数据库阵列,这是不拷贝数据的,只是改变数据矩阵    Mat mat(total, db.size(), CV_32FC1);    for(int i = 0; i < db.size(); i++) {        Mat X = mat.col(i);        db[i].reshape(1, total).col(0).convertTo(X, CV_32FC1, 1/255.);    }     // 设定主要成分数量    int numPrincipalComponents = 12;     // 运行PCA    PCA pca(mat, Mat(), CV_PCA_DATA_AS_COL, numPrincipalComponents);     namedWindow("avg", 1);    namedWindow("pc1", 1);    namedWindow("pc2", 1);    namedWindow("pc3", 1);     // 找出最接近的面    imshow("avg", pca.mean.reshape(1, db[0].rows));     // 其他面的eigenfaces特征    imshow("pc1", normalize(pca.eigenvectors.row(0)).reshape(1, db[0].rows));    imshow("pc2", normalize(pca.eigenvectors.row(1)).reshape(1, db[0].rows));    imshow("pc3", normalize(pca.eigenvectors.row(2)).reshape(1, db[0].rows));   waitKey(0);
}
代码够简单了吧,我已经把相关参数做了说明了。


下面再给出参考资料的网址,有兴趣的必须去看看:

eiqenface特征的说明:http://en.wikipedia.org/wiki/Eigenface

eigenface人脸识别的paper:http://www.cs.tau.ac.il/~shekler/Seminar2007a/PCA%20and%20Eigenfaces/eigenfaces_cvpr.pdf

OPENCV的eigenface解析:

http://www.bytefish.de/blog/fisherfaces

http://www.cognotics.com/opencv/servo_2007_series/part_4/index.html


13楼qjttxz9小时前
HDR的功能我没用过,不过国外是有HDR的开源算法吧。
12楼yunchao630昨天 23:22
终于见到C++的版本了,有空学习下
11楼gzhujsj昨天 11:04
博主,我发现使用opencv 做人脸检测和识别,发现,头发对识别的结果影响很大,请问应该怎样处理?
Re: qjttxz昨天 12:14
回复gzhujsjn头发遮掩导致整个面部特征缺失,可以局部分析面部其他特征,例如嘴巴,或者把头发效果剔除。
10楼guoming0000昨天 06:24
顶一下楼主,但其实写的不够多啊,新的OpenCV目录下OpenCV241\opencv\modules\contrib\src有个facerec.cpp文件,里面有pca,lda等人脸识别算法。
Re: qjttxz昨天 08:40
回复guoming0000n其实想多写的,只是时间比较少,只能一点点来。
Re: guoming0000昨天 09:46
回复qjttxzn(⊙o⊙)哦,那我很期待,这个是我课题~难憋啊~
9楼han_yankun20093天前 23:13
精辟
8楼liutengteng1303天前 23:11
学习了,很厉害啊。
7楼mazhaojuan3天前 22:14
好!
6楼sunjunlaing523天前 19:21
看不懂 顶一顶
5楼fzxy0027633天前 19:05
学习了下
4楼stonexing53天前 15:22
兄地 有没有用opencv实现HDR功能
3楼sglogin3天前 13:13
顶,虽然不懂,感觉很 强大
2楼lonelyrains4天前 18:03
感觉opencv的代码还是很全的,自己也整过,能识别一些脸型的眼睛。但是效果不是很好。对里面的原理不是很清楚,opencv的结构也不太明白。楼主很优秀,还请以后多写写这方面的。个人认为工程方面的东西不用太详细写。
1楼fengzi2009F4天前 16:59
收藏了,很强大

读书人网 >其他相关

热点推荐