1. 程式人生 > >【OpenCV筆記 16-2】OpenCV人臉檢測和人眼檢測之LBP分類器

【OpenCV筆記 16-2】OpenCV人臉檢測和人眼檢測之LBP分類器

//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);
}

執行結果: