c++ 的 open cv 人脸检测代码

c++ 的 open cv 人脸检测代码

 

// ConsoleApplication2.cpp: 主项目文件。

#include "stdafx.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <iostream>  
#include <stdio.h>  

using namespace std;
using namespace cv;

/** Function Headers */
void detectAndDisplay(Mat frame);

/** Global variables */
String face_cascade_name = "E:\\code\\opencv\\opencv3.4.4\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml";//
String eyes_cascade_name = "E:\\code\\opencv\\opencv3.4.4\\opencv\\sources\\data\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;   //定义人脸分类器  
CascadeClassifier eyes_cascade;   //定义人眼分类器  
String window_name = "Capture - Face detection";

CascadeClassifier cascade, nestedCascade;

/** @function main */
int main(void)
{
	//Mat frame = imread("D:\\Documents\\Visual Studio 2015\\Projects\\ConsoleApplication2\\ConsoleApplication2\\001.jpg");
	Mat frame = imread("001.jpg");
	//VideoCapture capture;  
	//Mat frame;  

	//-- 1. Load the cascades  
	if (!cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; };
	if (!nestedCascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; };

	//-- 2. Read the video stream  
	//capture.open(0);  
	//if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }  

	//while (capture.read(frame))  
	//{  
	//  if (frame.empty())  
	//  {  
	//      printf(" --(!) No captured frame -- Break!");  
	//      break;  
	//  }  

	//-- 3. Apply the classifier to the frame  
	detectAndDisplay(frame);

	int c = waitKey(0);
	if ((char)c == 27) { return 0; } // escape  
									 //}  
	return 0;
}

/** @function detectAndDisplay */
void detectAndDisplay(Mat frame)
{
	std::vector<Rect> faces;
	Mat frame_gray;

	cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
	equalizeHist(frame_gray, frame_gray);

	//-- Detect faces  
	//cascade.detectMultiScale(frame_gray, faces, 1.1, 3, CV_HAAR_DO_ROUGH_SEARCH, Size(70, 70), Size(100, 100));
	cascade.detectMultiScale(frame_gray, faces,
		1.1, 2, 0
		//|CV_HAAR_FIND_BIGGEST_OBJECT
		//|CV_HAAR_DO_ROUGH_SEARCH
		| CV_HAAR_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);  
		//ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);  
		rectangle(frame, faces[i], Scalar(255, 0, 0), 2, 8, 0);

		Mat faceROI = frame_gray(faces[i]);
		std::vector<Rect> eyes;

		//-- In each face, detect eyes  
		nestedCascade.detectMultiScale(faceROI, eyes, 1.1, 1, CV_HAAR_DO_ROUGH_SEARCH, Size(3, 3));

		for (size_t j = 0; j < eyes.size(); j++)
		{
			Rect rect(faces[i].x + eyes[j].x, faces[i].y + eyes[j].y, eyes[j].width, eyes[j].height);

			//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, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);  
			rectangle(frame, rect, Scalar(0, 255, 0), 2, 8, 0);
		}
	}
	//-- Show what you got  
	namedWindow(window_name, 2);
	imshow(window_name, frame);
}

 

上一篇:[转]基于Mathematica的机器人仿真环境(机械臂篇)


下一篇:Opencv的人脸检测