基于Qt的OpenCV人脸识别(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huhuandk/article/details/84673518

上篇进行了人脸的检测,现在进行人脸的识别,采用OpenCV的face320模块里的EigenFace算法。在进行检测之间,得制作被检测人的人脸数据,这是捕获按钮就起到了作用,进行人脸数据的拍摄,

//拍摄人脸
void Widget::on_btn_cap_clicked()
{
    Mat dst;
    for (int i = 0; i < faces.size(); i++)
    {
       cv::resize(frame(faces[i]), dst, Size(92, 112));
       cvtColor(dst,dst,COLOR_BGR2RGB);
       imwrite(format("../myFace/%d.jpg", count), dst);
       count++;
    }
}
如代码所示,拍摄的人脸数据大小都为112*92,拍摄10到20张图片,进行数据筛选,选则好的数据集进行训练,然后进行实时监测,同样在打开摄像头槽函数中添加代码:
//延时函数
void Widget::Sleep(int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

//打开摄像头
void Widget::on_btn_open_clicked()
{
    //打开摄像头
    if (capture.isOpened())
           return;
    capture.open(0);
    if(capture.isOpened())
    {
        //int rate= capture.get(CV_CAP_PROP_FPS);  //获取帧率
        //qDebug() << "rate=" << rate;
        for(;;)
        {
            capture >> frame;
            flip(frame, frame, 1);  //画面翻转
            if (!frame.empty())
            {

                //人脸检测
                Mat frame_gray;
                Mat dst;
                Mat testSample;
                cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
                equalizeHist(frame_gray, frame_gray);
                faceDetector.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
                for (int i = 0; i < faces.size(); i++)
                {
                    Mat roi = frame(faces[i]);
                    cvtColor(roi, dst, COLOR_BGR2GRAY);
                    cv::resize(dst, testSample, Size(92, 112));
                    int label = model->predict(testSample);
                    rectangle(frame, faces[i], Scalar(0, 0, 255), 2, 8, 0);
                    putText(frame, format("i'm %s", (label == 36 ? "Howard" : "Unknow")),
                            faces[i].tl(), FONT_HERSHEY_PLAIN, 1.0, Scalar(0, 0, 255), 2, 8);
                    //qDebug() << "label:" << label;
                }
                //显示
                image = Mat2QImage(frame);
                ui->label->setPixmap(QPixmap::fromImage(image));
            }
            Sleep(2); //延时2ms
        }
    }
}

 注意点:

  1.  face属于OpenCV拓展模块,因此在头文件中要加入#include <opencv2/face.hpp>
  2. 训练的数据大小要一致,拍摄时表情可变化,但最好位置不要移动

最后的结果如下:

最后附上整个工程代码: https://download.csdn.net/download/huhuandk/10821182

猜你喜欢

转载自blog.csdn.net/huhuandk/article/details/84673518
今日推荐