mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.3 KiB
86 lines
3.3 KiB
|
|
#include <OpenCV/OpenCV.h> |
|
#include <cassert> |
|
#include <iostream> |
|
|
|
|
|
const char * WINDOW_NAME = "Face Tracker"; |
|
const CFIndex CASCADE_NAME_LEN = 2048; |
|
char CASCADE_NAME[CASCADE_NAME_LEN] = "~/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml"; |
|
|
|
using namespace std; |
|
|
|
int main (int argc, char * const argv[]) |
|
{ |
|
const int scale = 2; |
|
|
|
// locate haar cascade from inside application bundle |
|
// (this is the mac way to package application resources) |
|
CFBundleRef mainBundle = CFBundleGetMainBundle (); |
|
assert (mainBundle); |
|
CFURLRef cascade_url = CFBundleCopyResourceURL (mainBundle, CFSTR("haarcascade_frontalface_alt2"), CFSTR("xml"), NULL); |
|
assert (cascade_url); |
|
Boolean got_it = CFURLGetFileSystemRepresentation (cascade_url, true, |
|
reinterpret_cast<UInt8 *>(CASCADE_NAME), CASCADE_NAME_LEN); |
|
if (! got_it) |
|
abort (); |
|
|
|
// create all necessary instances |
|
cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE); |
|
CvCapture * camera = cvCreateCameraCapture (CV_CAP_ANY); |
|
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad (CASCADE_NAME, 0, 0, 0); |
|
CvMemStorage* storage = cvCreateMemStorage(0); |
|
assert (storage); |
|
|
|
// you do own an iSight, don't you ?!? |
|
if (! camera) |
|
abort (); |
|
|
|
// did we load the cascade?!? |
|
if (! cascade) |
|
abort (); |
|
|
|
// get an initial frame and duplicate it for later work |
|
IplImage * current_frame = cvQueryFrame (camera); |
|
IplImage * draw_image = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 3); |
|
IplImage * gray_image = cvCreateImage(cvSize (current_frame->width, current_frame->height), IPL_DEPTH_8U, 1); |
|
IplImage * small_image = cvCreateImage(cvSize (current_frame->width / scale, current_frame->height / scale), IPL_DEPTH_8U, 1); |
|
assert (current_frame && gray_image && draw_image); |
|
|
|
// as long as there are images ... |
|
while (current_frame = cvQueryFrame (camera)) |
|
{ |
|
// convert to gray and downsize |
|
cvCvtColor (current_frame, gray_image, CV_BGR2GRAY); |
|
cvResize (gray_image, small_image, CV_INTER_LINEAR); |
|
|
|
// detect faces |
|
CvSeq* faces = cvHaarDetectObjects (small_image, cascade, storage, |
|
1.1, 2, CV_HAAR_DO_CANNY_PRUNING, |
|
cvSize (30, 30)); |
|
|
|
// draw faces |
|
cvFlip (current_frame, draw_image, 1); |
|
for (int i = 0; i < (faces ? faces->total : 0); i++) |
|
{ |
|
CvRect* r = (CvRect*) cvGetSeqElem (faces, i); |
|
CvPoint center; |
|
int radius; |
|
center.x = cvRound((small_image->width - r->width*0.5 - r->x) *scale); |
|
center.y = cvRound((r->y + r->height*0.5)*scale); |
|
radius = cvRound((r->width + r->height)*0.25*scale); |
|
cvCircle (draw_image, center, radius, CV_RGB(0,255,0), 3, 8, 0 ); |
|
} |
|
|
|
// just show the image |
|
cvShowImage (WINDOW_NAME, draw_image); |
|
|
|
// wait a tenth of a second for keypress and window drawing |
|
int key = cvWaitKey (100); |
|
if (key == 'q' || key == 'Q') |
|
break; |
|
} |
|
|
|
// be nice and return no error |
|
return 0; |
|
}
|
|
|