#include
#include
using namespace std;
using namespace cv;
String Face_fileName = "haarcascade_frontalface_alt.xml";//opencv自带训练好的人脸识别级联器
String Eye_fileName = "haarcascade_eye_tree_eyeglasses.xml";//opencv自带训练好的人眼识别级联器
CascadeClassifier face_cascade;//人脸检测级联分类器
CascadeClassifier eye_cascade;//人眼检测级联分类器
int main(int argc, char** argv)
{
//各自检查人脸和人眼检测级联器是否能正常使用,此处必须分开判断
if (!face_cascade.load(Face_fileName))
{
cout << "face_cascade error" << endl;
return -1;
};
if (!eye_cascade.load(Eye_fileName))
{
cout << "eye_cascade error" << endl;
return -2;
};
namedWindow("VideoCapture", WINDOW_AUTOSIZE);
//打开内置摄像头视频流
VideoCapture capture(0);
Mat frame;//用来接capture
Mat frame_gray;
vector faces;//人脸区域
vector eyes;//人眼区域
while (capture.read(frame))
{
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转换为灰度图
equalizeHist(frame_gray, frame_gray);//直方图均衡化
face_cascade.detectMultiScale(frame_gray, faces, 1.2, 3, 0, Size(30, 30));//利用detectMultiScale搜索图像
for (size_t i = 0; i < faces.size(); i++)
{
//检索到人脸则画圆形
Point center_face(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
//画椭圆
ellipse(frame, center_face, Size(faces[i].width*0.5, faces[i].height*0.5)/*长轴短轴*/, 0, 0, 360, Scalar(0, 255, 255), 4, 8, 0);
//在检测到人脸的基础上,检测人眼并画圆形
Mat Eye_frame = frame_gray(faces[i]);//灰度的人眼图像,被包含在人脸图像里
eye_cascade.detectMultiScale(Eye_frame, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t j = 0; j < eyes.size(); j++)
{
//faces[i].x是检测到的人脸框起始点(相对于窗口),而eyes包含在faces中,所以eyes[j].x是相对faces检测到的人眼起始点,所以faces[i].x + eyes[j].x + eyes[j].width*0.5是相对于整个窗口的人眼中心点
Point center_eye(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);
int radius = cvRound((eyes[j].width + eyes[j].height) / 4);//cvRound四舍五入取整/cvFloor向下取整/cvCeil向上取整
//画正圆
circle(frame, center_eye, radius, Scalar(0, 128, 255), 3, 8);
}
imshow("VideoCapture", frame);
char c = waitKey(30);
if (c == 27)
{
break;
}
}
}
waitKey(0);
return 0;
}
输出结果:
摄像头采集检测到人脸与人眼,并在人脸处绘制黄色圆,在人眼处绘制橙色圆。