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

本文將介紹如何利用OpenCV的LBP檢測器實現人臉識別的

基本步驟:

1.用opencv實現人臉檢測

2.加載LBP人臉檢測器

一般來說分類訓練器的xml文件路徑如下:....\opencv\sources\data\lbpcascades

每個人的安裝位置不同,訓練器的xml也不同,我的是opencv3.0的,需要將該xml文件複製到當前工程目錄下 。

3.載入圖片,或者訪問相機

4.利用前面加載的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);
}

運行結果:


發佈了54 篇原創文章 · 獲贊 28 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章