Berk
Berk

Reputation: 45

Real-time face detection in OpenCV

I am trying to write some simple real time face detection code, but somehow it doesn't work. (I tried face detection code on an image and it works but with the code below i get a grey image onscreen and the code fails)

here is the code i have tried (it prints 'face detected!' one time to the output window)

CvHaarClassifierCascade *cascade;
CvMemStorage            *storage;
char *face_cascade="haarcascade_frontalface_alt2.xml";
CvRect* r;
const CvArr* img_size;
IplImage *grayscale;

void detectFacialFeatures( IplImage *img)
{ 
    grayscale = cvCreateImage(cvGetSize(img), 8, 1);
    cvCvtColor(img, grayscale, CV_BGR2GRAY);

    CvMemStorage* storage=cvCreateMemStorage(0);
    cvClearMemStorage( storage );

    cvEqualizeHist(grayscale, grayscale);

    cascade = ( CvHaarClassifierCascade* )cvLoad( face_cascade, 0, 0, 0 );
    CvSeq* faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize( 50, 50 ) );

    if(faces)
    {
        printf("face detected!");
        r = ( CvRect* )cvGetSeqElem( faces, 0 );
        cvRectangle( img,cvPoint( r->x, r->y ),cvPoint( r->x + r->width, r->y + r->height ), CV_RGB( 255, 0, 0 ), 1, 8, 0 ); 
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int c;
    IplImage* color_img;
    CvCapture* cv_cap = cvCreateCameraCapture(0);
    cvSetCaptureProperty(cv_cap, CV_CAP_PROP_FRAME_WIDTH, 640);
    cvSetCaptureProperty(cv_cap, CV_CAP_PROP_FRAME_HEIGHT, 480);
    cvNamedWindow("Video",1); // create window
    for(;;) {
        color_img = cvQueryFrame(cv_cap); // get frame

        if(color_img==0)
        break;

        cvFlip(color_img, 0, 1); //mirror image

        detectFacialFeatures(color_img);
        cvShowImage("Video", color_img); // show frame

        c = cvWaitKey(10); // wait 10 ms or for key stroke
        if(c == 27)
        break; // if ESC, break and quit
    }
    /* clean up */
    cvReleaseCapture( &cv_cap );
    cvDestroyWindow("Video");
}

Upvotes: 0

Views: 1817

Answers (1)

cyriel
cyriel

Reputation: 3532

  1. Try without calling functions cvFlip and cvEqualizeHistogram.
  2. Look at(just use cvShowImage) result of each operation(cvFlip, cvCvtColor, cvEqualizeHistogram) - it's possible that result of one of these operations is gray image.
  3. You don't have to load haar classifier each time you try to find a face - load it at the beginning. Operations on files are slow so it should makes you code faster.

Upvotes: 2

Related Questions