【OpenCV筆記 16-2】OpenCV人臉檢測和人眼檢測之LBP分類器
阿新 • • 發佈:2019-02-17
//LBP檢測器的運用 //本程式可以執行,用於人臉識別和人眼識別 #include<opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; void detectAndDisplay(Mat frame); int main(int argc, char** argv) { Mat srcImage; //============【1】載入並顯示人臉圖片========= srcImage = imread("image/face.jpg", 1); //當前工程image目錄下的jpg檔案,注意目錄符號 imshow("原圖", srcImage); //============【2】載入分類器========= //該檔案存在於OpenCV安裝目錄下的\sources\data\haarcascades內 //需要將該xml檔案複製到當前工程目錄下的自建xml資料夾裡 if (!face_cascade.load("xml\\lbpcascade_frontalface.xml"))//也可用Haar分類器 { printf("人臉檢測器載入失敗,請拷貝該檔案到工程目錄下!\n"); return -1; } if (!eyes_cascade.load("xml\\haarcascade_eye.xml")) { printf("人眼檢測器載入失敗,請拷貝該檔案到工程目錄下!\n"); return -1; }; //============【3】呼叫人臉檢測函式 ========= detectAndDisplay(srcImage); waitKey(0);//暫停顯示一下,ESC退出 } //= == == == == == =【4】自定義人臉檢測函式 == == == == void detectAndDisplay(Mat dispFace) { //定義變數 std::vector<Rect> faces; std::vector<Rect>eyes; Mat srcFace, grayFace, eqlHistFace; int eye_number = 0; //*****************0.0影象預處理****************** cvtColor(dispFace, grayFace, CV_BGR2GRAY); //rgb型別轉換為灰度型別 equalizeHist(grayFace, eqlHistFace); //直方圖均衡化 //*****************1.1.人臉檢測****************** face_cascade.detectMultiScale(eqlHistFace, faces, 1.1, 3, 0 | CV_HAAR_SCALE_IMAGE, Size(10, 10)); //增大第四個引數可以提高檢測精度,但也可能會造成遺漏 //人臉尺寸minSize和maxSize,關鍵引數,自行設定,隨圖片尺寸有很大關係, for (unsigned int i = 0; i < faces.size(); i++) { //*****************1.2用綠色橢圓標記檢測到的人臉***************** Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); ellipse(dispFace, center, Size(faces[i].width / 2, faces[i].height * 65 / 100), 0, 0, 360, Scalar(50, 255, 0), 2, 8, 0); //*****************2.1人眼檢測***************** Mat faceROI = eqlHistFace(faces[i]); eyes_cascade.detectMultiScale(faceROI, eyes, 1.2, 3, 0| CV_HAAR_SCALE_IMAGE, Size(15, 15), Size(80, 80)); eye_number += eyes.size();//人眼計數 //*****************2.2用綠色橢圓標記檢測到的人眼***************** for (unsigned int j = 0; j <eyes.size() ; j++) { Point center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); int radius = cvRound((eyes[j].width + eyes[i].height)*0.25); circle(dispFace, center, radius, Scalar(105, 50, 255), 2, 8, 0); } } //*****************3.0檢測結果輸出***************** cout << "檢測結果\n人臉: " << faces.size() << " 張" << endl; cout<<"人眼: "<<eye_number <<" 只"<< endl; imshow("人臉識別結果", dispFace); }
執行結果: