全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,因此直接复制全文了),转载地址以下ide
http://blog.csdn.net/lsq2902101015/article/details/47057081函数
本篇文章主要介绍了如何使用OpenCV实现人脸检测。本文不具体讲解人脸检测的原理,直接使用OpenCV实现。优化
OpenCV版本:2.4.10;VS开发版本:VS2012。ui
1、OpenCV人脸检测spa
要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操做。.net
一、OpenCV人脸检测的方法code
在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。视频
在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里能够看到下图所示的内容:xml
上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示经过“haar”、“hog”和“lbp”三种不一样的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,以下图所示对象
图中的XML文件便是咱们人脸检测所须要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。
二、OpenCV中的人脸检测的类
在OpenCV中,使用类“CascadeClassifier”进行人脸检测
CascadeClassifier faceCascade; //实例化对象
所须要使用的函数:
faceCascade.load("../data/haarcascade_frontalface_alt2"); //加载分类器 faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //多尺寸检测人脸
实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:
各参数含义:
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"); //加载分类器,注意文件路径 Mat img = imread("../data/PrettyGirl.jpg"); Mat imgGray; vector<Rect> faces; if(img.empty()) { return 1; } if(img.channels() ==3) { cvtColor(img, imgGray, CV_RGB2GRAY); } else { imgGray = img; } faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //检测人脸 if(faces.size()>0) { for(int i =0; 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(0, 255, 0), 1, 8); //框出人脸位置 } } imshow("FacesOfPrettyGirl", img); waitKey(0); return 0; }
结果以下图:
二、检测视频中的人脸
//头文件 #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(0); //打开摄像头 //cap.open("../data/test.avi"); //打开视频 Mat img, imgGray; vector<Rect> faces; int c = 0; if(!cap.isOpened()) { return 1; } while(c!=27) { cap>>img; if(img.channels() ==3) { cvtColor(img, imgGray, CV_RGB2GRAY); } else { imgGray = img; } faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //检测人脸 if(faces.size()>0) { for(int i =0; 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(0, 255, 0), 1, 8); //框出人脸位置 } } imshow("Camera", img); c = waitKey(1); } return 0; }
在视频实时检测时,可能会出现卡顿,是由于检测人脸花费了过多的时间,这里代码只实现基本功能,并未优化。