本文將介紹如何利用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);
}
運行結果: