void Widget::showVideo(){ capeture >> resource; CascadeClassifier faceClassifier; //训练好的文件名称,放置在可执行文件同目录下 bool falg = faceClassifier.load("/home/zhu/opencv/opencv-3.4.5/data/haarcascades/haarcascade_frontalface_alt2.xml"); if(falg == false) { QMessageBox::warning(this,"Haar级联分类器错误","不能加载haarcascade_frontalface_alt2.xml文件!!",QMessageBox::Ok); return ; } //完全拷贝,把resource中的所有信息拷贝到frame中 Mat frame = resource.clone(); Mat gray; vector faces; //faces是一个容器,用来接收检测到的人脸 //RGB转BGR格式 cvtColor(frame,gray,CV_BGR2GRAY); //变换后的图像进行直方图均值化处理 equalizeHist(gray,gray); //通过人脸分类器识别有多少人脸 faceClassifier.detectMultiScale(gray,faces, 1.8, 3,0, cv::Size(50, 50)); Mat face; for(size_t i = 0;i < faces.size();i++) { if(faces[i].height > 0 && faces[i].width > 0) { face = gray(faces[i]); rectangle(frame,faces[i],cv::Scalar(0, 0, 255), 1, 8, 0);//函数是用来绘制一个矩形框的,通常用在图片的标记上 } } QImage res = Mat2Image(frame); ui->label_video->setPixmap(QPixmap::fromImage(res)); QFile facemodel(QDir::currentPath() + "/facemodel.xml"); bool ok = facemodel.open(QIODevice::ReadOnly | QIODevice::Text); if(!ok) return; if(faces.size() == 0) { ui->label_result->setText("识别结果:"); return; } Mat face_test; /*if((face.rows > 112) || (face.cols > 92)) { cv::resize(face, face_test, cv::Size(92,112)); }*/ cv::resize(face, face_test, cv::Size(92,112)); if(!face_test.empty()) { //测试图像应该是灰度图 /* 第一个参数是测试样品,每行作为一个测试数据,即要将每一个样品处理成导入的模型同样维度大小的一行数据, 可同时放入多行数据,这时候就要用到第二个参数。 当第二个参数为空时,函数会返回测试数据的标签值,假如放入一个Mat 暂名为result,则会保存在这个Mat中 */ QString XmlPath = QDir::currentPath() + "/facemodel.xml"; model = LBPHFaceRecognizer::create(); //model->read(XmlPath); //model->read(XmlPath.toStdString()); model = Algorithm::load(XmlPath.toStdString()); //model->predict(face_test,predictedLabel,confidence); int predictLabel = -1; double predictConfidence = 0.0; model->predict(face_test, predictLabel, predictConfidence); //int label = model->predict(face_test); QFile user(QDir::currentPath() + "/usr.txt"); if(!user.open(QIODevice::ReadWrite | QIODevice::Text)) { qDebug() << user.errorString() < <endl;< span> </endl;<> } qint64 usrlinenum =0; QString line; QTextStream in(&user); QStringList list; qDebug()<<"count="<< count <<"比对结果:"< count++; if(predictConfidence > 80) { qDebug()<<"查无此人"; ui->label_result->setText("识别结果:查无此人"); return; } while(!in.atEnd()) { line = in.readLine(); usrlinenum++; if(usrlinenum == predictLabel){ list = line.split(";"); ui->label_result->setText(QString("识别结果:")+list[1]); qDebug()<<"list[1]"< <list[1];< span> </list[1];<> user.close(); facemodel.close(); return; } } ui->label_result->setText("识别结果:查无此人"); user.close(); } else{ ui->label_result->setText("识别结果:查无此人"); } facemodel.close();}