【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,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);
}

运行结果:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇