opencv+人脸识别(识别出来是某个人)

文章来自http://blog.csdn.net/csdn_sxl/article/details/50601168



需要用到OpenCV扩展包里的相关函数,请先编译OpenCV的contrib包。参考:Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题


定义相关变量

[cpp]  view plain  copy
  1. vector images; //训练样本  
  2. vector<int> labels; //标签,用来标记样本  
  3. QString name[10];   //用来存储姓名,因为标签是整型无法标识姓名  
  4. QString modelXml = "att_model.xml";//用来存储训练好的模型  
  5.   
  6. Ptr model = createLBPHFaceRecognizer();  
  7. if(QFile::exists(modelXml)) //加载训练好的模型  
  8. {  
  9.     model->load(modelXml.toStdString());  

  1. }  
训练模型
[cpp]  view plain  copy
  1. images.push_back(imread(imgName.toStdString(),CV_LOAD_IMAGE_GRAYSCALE));  
  2. labels.push_back(ui->labelBox->value());  
  3.       
  4. name[ui->labelBox->value()] = ui->nameEdit->text(); //根据训练标签来存储姓名  
  5.       
  6. model->update(images,labels); //更新训练模型,train()也是训练函数但会清空之前的模型  


人脸识别
[cpp]  view plain  copy
  1. Mat image = imread(imgName.toStdString(), CV_LOAD_IMAGE_GRAYSCALE);//用来识别的图片  
  2.   
  3. model->setThreshold(ui->doubleSpinBox->value()); //设置识别阉值,同一个人训练的图片越多此值可以设置得越小,具体需要自己调试  
  4.   
  5. int result = model->predict(image);//识别并返回匹配的标签  
  6.   
  7. if(result < 0)  
  8.     ui->nameLabel->setText(tr("无法识别此人"));  
  9. else  
  10.     ui->nameLabel->setText(tr("%1").arg(name[result]));//根据返回的标签索引姓名  
保存模型
[cpp]  view plain  copy
  1. model->save(modelXml.toStdString());  

opencv+人脸识别(识别出来是某个人)_第1张图片

PS:
  • 经测试同一个人用正面,正面偏左、偏右、偏上、偏下五个角度各一张图片训练后阉值设置为85-90识别率比较高
  • 测试用的训练图片可以用ORL人脸库

你可能感兴趣的:(opencv)