本文将介绍如何利用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,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),360,Scalar(50,255,0),2,8,0); //*****************2.1人眼检测***************** Mat faceROI = eqlHistFace(faces[i]); eyes_cascade.detectMultiScale(faceROI,eyes,1.2,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,radius,Scalar(105,50,255),0); } } //*****************3.0检测结果输出***************** cout << "检测结果\n人脸: " << faces.size() << " 张" << endl; cout<<"人眼: "<<eye_number <<" 只"<< endl; imshow("人脸识别结果",dispFace); }
运行结果: