Skip to content

Instantly share code, notes, and snippets.

@royguo
Last active December 16, 2015 12:08
Show Gist options
  • Select an option

  • Save royguo/5432132 to your computer and use it in GitHub Desktop.

Select an option

Save royguo/5432132 to your computer and use it in GitHub Desktop.
human face detection
#include <stdio.h>
#include <opencv2/opencv.hpp> // for highgui, core etc.
using namespace cv;
// cascade : classifier using to detect haar objects.
// storage : memory to store detected objects.
void DetectAndDraw(CvHaarClassifierCascade* cascade,
CvMemStorage* storage,
IplImage* img,
double scale = 1.3) {
static CvScalar colors[] = {
{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},
{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}
}; // Just some pretty colors to draw angles.
printf("Detecting objects ... \n");
// Detect Objects
cvClearMemStorage(storage);
CvSeq* objects = cvHaarDetectObjects(
img,
cascade,
storage,
scale,
2,
0,
cvSize(30, 30)
);
printf("%d objects found !\n", objects ? objects->total:0);
// Loop found objects and draw angles around them.
for(int i=0; i<(objects ? objects->total:0); i++) {
printf("drawing...\n");
CvRect* r = (CvRect*)cvGetSeqElem(objects, i);
cvRectangle(
img,
cvPoint(r->x, r->y),
cvPoint(r->x + r->width, r->y + r->height),
colors[i%8]
);
}
cvNamedWindow("Example");
cvShowImage("Example", img);
cvWaitKey(0);
cvDestroyWindow("Example");
}
int main( int argc, char** argv )
{
CvMemStorage* storage = cvCreateMemStorage(0);
const char* cascade_name = "haarcascade_frontalface_alt2.xml";
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0);
if (!cascade) {
printf("Load cascade failed !\n");
exit(-1);
}
IplImage* img = cvLoadImage(argv[1]);
DetectAndDraw(cascade, storage, img);
// Release allocated memory.
cvReleaseMemStorage(&storage);
cvReleaseImage(&img);
cvReleaseHaarClassifierCascade(&cascade);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment