Face Detect base OpenCV

1. Face Detect

待提取

2. Code

#include "FaceDetect.h"
using namespace std;
int main(void)
{
	// variables
	IplImage * pInpImg = 0;
	CvHaarClassifierCascade * pCascade = 0;  // the face detector
	CvMemStorage * pStorage = 0;        // memory for detector to use
	CvSeq * pFaceRectSeq;               // memory-access interface

	char ImageFilename[]="AKB48.jpg";

	// initializations
	pInpImg = cvLoadImage(ImageFilename, CV_LOAD_IMAGE_COLOR);
	pStorage = cvCreateMemStorage(0);
	pCascade = (CvHaarClassifierCascade *)cvLoad(("data/haarcascades/haarcascade_frontalface_default.xml"),0, 0, 0);

	// validate that everything initialized properly
	if (!pInpImg || !pStorage || !pCascade)
	{
		printf("Initialization failed: %s\n",
			(!pInpImg) ? "can't load image file" :
			(!pCascade) ? "can't load haar-cascade -- "
			"make sure path is correct" :
			"unable to allocate memory for data storage", ImageFilename);
		exit(-1);
	}

	pFaceRectSeq = cvHaarDetectObjects
		(pInpImg, pCascade, pStorage,
		1.1,                       // increase search scale by 10% each pass
		3,                         // merge groups of three detections
		CV_HAAR_DO_CANNY_PRUNING,  // skip regions unlikely to contain a face
		cvSize(200, 200), cvSize(300, 300));  // smallest size face to detect = 40x40,largest size face 使用默認;忽略;


	// display detected faces
	displayDetections(pInpImg, pFaceRectSeq);

	// clean up and release resources
	cvReleaseImage(&pInpImg);
	if (pCascade) cvReleaseHaarClassifierCascade(&pCascade);
	if (pStorage) cvReleaseMemStorage(&pStorage);

	return 0;
}


void displayDetections(IplImage * pInpImg, CvSeq * pFaceRectSeq)
{
	const char * DISPLAY_WINDOW = "Haar Window";
	int i;

	// create a window to display detected faces
	cvNamedWindow(DISPLAY_WINDOW, CV_WINDOW_AUTOSIZE);

	// draw a rectangular outline around each detection
	for (i = 0; i<(pFaceRectSeq ? pFaceRectSeq->total : 0); i++)
	{
		CvRect* r = (CvRect*)cvGetSeqElem(pFaceRectSeq, i);
		CvPoint pt1 = { r->x, r->y };
		CvPoint pt2 = { r->x + r->width, r->y + r->height };
		cvRectangle(pInpImg, pt1, pt2, CV_RGB(0, 255, 0), 3, 4, 0);
	}

	// display face detections
	cvShowImage(DISPLAY_WINDOW, pInpImg);
	cvWaitKey(0);
	cvDestroyWindow(DISPLAY_WINDOW);
}

效果如下:



3. Parameters and Tuning

CVAPI(CvSeq*)cvHaarDetectObjects( const CvArr* image,

                     CvHaarClassifierCascade*cascade, CvMemStorage* storage,

                     double scale_factor CV_DEFAULT(1.1),

                     int min_neighbors CV_DEFAULT(3),int flags CV_DEFAULT(0),

                     CvSize min_size CV_DEFAULT(cvSize(0,0)),CvSize max_size CV_DEFAULT(cvSize(0,0)));

 

MinimumDetection Scale

一般使用默認值,在data/haarcascades/*.xml中有定義,如haarcascade_frontalface_default.xml

<size> 24 24 </size>. 

可以根據需要將該參數設置的比默認值稍大些,可以使用包含人臉的輸入圖像的寬或高作對比進行修改;如1/4圖像的寬。但是在修改時,需要保證此寬高比與默認保持一致,此處的寬高比爲1:1。

 ScaleIncrease Rate

規定以多快的速度增加尺度從而在圖像中檢測人臉,該因子越高,檢測的速度越快,但若過高,則會漏掉人臉。一般使用默認值1.1(10%);

Canny Pruning Flag

若設置爲CV_HAAR_DO_CANNY_PRUNING,檢測時,將略過不太可能包含人臉的區域,減少運算量;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章