基於Qt的OpenCV人臉識別(四)
阿新 • • 發佈:2018-12-31
上篇進行了人臉的檢測,現在進行人臉的識別,採用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 } } }
注意點:
- face屬於OpenCV拓展模組,因此在標頭檔案中要加入#include <opencv2/face.hpp>
- 訓練的資料大小要一致,拍攝時表情可變化,但最好位置不要移動
最後的結果如下:
最後附上整個工程程式碼: https://download.csdn.net/download/huhuandk/10821182