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,检测时,将略过不太可能包含人脸的区域,减少运算量;