1. 程式人生 > >基於Qt的OpenCV人臉識別(四)

基於Qt的OpenCV人臉識別(四)

上篇進行了人臉的檢測,現在進行人臉的識別,採用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