【转载】opencv实现人脸检测

全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下

http://blog.csdn.net/lsq2902101015/article/details/47057081

本篇文章主要介绍了如何使用OpenCV实现人脸检测。本文不具体讲解人脸检测的原理,直接使用OpenCV实现。

OpenCV版本:2.4.10;VS开发版本:VS2012。

一、OpenCV人脸检测

要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。

1、OpenCV人脸检测的方法

在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。

在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容:

【转载】opencv实现人脸检测

上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,如下图所示

【转载】opencv实现人脸检测

图中的XML文件即是我们人脸检测所需要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。

2、OpenCV中的人脸检测的类

在OpenCV中,使用类“CascadeClassifier”进行人脸检测

CascadeClassifier faceCascade;   //实例化对象  

所需要使用的函数:

faceCascade.load("../data/haarcascade_frontalface_alt2");  //加载分类器
faceCascade.detectMultiScale(imgGray, faces, 1.2, , , Size(, )); //多尺寸检测人脸

实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:

  1. CV_WRAP virtual void detectMultiScale( const Mat& image,
  2. CV_OUT vector<Rect>& objects,
  3. double scaleFactor=1.1,
  4. int minNeighbors=3, int flags=0,
  5. Size minSize=Size(),
  6. Size maxSize=Size() );

各参数含义:

  • const Mat& image: 需要被检测的图像(灰度图)
  • vector<Rect>& objects: 保存被检测出的人脸位置坐标序列
  • double scaleFactor: 每次图片缩放的比例
  • int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
  • int flags: 决定是缩放分类器来检测,还是缩放图像
  • Size(): 表示人脸的最大最小尺寸

二、代码实现

1、检测图片中的人脸

//头文件
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> using namespace cv; //人脸检测的类
CascadeClassifier faceCascade; int main()
{
faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加载分类器,注意文件路径 Mat img = imread("../data/PrettyGirl.jpg");
Mat imgGray;
vector<Rect> faces; if(img.empty())
{
return ;
} if(img.channels() ==)
{
cvtColor(img, imgGray, CV_RGB2GRAY);
}
else
{
imgGray = img;
} faceCascade.detectMultiScale(imgGray, faces, 1.2, , , Size(, )); //检测人脸 if(faces.size()>)
{
for(int i =; i<faces.size(); i++)
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(, , ), , ); //框出人脸位置
}
} imshow("FacesOfPrettyGirl", img); waitKey();
return ;
}

结果如下图:

【转载】opencv实现人脸检测

2、检测视频中的人脸

//头文件
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> using namespace cv; //人脸检测的类
CascadeClassifier faceCascade; int main()
{
faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加载分类器,注意文件路径 VideoCapture cap;
cap.open(); //打开摄像头
//cap.open("../data/test.avi"); //打开视频
Mat img, imgGray;
vector<Rect> faces;
int c = ; if(!cap.isOpened())
{
return ;
} while(c!=)
{
cap>>img;
if(img.channels() ==)
{
cvtColor(img, imgGray, CV_RGB2GRAY);
}
else
{
imgGray = img;
} faceCascade.detectMultiScale(imgGray, faces, 1.2, , , Size(, )); //检测人脸 if(faces.size()>)
{
for(int i =; i<faces.size(); i++)
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(, , ), , ); //框出人脸位置
}
} imshow("Camera", img);
c = waitKey();
}
return ;
}

在视频实时检测时,可能会出现卡顿,是因为检测人脸花费了过多的时间,这里代码只实现基本功能,并未优化。

上一篇:PJAX的实现与应用


下一篇:浅谈人脸检测之Haar分类器方法