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

来源:互联网 发布:手机网络哪家好 编辑:程序博客网 时间:2024/06/05 21:08

(源代码下载: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值,用这个值来反映这个窗口内的纹理信息。

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

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

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

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

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

void initRecognizer(const int num_trainingImages,const string image_Path){vector<Mat> images;vector<int> 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(InputArraysrc) 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)

1 0
原创粉丝点击