Qt5.7+Opencv2.4.9人脸识别(五)人脸识别

来源:互联网 发布:路亚竿能钓什么鱼 知乎 编辑:程序博客网 时间:2024/06/06 00:22

【注意】本博文的档次适合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加密,做一个简单的人脸识别系统。

源码和理论部分在本博文开头有提供。


1 0
原创粉丝点击