opencv 人脸识别 (二)训练和识别

opencv 人脸识别 (二)训练和识别上一篇中我们对训练数据做了一些预处理 检测出人脸并保存在 pic color x 文件夹下 x 1 2 3 类别号 本文做训练和识别 为了识别 首先将人脸训练数据 转为灰度 对齐 归一化 再放入分类器 EigenFaceRec 最后用训练出的 model 进行 predict 环境 vs2010 opencv 2 4 6 0 特征 eigenface

上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\pic\color\x文件夹下(x=1,2,3,…类别号),本文做训练和识别。为了识别,首先将人脸训练数据 转为灰度、对齐、归一化,再放入分类器(EigenFaceRecognizer),最后用训练出的model进行predict。

—————————————–

环境:vs2010+opencv 2.4.6.0

特征:eigenface

Input:一个人脸数据库,15个人,每人20个样本(左右)。

Output:人脸检测,并识别出每张检测到的人脸。

—————————————–

1. 为训练数据预处理( 转为灰度、对齐、归一化 )

转为灰度和对齐是后面做训练时EigenFaceRecognizer的要求;

归一化是防止光照带来的影响

在上一篇的 2.2 Prehelper.cpp文件中加入函数

void resizeandtogray(char* dir,int k, vector &images, vector &labels,
vector &testimages, vector &testlabels);

void resizeandtogray(char* dir,int K, vector &images, vector &labels,	vector &testimages, vector &testlabels){	IplImage* standard = cvLoadImage("D:\\privacy\\picture\\photo\\2.jpg",CV_LOAD_IMAGE_GRAYSCALE);	string cur_dir;	char id[5];	int i,j;	for(int i=1; i<=K; i++)	{		cur_dir = dir;		cur_dir.append("gray\\");			_itoa(i,id,10);		cur_dir.append(id);		const char* dd = cur_dir.c_str();		CStatDir statdir;		if (!statdir.SetInitDir(dd))		{			puts("Dir not exist");			return;		}		cout<<"Processing samples in Class "<file_vec = statdir.BeginBrowseFilenames("*.*");		for (j=0;j

并在main中调用:

int main( )
{
CvCapture* capture = 0;
Mat frame, frameCopy, image;
string inputName;
int mode;

char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";
//preprocess_trainingdata(dir,K); //face_detection and extract to file
vector images,testimages;
vector labels,testlabels;
resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray, normalize and resize

system("pause");
return 0;
}

2. 训练

有了vector images,testimages; vector labels,testlabels; 可以开始训练了,我们采用EigenFaceRecognizer建模。

在Prehelper.cpp中加入函数

Ptr Recognition(vector images, vector labels,vector testimages, vector testlabels);

Ptr Recognition(vector images, vector labels,	vector testimages, vector testlabels){	Ptr model = createEigenFaceRecognizer(10);//10 Principal components	cout<<"train"<train(images,labels);	int i,acc=0,predict_l;	for (i=0;ipredict(testimages[i]);		if(predict_l != testlabels[i])		{			cout<<"An error in recognition: sample "<


Recognization()输出分错的样本和正确率,最后返回建模结果Ptr model

主函数改为:

int main( )
{
CvCapture* capture = 0;
Mat frame, frameCopy, image;
string inputName;
int mode;

char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";
//preprocess_trainingdata(dir,K); //face_detection and extract to file
vector images,testimages;
vector labels,testlabels;
//togray, normalize and resize; load to images,labels,testimages,testlabels
resizeandtogray(dir,K,images,labels,testimages,testlabels);
//recognition
Ptr model = Recognition(images,labels,testimages,testlabels);
char* dirmodel = new char [256];
strcpy(dirmodel,dir); strcat(dirmodel,"model.out");
FILE* f = fopen(dirmodel,"w");
fwrite(model,sizeof(model),1,f);
system("pause");
return 0;
}

最终结果:一个错分样本,正确率93.3%

文章所用代码打包链接:http://download.csdn.net/detail/abcjennifer/7047853

编程小号
上一篇 2025-02-25 09:21
下一篇 2025-03-23 14:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/146650.html