#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv) {
namedWindow("output", CV_WINDOW_AUTOSIZE);
VideoCapture capture(0);
//实例化分类器
CascadeClassifier face_classifier;
CascadeClassifier eye_classifier;
//加载opencv训练好的数据
face_classifier.load("E:/anzhuang/opencv3.4.1/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml");
eye_classifier.load("E:/anzhuang/opencv3.4.1/opencv/build/etc/haarcascades/haarcascade_eye.xml");
Mat frame, gray;
vector<Rect>faces;
vector<Rect>eyes;
Rect rect;
Rect eyesRoi;
Mat eyesImg;
while (capture.read(frame)) {
cvtColor(frame, gray, CV_BGR2GRAY);
//直方图均衡化
equalizeHist(gray, gray);
//人脸检测
face_classifier.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
for (int i = 0; i < faces.size(); i++) {
//画出人脸
rectangle(frame, faces[i], Scalar(0, 0, 255), 2);
//获得人眼ROI
eyesRoi.x = faces[i].x;
eyesRoi.y = faces[i].y;
eyesRoi.width = faces[i].width;
eyesRoi.height = faces[i].height / 2;
eyesImg = gray(eyesRoi);
//在ROI图像中进行人眼检测
eye_classifier.detectMultiScale(eyesImg, eyes, 1.2, 3, 0, Size(20, 20));
for (int j = 0; j < eyes.size(); j++) {
rect.x = faces[i].x + eyes[j].x;
rect.y = faces[i].y + eyes[j].y;
rect.width = eyes[j].width;
rect.height = eyes[j].height;
rectangle(frame, rect, Scalar(0, 255, 0), 2);
}
}
imshow("output", frame);
char c = waitKey(20);
if (c == 27) { break; }
}
waitKey(0);
return 0;
}
//基于模板匹配的人眼跟踪
/*
int main(int arc, char** argv) {
namedWindow("input", CV_WINDOW_AUTOSIZE);
namedWindow("output", CV_WINDOW_AUTOSIZE);
VideoCapture capture(0);
//实例化分类器
CascadeClassifier face_classifier;
CascadeClassifier eye_classifier;
//加载opencv训练好的数据
face_classifier.load("E:/anzhuang/opencv3.4.1/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml");
eye_classifier.load("E:/anzhuang/opencv3.4.1/opencv/build/etc/haarcascades/haarcascade_eye.xml");
Mat frame, gray;
vector<Rect>faces;
vector<Rect>eyes;
Rect rect1, rect2;
Rect lefteyes, righteyes;
Mat lefteyesImg, righteyesImg;
Mat temp1, temp2;
Mat result1, result2;
double min, max;
Point minLoc, maxLoc;
bool firstFrame = true;
int count = 0;
while (capture.read(frame)) {
cvtColor(frame, gray, CV_BGR2GRAY);
//直方图均衡化
equalizeHist(gray, gray);
face_classifier.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
for (int i = 0; i < faces.size(); i++) {
//画出人脸
rectangle(frame, faces[i], Scalar(0, 0, 255), 2);
//获得左眼ROI
lefteyes.x = faces[i].x;
lefteyes.y = faces[i].y;
lefteyes.width = faces[i].width/2;
lefteyes.height = faces[i].height / 2;
lefteyesImg = gray(lefteyes);
//获得右眼ROI
righteyes.x = faces[i].x + faces[i].width / 2;
righteyes.y = faces[i].y;
righteyes.width = faces[i].width / 2;
righteyes.height = faces[i].height / 2;
righteyesImg = gray(righteyes);
if (firstFrame) {
eye_classifier.detectMultiScale(lefteyesImg, eyes, 1.2, 3, 0, Size(20, 20));
if (eyes.size()) {
rect1.x = lefteyes.x + eyes[0].x;
rect1.y = lefteyes.y + eyes[0].y;
rect1.width = eyes[0].width;
rect1.height = eyes[0].height;
rectangle(frame, rect1, Scalar(0, 255, 0), 2);
temp1 = gray(rect1);
}
eye_classifier.detectMultiScale(righteyesImg, eyes, 1.2, 3, 0, Size(20, 20));
if (eyes.size()) {
rect2.x = righteyes.x + eyes[0].x;
rect2.y = righteyes.y + eyes[0].y;
rect2.width = eyes[0].width;
rect2.height = eyes[0].height;
rectangle(frame, rect2, Scalar(0, 255, 0), 2);
temp2 = gray(rect2);
}
count++;
}
imshow("input", frame);
if (count >= 5) {
firstFrame = false;
result1 = Mat::zeros(Size(lefteyes.width - temp1.cols + 1, lefteyes.height - temp1.rows + 1), CV_32FC1);
result2 = Mat::zeros(Size(righteyes.width - temp2.cols + 1, righteyes.height - temp2.rows + 1), CV_32FC1);
matchTemplate(lefteyesImg, temp1, result1, 3);
normalize(result1, result1, 0, 1, NORM_MINMAX);
minMaxLoc(result1, &min, &max, &minLoc, &maxLoc, Mat());
rectangle(frame, Rect(maxLoc.x + lefteyes.x, maxLoc.y + lefteyes.y, temp1.cols, temp1.rows), Scalar(0, 255, 0), 2);
matchTemplate(righteyesImg, temp2, result2, 3);
normalize(result2, result2, 0, 1, NORM_MINMAX);
minMaxLoc(result1, &min, &max, &minLoc, &maxLoc);
rectangle(frame, Rect(maxLoc.x + righteyes.x, maxLoc.y+ righteyes.y, temp1.cols, temp1.rows), Scalar(0, 255, 0), 2);
}
imshow("output", frame);
}
char c = waitKey(20);
if (c == 27) { break; }
}
waitKey(0);
return 0;
}
*/