上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\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<Mat> &images, vector<int> &labels,
vector<Mat> &testimages, vector<int> &testlabels);

  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中调用:

  1. int main( )
  2. {
  3. CvCapture* capture = 0;
  4. Mat frame, frameCopy, image;
  5. string inputName;
  6. int mode;
  7. char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";
  8. //preprocess_trainingdata(dir,K); //face_detection and extract to file
  9. vector<Mat> images,testimages;
  10. vector<int> labels,testlabels;
  11. resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray, normalize and resize
  12. system("pause");
  13. return 0;
  14. }

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);

  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

主函数改为:

  1. int main( )
  2. {
  3. CvCapture* capture = 0;
  4. Mat frame, frameCopy, image;
  5. string inputName;
  6. int mode;
  7. char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";
  8. //preprocess_trainingdata(dir,K); //face_detection and extract to file
  9. vector<Mat> images,testimages;
  10. vector<int> labels,testlabels;
  11. //togray, normalize and resize; load to images,labels,testimages,testlabels
  12. resizeandtogray(dir,K,images,labels,testimages,testlabels);
  13. //recognition
  14. Ptr<FaceRecognizer> model = Recognition(images,labels,testimages,testlabels);
  15. char* dirmodel = new char [256];
  16. strcpy(dirmodel,dir); strcat(dirmodel,"model.out");
  17. FILE* f = fopen(dirmodel,"w");
  18. fwrite(model,sizeof(model),1,f);
  19. system("pause");
  20. return 0;
  21. }

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

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

from: http://blog.csdn.net/abcjennifer/article/details/20446077

opencv 人脸识别 (二)训练和识别的更多相关文章

  1. 基于opencv+python的二维码识别

    花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...

  2. python3 树莓派 + usb摄像头 做颜色识别 二维码识别

    今天又啥也没干 我完蛋了哦  就是没办法沉下心来,咋办....还是先来条NLP吧.. 七,凡事必有至少三个解决方法 对事情只有一个方法的人,必陷入困境,因为别无选择. 对事情有两个方法的人也陷入困境, ...

  3. opencv人脸检测分类器训练小结

    这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...

  4. Flutter扫码识别二维码内容

    前面一篇写了生成二维码图片,这篇来写使用相机扫描识别二维码 识别二维码需要用到插件 barcode_scan 首先在 pubspec.yaml 文件中添加以下依赖,添加依赖后在 pubspec.yam ...

  5. adb devices 不识别设备(或者偶尔识别设备) -破解

    问题:当在CMD中输入adb devices时,没有设备信息显示,居然显示下面的信息 问题是有时候可以识别,有时候不可以识别.当被别人连接后,自己在连接是好的,过了一会以后又不好了

  6. OpenCV人脸识别-训练级联分类器

    OpenCV中以及附带了训练好的人脸特征分类器,3.2版本的有三种: 分别是LBP,Haar,Hug 在Data目录下. 也可以训练自己的特征库,具体参照如下: 级联分类器训练 — OpenCV 2. ...

  7. keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72885715 人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节 ...

  8. opencv 人脸识别 (一)训练样本的处理

    本文实现基于eigenface的人脸检测与识别.给定一个图像数据库,进行以下步骤: 进行人脸检测,将检测出的人脸存入数据库2 对数据库2进行人脸建模 在测试集上进行recognition   本篇实现 ...

  9. Java基于opencv实现图像数字识别(二)—基本流程

    Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...

随机推荐

  1. Javascript对象的创建模式 -- 深入了解Javascript

    /* 一.模式1:命名空间(namespace) 优点:减少全局命名所需的数量,避免命名冲突或过度 */ // 更简洁的方式 var MYAPP = MYAPP || {}; //定义通用方法 MYA ...

  2. UML 用例图,时序图,活动图的定义以及区别

    1.用例图,时序图,活动图的定义 1.用例图:  用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色" ...

  3. 03.RedisJava客户端Jedis的使用

    1.Jedis基本使用 使用Jedis客户端使用Redis服务与在服务器上通过redis-cli使用命令基本一样,关于Redis命令请参考:http://www.redis.cn/commands.h ...

  4. JS 学习笔记--7---正则表达式

    正则表达式中的内容很多,也很深,下面只是一些基本的知识点,练习中使用的浏览器是IE10,若有不当处请各位朋友指正,我会在第一时间修改错误之处. 匹配的概念:是包含的意思,不是相等的意思 1.正则表达式 ...

  5. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  6. Dynamic Programming - Part1

    public static void main(String[] args) { //give N, find the number of different ways to write N as t ...

  7. 利用WiFi钓鱼法追邻居漂亮妹纸

    假设,你的邻居是一个妹纸.漂亮单身,你,技术狗,家穷人丑,集体户口.像借酱油这种老套搭讪方式的成功率对你来说实在很低. 你要做的是了解她,然后接近她.通过搜集更多的情报,为创造机会提供帮助. 初级情报 ...

  8. 亚马逊 在线测试题目 amazon

    分析:其实就是求矩形中某一个点到其他点的距离加权最小 方法一: 对每一个点求其到其他点的加权距离,然后比较最小.由于有M*N个点,对每一个点求加权距离是O(M*N)的,所以整体时间复杂度是O(M*M* ...

  9. 两台机器间libevent通信:No route to host问题

    最近学习libevent库,遂在两台虚拟机间模拟通信,程序没逻辑错误,但客户端总是提示No route to host问题,想到可能是linux的防火墙问题导致的,于是关掉防火墙: Ubuntu系统防 ...

  10. 测试c语言函数调用性能因素之测试三

    函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作. 操作: 1,               调用函数帧指针 ...