opencv 人脸识别 训练和识别

Posted 机器视觉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 人脸识别 训练和识别相关的知识,希望对你有一定的参考价值。


来自:http://blog.csdn.net/abcjennifer/article/details/20446077


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


-----------------------------------------


环境:vs2010+ 2.4.6.0

特征:eigenface

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

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


-----------------------------------------


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


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

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


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

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



[cpp] view plain

  1. void resizeandtogray(char* dir,int K, vector<Mat> &images, vector<int> &labels,  

  2.     vector<Mat> &testimages, vector<int> &testlabels)  

  3. {  

  4.     IplImage* standard = cvLoadImage("D:\\privacy\\picture\\photo\\2.jpg",CV_LOAD_IMAGE_GRAYSCALE);  

  5.     string cur_dir;  

  6.     char id[5];  

  7.     int i,j;  

  8.     for(int i=1; i<=K; i++)  

  9.     {  

  10.         cur_dir = dir;  

  11.         cur_dir.append("gray\\");     

  12.         _itoa(i,id,10);  

  13.         cur_dir.append(id);  

  14.         const char* dd = cur_dir.c_str();  

  15.         CStatDir statdir;  

  16.         if (!statdir.SetInitDir(dd))  

  17.         {  

  18.             puts("Dir not exist");  

  19.             return;  

  20.         }  

  21.         cout<<"Processing samples in Class "<<i<<endl;  

  22.         vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*");  

  23.         for (j=0;j<file_vec.size();j++)  

  24.         {  

  25.             IplImage* cur_img = cvLoadImage(file_vec[j],CV_LOAD_IMAGE_GRAYSCALE);  

  26.             cvResize(cur_img,standard,CV_INTER_AREA);  

  27.             Mat cur_mat = cvarrToMat(standard,true),des_mat;  

  28.             cv::normalize(cur_mat,des_mat,0, 255, NORM_MINMAX, CV_8UC1);  

  29.             cvSaveImage(file_vec[j],cvCloneImage(&(IplImage) des_mat));  

  30.             if(j!=file_vec.size())  

  31.             {  

  32.                     images.push_back(des_mat);  

  33.                     labels.push_back(i);  

  34.             }  

  35.             else  

  36.             {  

  37.                 testimages.push_back(des_mat);  

  38.                 testlabels.push_back(i);  

  39.             }  

  40.         }  

  41.         cout<<file_vec.size()<<" images."<<endl;  

  42.     }  

  43. }  





并在main中调用:

[cpp] view plain

  1. int main( )  

  2. {  

  3.     CvCapture* capture = 0;  

  4.     Mat frame, frameCopy, image;  

  5.     string inputName;     

  6.     int mode;  

  7.   

  8.     char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";   

  9.     //preprocess_trainingdata(dir,K); //face_detection and extract to file  

  10.     vector<Mat> images,testimages;  

  11.     vector<int> labels,testlabels;  

  12.     resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray, normalize and resize  

  13.       

  14.     system("pause");  

  15.     return 0;  

  16. }  






2. 训练

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

在Prehelper.cpp中加入函数

Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,vector<Mat> testimages, vector<int> testlabels);



[cpp] view plain copy

  1. Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,  

  2.     vector<Mat> testimages, vector<int> testlabels)  

  3. {  

  4.     Ptr<FaceRecognizer> model = createEigenFaceRecognizer(10);//10 Principal components  

  5.     cout<<"train"<<endl;  

  6.     model->train(images,labels);  

  7.     int i,acc=0,predict_l;  

  8.     for (i=0;i<testimages.size();i++)  

  9.     {  

  10.         predict_l = model->predict(testimages[i]);  

  11.         if(predict_l != testlabels[i])  

  12.         {  

  13.             cout<<"An error in recognition: sample "<<i+1<<", predict "<<  

  14.                 predict_l<<", groundtruth "<<testlabels[i]<<endl;  

  15.             imshow("error 1",testimages[i]);  

  16.             waitKey();  

  17.         }  

  18.         else  

  19.             acc++;  

  20.     }  

  21.     cout<<"Recognition Rate: "<<acc*1.0/testimages.size()<<endl;  

  22.     return model;  

  23. }  





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



主函数改为:

[cpp] view plain

  1. int main( )  

  2. {  

  3.     CvCapture* capture = 0;  

  4.     Mat frame, frameCopy, image;  

  5.     string inputName;     

  6.     int mode;  

  7.   

  8.     char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";   

  9.     //preprocess_trainingdata(dir,K); //face_detection and extract to file  

  10.     vector<Mat> images,testimages;  

  11.     vector<int> labels,testlabels;  

  12.     //togray, normalize and resize; load to images,labels,testimages,testlabels  

  13.     resizeandtogray(dir,K,images,labels,testimages,testlabels);   

  14.     //recognition  

  15.     Ptr<FaceRecognizer> model = Recognition(images,labels,testimages,testlabels);  

  16.     char* dirmodel = new char [256];  

  17.     strcpy(dirmodel,dir); strcat(dirmodel,"model.out");  

  18.     FILE* f = fopen(dirmodel,"w");  

  19.     fwrite(model,sizeof(model),1,f);  

  20.     system("pause");  

  21.     return 0;  

  22. }  





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





文章所用代码打包链接:



免责声明:本文系网络转载,版权归原作者所有。如涉及版权,请联系删除!


> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

如何分享到朋友圈 点击右上角“...” 三个点,在弹出菜单选择“分享到朋友圈
机器视觉--订阅号 机器视觉‘公众号 机器视觉,工业自动化,机器人,图像处理技术等领域新媒体信息平台。
热门文章推荐

回复下面数字,获取相关文章

001:计算机视觉领域研究资源及期刊、会议介绍

002:德国kuka机器人与世界冠军乒乓对决

003:人脸检测的C/C++源代码

004:人工智能眼中的世界,竟然如此诡(魔)异(性)?!

005:机器人视觉中的物体表达问题-摄像机标定-视觉计算理论

006:三维计算机视觉技术

007:无奈与迷茫-30岁以上电子工程师请进

008:逆天科技小制作 自制迷你“磁悬浮列车”玩具方法图解,快动手给孩子做一个

009:Google 以图搜图 - 相似图片搜索原理 - Java实现

010:关于机器学习中的一些数学方法

011:双远心工业镜头的原理简述

012哥们花20万从德国带回来一工具箱,亮瞎了!!全铝头盔一次成型!!

013:工业相机在汽车零部件检测中的应用

以上是关于opencv 人脸识别 训练和识别的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中LBPH人脸识别器识别人脸实战(附Python源码)

怎样使用OpenCV进行人脸识别

如何开发Java动态人脸识别

利用opencv 做一个简单的人脸识别

opencv SVM多分类 人脸识别

opencv_人脸检测模型训练人脸识别