opencv 人脸检测 + 眼检测

版权声明:转载需标明该文链接。 https://blog.csdn.net/zaibeijixing/article/details/80515879

OpenCV(3.4)自带的harr级联分类器,实现人脸检测 + 人眼检测。

直接上代码:

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

using namespace std;
using namespace cv;

int main()
{
	/* -------------------------	【0】加载图像	----------------------------------------------- */
	Mat frame_src = imread("E:/mypic/student.jpg");
	Mat frame_gray;
	cvtColor(frame_src, frame_gray, COLOR_BGR2GRAY);
	equalizeHist(frame_gray, frame_gray);


	/* -------------------------	【1】加载模型	----------------------------------------------- */
	CascadeClassifier face_cascade;
	CascadeClassifier eye_cascade;

	String face_cascade_name = "D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
	String eye_cascade_name = "D:/opencv/sources/data/haarcascades/haarcascade_eye.xml";

	if (!face_cascade.load(face_cascade_name))
	{
		printf("can not load the haar_face_Cascader file \n");
		return -1;
	}
	if (!eye_cascade.load(eye_cascade_name))
	{
		printf("can not load the haar_eye_Cascader file \n");
		return -1;
	}
	
	
	/* -------------------------	【2】Detect faces	----------------------------------------------- */
	std::vector<Rect> faces;
	face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30), Size(300, 300));
	for (int i = 0; i < faces.size(); i++)
	{
		rectangle(frame_src, faces[i], Scalar(0, 255, 0), 2, 8, 0);

		Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
		ellipse(frame_src, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
	}


	/* -------------------------	【3】In each face, detect eyes	----------------------------------------------- */
	std::vector<Rect> eyes;	
	for (size_t i = 0; i < faces.size(); i++)
	{
		Mat faceROI = frame_gray(faces[i]);

		eye_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
		for (size_t j = 0; j < eyes.size(); j++)
		{
			Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
			int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
			circle(frame_src, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
		}
	}


	imshow("result", frame_src);
	waitKey();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/zaibeijixing/article/details/80515879