opencv 人脸识别 (二)训练和识别
上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\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);
- void resizeandtogray(char* dir,int K, vector<Mat> &images, vector<int> &labels,
- vector<Mat> &testimages, vector<int> &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 "<<i<<endl;
- vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*");
- for (j=0;j<file_vec.size();j++)
- {
- IplImage* cur_img = cvLoadImage(file_vec[j],CV_LOAD_IMAGE_GRAYSCALE);
- cvResize(cur_img,standard,CV_INTER_AREA);
- Mat cur_mat = cvarrToMat(standard,true),des_mat;
- cv::normalize(cur_mat,des_mat,0, 255, NORM_MINMAX, CV_8UC1);
- cvSaveImage(file_vec[j],cvCloneImage(&(IplImage) des_mat));
- if(j!=file_vec.size())
- {
- images.push_back(des_mat);
- labels.push_back(i);
- }
- else
- {
- testimages.push_back(des_mat);
- testlabels.push_back(i);
- }
- }
- cout<<file_vec.size()<<" images."<<endl;
- }
- }
并在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<Mat> images,testimages;
- vector<int> labels,testlabels;
- resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray, normalize and resize
- system("pause");
- return 0;
- }
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);
- Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,
- vector<Mat> testimages, vector<int> testlabels)
- {
- Ptr<FaceRecognizer> model = createEigenFaceRecognizer(10);//10 Principal components
- cout<<"train"<<endl;
- model->train(images,labels);
- int i,acc=0,predict_l;
- for (i=0;i<testimages.size();i++)
- {
- predict_l = model->predict(testimages[i]);
- if(predict_l != testlabels[i])
- {
- cout<<"An error in recognition: sample "<<i+1<<", predict "<<
- predict_l<<", groundtruth "<<testlabels[i]<<endl;
- imshow("error 1",testimages[i]);
- waitKey();
- }
- else
- acc++;
- }
- cout<<"Recognition Rate: "<<acc*1.0/testimages.size()<<endl;
- return model;
- }
Recognization()输出分错的样本和正确率,最后返回建模结果Ptr<FaceRecognizer> 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<Mat> images,testimages;
- vector<int> labels,testlabels;
- //togray, normalize and resize; load to images,labels,testimages,testlabels
- resizeandtogray(dir,K,images,labels,testimages,testlabels);
- //recognition
- Ptr<FaceRecognizer> 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
from: http://blog.csdn.net/abcjennifer/article/details/20446077
opencv 人脸识别 (二)训练和识别的更多相关文章
- 基于opencv+python的二维码识别
花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...
- python3 树莓派 + usb摄像头 做颜色识别 二维码识别
今天又啥也没干 我完蛋了哦 就是没办法沉下心来,咋办....还是先来条NLP吧.. 七,凡事必有至少三个解决方法 对事情只有一个方法的人,必陷入困境,因为别无选择. 对事情有两个方法的人也陷入困境, ...
- opencv人脸检测分类器训练小结
这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...
- Flutter扫码识别二维码内容
前面一篇写了生成二维码图片,这篇来写使用相机扫描识别二维码 识别二维码需要用到插件 barcode_scan 首先在 pubspec.yaml 文件中添加以下依赖,添加依赖后在 pubspec.yam ...
- adb devices 不识别设备(或者偶尔识别设备) -破解
问题:当在CMD中输入adb devices时,没有设备信息显示,居然显示下面的信息 问题是有时候可以识别,有时候不可以识别.当被别人连接后,自己在连接是好的,过了一会以后又不好了
- OpenCV人脸识别-训练级联分类器
OpenCV中以及附带了训练好的人脸特征分类器,3.2版本的有三种: 分别是LBP,Haar,Hug 在Data目录下. 也可以训练自己的特征库,具体参照如下: 级联分类器训练 — OpenCV 2. ...
- keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)
引自:http://blog.csdn.net/sinat_26917383/article/details/72885715 人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节 ...
- opencv 人脸识别 (一)训练样本的处理
本文实现基于eigenface的人脸检测与识别.给定一个图像数据库,进行以下步骤: 进行人脸检测,将检测出的人脸存入数据库2 对数据库2进行人脸建模 在测试集上进行recognition 本篇实现 ...
- Java基于opencv实现图像数字识别(二)—基本流程
Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...
随机推荐
- hadoop之JobTracker功能分析
JobTracker是整个MapReduce计算框架中的主服务,相当于集群的“管理者”,负责整个集群的作业控制和资源管理.本文对JobTracker的启动过程及心跳接收与应答两个主要功能进行分析. 1 ...
- Ubuntu 部署 Redmine
我是在虚拟机种安装的Ubuntu,原因是装双系统太麻烦,虚拟机有问题的话删除容易. 首选保证主机中能ping 通虚拟机.我是用的桥接. 1.ubuntu安装必备的软件: sudo apt-get in ...
- .NET设计模式(12):外观模式(Façade Pattern)(转)
概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依 ...
- AssetBundle依赖关系
原地址:http://www.cnblogs.com/realtimepixels/p/3652086.html Unity AssetBundle Dependencies In the last ...
- Ruby中的语句中断和返回
李哲 - APRIL 28, 2015 return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一 ...
- HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)
题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...
- POJ 2823
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 35941 Accepted: 10636 ...
- 【剑指offer】和为S的连续整数序列
找到所有和为S的连续整数序列,序列长度>=2 我的思路:数学法,限定首元素范围,计算序列长度. 书上解法:用small和big两个游标记录序列的开始和结束位置,调整游标. 我的解法: /* 直 ...
- Gdata XML解析配置和简单使用
导入libxml2,使用第三方AFNetworking网络请求,第三方XML解析GData GData需要的配置 Build Settings 里搜索,添加如下
- jvm性能调优---jstat的用法
Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令 ...