#include
#include
#include
using namespace std;
using namespace cv;
CascadeClassifier face_cascade, eyes_cascade;
String window_name = "Face Detection";
void detectFaces(Mat frame) {
std::vector faces;
Mat frame_gray;
// 灰度变换
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
// 直方图均衡
equalizeHist(frame_gray, frame_gray);
// 多尺度人脸检测
face_cascade.detectMultiScale(frame_gray, faces,
1.1, 3,0|CASCADE_SCALE_IMAGE, Size(30, 30));
// 人脸检测结果判定
for(size_t i = 0; i < faces.size(); i++)
{
// 检测到人脸中心
Point center(faces[i].x + faces[i].width/2,
faces[i].y + faces[i].height/2);
Mat face = frame_gray(faces[i]);
std::vector eyes;
// 在人脸区域检测人眼
eyes_cascade.detectMultiScale(face, eyes, 1.1, 2,
0 |CASCADE_SCALE_IMAGE, Size(30, 30) );
if(eyes.size() > 0)
// 绘制人脸
ellipse(frame, center, Size(faces[i].width/2,
faces[i].height/2),
0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
}
imshow( window_name, frame );
}
int main()
{
// 摄像头读取
VideoCapture cap(0);
Mat frame;
// 初始化haar级联人脸分类器XML
face_cascade.load("haarcascade_frontalface_alt.xml");
// 初始化haar级联人眼分类器XML
eyes_cascade.load("haarcascade_eye_tree_eyeglasses.xml");
if (face_cascade.empty() || eye_cascade.empty()
|| !cap.isOpened())
return 1;
while(cap.read(frame))
{
// 人脸检测
detectFaces(frame);
if( waitKey(30) >= 0)
break;
}
return 0;
}
转载:http://blog.csdn.net/zhuwei1988