【注意】本博文的档次适合OpenCV初学者,和要做本科生毕业设计这类档次。
源码的下载地址和原理理论部分请走下面连接
http://blog.csdn.net/qq78442761/article/details/71157980
上一节是模型训练链接如下
http://blog.csdn.net/qq78442761/article/details/71159508
当人脸库中无此人数据时识别结果截图:
当增加此人数据后运行结果:
识别过程中,人突然跑开,或者人脸精度不大时:
这里我说明下此识别的思路:以标号>=2的人为训练库里面的人,当为标号>=2时识别+1,否则-1,一共识别20次,当值为12时,说明识别成功,然后读取标号对应的人。
代码如下:
void MainWindow::on_action_FaceRecognition_triggered() { int label=0; addpeople.file.getManLabel(); double confidence=0.0; cv::VideoCapture cap(0); //打开默认摄像头 if (!cap.isOpened()) { QMessageBox::warning(this,tr("错误"),tr("摄像头打开失败"),QMessageBox::Ok); return; } cv::Mat frame; cv::Mat gray; cv::CascadeClassifier cascade; bool stop = false; //训练好的文件名称,放置在可执行文件同目录下 cascade.load("haarcascade_frontalface_alt.xml"); cv::Ptr<cv::FaceRecognizer> modelPCA = cv::createEigenFaceRecognizer(); modelPCA->load("MyFacePCAModel.xml"); int sl=0; while (!stop) { cap >> frame; //建立用于存放人脸的向量容器 std::vector<cv::Rect> faces(0); cv::cvtColor(frame, gray, CV_BGR2GRAY); //改变图像大小,使用双线性差值 //resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR); //变换后的图像进行直方图均值化处理 cv::equalizeHist(gray, gray); cascade.detectMultiScale(gray, faces, 1.1, 2,cv::CASCADE_FIND_BIGGEST_OBJECT|cv::CASCADE_DO_ROUGH_SEARCH, cv::Size(30, 30)); cv::Mat face; cv::Point text_lb; for (size_t i = 0; i < faces.size(); i++) { if (faces[i].height > 0 && faces[i].width > 0) { face = gray(faces[i]); text_lb = cv::Point(faces[i].x, faces[i].y); cv::rectangle(frame, faces[i], cv::Scalar(255, 0, 0), 1, 8, 0); } } cv::Mat face_test; int predictPCA = 0; if (face.rows >= 120) { cv::resize(face, face_test, cv::Size(92, 112)); } //Mat face_test_gray; //cvtColor(face_test, face_test_gray, CV_BGR2GRAY); if (!face_test.empty()) { //测试图-灰度图 int predictedLabel=-1; predictPCA = modelPCA->predict(face_test); modelPCA->predict(face_test,predictedLabel,confidence); qDebug()<<"predictedLabel:"<<predictedLabel; qDebug()<<"confidence:"<<confidence; qDebug()<<"s1:"<<sl; } if(sl>20) { if(label<5) QMessageBox::information(this,tr("失败"),tr("人脸库无此人"),QMessageBox::Ok); else QMessageBox::information(this,tr("失败"),tr("人脸确认度低"),QMessageBox::Ok); return; } if(predictPCA!=-1&&predictPCA!=1&&confidence<3200) label++; if(predictPCA==1||predictPCA==0) label--; qDebug()<<"label:"<<label; cv::waitKey(50); if(label>12) { //qDebug()<<predictPCA; //std::string name = "Being recognized"; //cv::putText(frame, name, text_lb, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 255)); //qDebug()<<"姓名"<<addpeople.file.who[predictPCA]; QString name="你是-"; name.append(addpeople.file.who[predictPCA]); QMessageBox::information(this,tr("识别成功"),name,QMessageBox::Ok); return; } sl++; imshow("face", frame); if (cv::waitKey(50) >= 0) stop = true; } }
在此人脸识别就结束了,下一节是结合mysql,人脸识别,tcp socket,xml,3DES加密,做一个简单的人脸识别系统。
源码和理论部分在本博文开头有提供。