QT5+OpenCV人脸识别

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


定义相关变量

vector<Mat> images; //训练样本
vector<int> labels; //标签,用来标记样本
QString name[10];   //用来存储姓名,因为标签是整型无法标识姓名
QString modelXml = "att_model.xml";//用来存储训练好的模型

Ptr<LBPHFaceRecognizer> model = createLBPHFaceRecognizer();
if(QFile::exists(modelXml)) //加载训练好的模型
{
    model->load(modelXml.toStdString());
}


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


人脸识别
Mat image = imread(imgName.toStdString(), CV_LOAD_IMAGE_GRAYSCALE);//用来识别的图片

model->setThreshold(ui->doubleSpinBox->value()); //设置识别阉值,同一个人训练的图片越多此值可以设置得越小,具体需要自己调试

int result = model->predict(image);//识别并返回匹配的标签

if(result < 0)
    ui->nameLabel->setText(tr("无法识别此人"));
else
    ui->nameLabel->setText(tr("%1").arg(name[result]));//根据返回的标签索引姓名


保存模型
model->save(modelXml.toStdString());



效果如图QT5+OpenCV人脸识别_第1张图片



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

你可能感兴趣的:(qt,opencv,qt5)