bool Tracker::initFace(TrackerParams* params, Matrixu &frame) { const char* cascade_name = "haarcascade_frontalface_alt_tree.xml"; const int minsz = 20; if( Tracker::facecascade == NULL ) Tracker::facecascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); frame.createIpl(); IplImage *img = frame.getIpl(); IplImage* gray = cvCreateImage( cvSize(img->width, img->height), IPL_DEPTH_8U, 1 ); cvCvtColor(img, gray, CV_BGR2GRAY ); frame.freeIpl(); cvEqualizeHist(gray, gray); CvMemStorage* storage = cvCreateMemStorage(0); cvClearMemStorage(storage); CvSeq* faces = cvHaarDetectObjects(gray, Tracker::facecascade, storage, 1.05, 3, CV_HAAR_DO_CANNY_PRUNING ,cvSize(minsz, minsz)); int index = faces->total-1; CvRect* r = (CvRect*)cvGetSeqElem( faces, index ); while(r && (r->width<minsz || r->height<minsz || (r->y+r->height+10)>frame.rows() || (r->x+r->width)>frame.cols() || r->y<0 || r->x<0)){ r = (CvRect*)cvGetSeqElem( faces, --index); } //if( r == NULL ){ // cout << "ERROR: no face" << endl; // return false; //} //else // cout << "Face Found: " << r->x << " " << r->y << " " << r->width << " " << r->height << endl; if( r==NULL ) return false; //fprintf(stderr,"x=%f y=%f xmax=%f ymax=%f imgw=%f imgh=%f\n",(float)r->x,(float)r->y,(float)r->x+r->width,(float)r->y+r->height,(float)frame.cols(),(float)frame.rows()); params->_initstate.resize(4); params->_initstate[0] = (float)r->x;// - r->width; params->_initstate[1] = (float)r->y;// - r->height; params->_initstate[2] = (float)r->width; params->_initstate[3] = (float)r->height+10; return true; }
/**************************************************************** Tracker::InitializeWithFace Initialize the tracker with opencv's face detector. Exceptions: None ****************************************************************/ bool Tracker::InitializeWithFace( TrackerParameters* params, Matrixu& frame ) { const int minsz = 20; //Get the name of the haar-cascade .xml file const char* cascade_name = HAAR_CASCADE_FILE_NAME; ASSERT_TRUE( cascade_name != NULL ); //Load the cascade if ( Tracker::s_faceCascade == NULL ) { Tracker::s_faceCascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); } frame.createIpl(); IplImage* img = frame.getIpl(); ASSERT_TRUE( img != NULL ); //convert to grayscale IplImage* gray = cvCreateImage( cvSize(img->width, img->height), IPL_DEPTH_8U, 1 ); ASSERT_TRUE( gray != NULL ); cvCvtColor(img, gray, CV_BGR2GRAY ); frame.freeIpl(); //histogram equalization cvEqualizeHist( gray, gray ); //memory storage CvMemStorage* storage = cvCreateMemStorage(0); cvClearMemStorage(storage); //call opencv's haar feature based detector CvSeq* faces = cvHaarDetectObjects( gray, Tracker::s_faceCascade, storage, 1.05, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize( minsz, minsz ) ); int index = faces->total-1; CvRect* r = (CvRect*)cvGetSeqElem( faces, index ); if ( r == NULL ) { return false; } while ( r && (r->width<minsz || r->height < minsz || (r->y+r->height+10)>frame.rows() || (r->x+r->width)>frame.cols() || r->y<0 || r->x<0) ) { r = (CvRect*)cvGetSeqElem( faces, --index ); } //set the params params->m_initState.resize(4); params->m_initState[0] = (float)r->x; params->m_initState[1] = (float)r->y; params->m_initState[2] = (float)r->width; params->m_initState[3] = (float)r->height+10; return true; }