opencv下haarclassifiercascade加上LBPHFaceRecognizer实现人脸识别

(源代码下载:http://download.csdn.net/detail/csdfhj2011/7356491)

上一篇文章中已经用haarclassifiercascade级联分类器将人脸检测出来,那如何从这些人脸中识别出来谁是谁呢?

opencv较新版本中(我使用的是2.4.8)提供了一个FaceRecognizer类,里面有相关的一些人脸识别的算法及函数接口,其中包括三种人脸识别算法:

1.eigenface

2.fisherface

3.LBPHFaceRecognizer

本文实验室用的是第三种。LBP是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。

opencv下haarclassifiercascade加上LBPHFaceRecognizer实现人脸识别_第1张图片

LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型(eigenface和fisherface类似):

Ptr model = createLBPHFaceRecognizer();
创建完模型之后开始训练样本

 void FaceRecognizer::train(InputArrayOfArrays src, InputArray labels) = 0

这是FaceRecognizer类提供的训练函数,src要求格式是vector,labels要求格式是vector

对样本图片的处理我写在一个函数内:

void initRecognizer(const int num_trainingImages,const string image_Path)
{
	vector images;
	vector labels;
	for(int i=0;i < num_trainingImages;i++)
	{
		strstream ss;
		string s;
		ss << i;
		ss >> s;
		string filename;
		filename = image_Path;
		filename+= s;
		filename= filename+".jpg";
		images.push_back(imread(filename,CV_LOAD_IMAGE_GRAYSCALE));
		labels.push_back(i);
	}
	model->train(images,labels);
}
const int num_trainingImages,const string image_Path
两个参数分别是要训练的样本的数量和图片文件夹的路径。

opencv中还提供了一个update函数用来对模型进行升级,避免全部重新训练。

void FaceRecognizer::update(InputArrayOfArrays src, InputArray labels)


训练完之后就是对测试图片的predict了。

int FaceRecognizer::predict(InputArray src) const = 0

返回预测到的样本对应的label。我们可以根据对应的label输出样本图片人的名字:

string predictedString(const Mat faceMat)
{
	string str1 = "wanghuafeng";
	string str2 = "huangjiang";
	string str3 = "women";
	int predicted = model->predict(faceMat);
	if(predicted<=3) return str1;
	else if(predicted<=6) return str2;
	else if(predicted<=8) return str3;
}
返回预测到的样本对应人的名字。


参考资料:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_api.html

(源代码下载:http://download.csdn.net/detail/csdfhj2011/7356491)

你可能感兴趣的:(opencv)