上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\pic\color\x文件夹下(x=1,2,3,...类别号),本文做训练和识别。为了识别,首先将人脸训练数据 转为灰度、对齐、归一化,再放入分类器(EigenFaceRecognizer),最后用训练出的model进行predict。
-----------------------------------------
环境:vs2010+opencv 2.4.6.0
特征:eigenface
Input:一个人脸数据库,15个人,每人20个样本(左右)。
Output:人脸检测,并识别出每张检测到的人脸。
-----------------------------------------
1. 为训练数据预处理( 转为灰度、对齐、归一化 )
在上一篇的 2.2 Prehelper.cpp文件中加入函数
void resizeandtogray(char* dir,int k, vector
vector
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
在Prehelper.cpp中加入函数
Ptr
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 "<
主函数改为:
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
关于Computer Vision更多的学习资料将继续更新,敬请关注本博客和新浪微博Rachel Zhang。