// -------------------------------------------------------------------------- // ARDrone::detectFaces() // Description : Detect human faces in the front image // Return value : True if a face was detected, false elsewhere. // ------------------------------------------------------------------------- bool ARDrone::detectFaces(IplImage *image) { // Load the classifier CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoadHaarClassifierCascade("../../asset/haarcascade_frontalface_alt.xml", cvSize(24,24)); CvMemStorage* storage = cvCreateMemStorage(0); //Drop off the bottom image which could disturb the detection algorithm for (int i = 0; i < 72; i ++) { for (int j = 0; j < 87; j ++) { cv::Scalar scalar = cvGet2D(image, i, j); scalar[0] = 0; scalar[1] = 0; scalar[2] = 0; cvSet2D(image, i, j, scalar); } } //Resize the image IplImage* imageResized = cvCreateImage(cvSize((image->width)*1.5,(image->height)*1.5),image->depth,image->nChannels); cvResize(image, imageResized, CV_INTER_LINEAR); // Apply median filter to reduce noise cvSmooth(imageResized, imageResized, CV_MEDIAN,3); // Perform the face detection CvSeq *faces = cvHaarDetectObjects(imageResized, cascade, storage, 1.11, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(50,50), cvSize (300, 300)); return faces->total; }
int main( int argc, char** argv ) { const char* size_opt = "--size="; char comment[1024]; CvHaarClassifierCascade* cascade = 0; CvSize size; help(); if( argc != 4 || strncmp( argv[1], size_opt, strlen(size_opt) ) != 0 ) { help(); return -1; } sscanf( argv[1], "--size=%ux%u", &size.width, &size.height ); cascade = cvLoadHaarClassifierCascade( argv[2], size ); if( !cascade ) { fprintf( stderr, "Input cascade could not be found/opened\n" ); return -1; } sprintf( comment, "Automatically converted from %s, window size = %dx%d", argv[2], size.width, size.height ); cvSave( argv[3], cascade, 0, comment, cvAttrList(0,0) ); return 0; }
int InitFaceDetect( const char* classifier_cascade_path ) { hid_cascade = cvLoadHaarClassifierCascade( classifier_cascade_path && strlen(classifier_cascade_path) > 0 ? classifier_cascade_path : "<default_face_cascade>", cvSize( ORIG_WIN_SIZE, ORIG_WIN_SIZE )); return hid_cascade != 0; }
int main( int argc, char* argv[] ) { int i, j; char* classifierdir = NULL; //char* samplesdir = NULL; int saveDetected = 1; double scale_factor = 1.2; float maxSizeDiff = 1.5F; float maxPosDiff = 0.3F; /* number of stages. if <=0 all stages are used */ int nos = -1, nos0; int width = 24; int height = 24; int rocsize; FILE* info; char* infoname; char fullname[PATH_MAX]; char detfilename[PATH_MAX]; char* filename; char detname[] = "det-"; CvHaarClassifierCascade* cascade; CvMemStorage* storage; CvSeq* objects; double totaltime; infoname = (char*)""; rocsize = 40; if( argc == 1 ) { printf( "Usage: %s\n -data <classifier_directory_name>\n" " -info <collection_file_name>\n" " [-maxSizeDiff <max_size_difference = %f>]\n" " [-maxPosDiff <max_position_difference = %f>]\n" " [-sf <scale_factor = %f>]\n" " [-ni]\n" " [-nos <number_of_stages = %d>]\n" " [-rs <roc_size = %d>]\n" " [-w <sample_width = %d>]\n" " [-h <sample_height = %d>]\n", argv[0], maxSizeDiff, maxPosDiff, scale_factor, nos, rocsize, width, height ); return 0; } for( i = 1; i < argc; i++ ) { if( !strcmp( argv[i], "-data" ) ) { classifierdir = argv[++i]; } else if( !strcmp( argv[i], "-info" ) ) { infoname = argv[++i]; } else if( !strcmp( argv[i], "-maxSizeDiff" ) ) { maxSizeDiff = (float) atof( argv[++i] ); } else if( !strcmp( argv[i], "-maxPosDiff" ) ) { maxPosDiff = (float) atof( argv[++i] ); } else if( !strcmp( argv[i], "-sf" ) ) { scale_factor = atof( argv[++i] ); } else if( !strcmp( argv[i], "-ni" ) ) { saveDetected = 0; } else if( !strcmp( argv[i], "-nos" ) ) { nos = atoi( argv[++i] ); } else if( !strcmp( argv[i], "-rs" ) ) { rocsize = atoi( argv[++i] ); } else if( !strcmp( argv[i], "-w" ) ) { width = atoi( argv[++i] ); } else if( !strcmp( argv[i], "-h" ) ) { height = atoi( argv[++i] ); } } cascade = cvLoadHaarClassifierCascade( classifierdir, cvSize( width, height ) ); if( cascade == NULL ) { printf( "Unable to load classifier from %s\n", classifierdir ); return 1; } int* numclassifiers = new int[cascade->count]; numclassifiers[0] = cascade->stage_classifier[0].count; for( i = 1; i < cascade->count; i++ ) { numclassifiers[i] = numclassifiers[i-1] + cascade->stage_classifier[i].count; } storage = cvCreateMemStorage(); nos0 = cascade->count; if( nos <= 0 ) nos = nos0; strcpy( fullname, infoname ); filename = strrchr( fullname, '\\' ); if( filename == NULL ) { filename = strrchr( fullname, '/' ); } if( filename == NULL ) { filename = fullname; } else { filename++; } info = fopen( infoname, "r" ); totaltime = 0.0; if( info != NULL ) { int x, y; IplImage* img; int hits, missed, falseAlarms; int totalHits, totalMissed, totalFalseAlarms; int found; float distance; int refcount; ObjectPos* ref; int detcount; ObjectPos* det; int error=0; int* pos; int* neg; pos = (int*) cvAlloc( rocsize * sizeof( *pos ) ); neg = (int*) cvAlloc( rocsize * sizeof( *neg ) ); for( i = 0; i < rocsize; i++ ) { pos[i] = neg[i] = 0; } printf( "+================================+======+======+======+\n" ); printf( "| File Name | Hits |Missed| False|\n" ); printf( "+================================+======+======+======+\n" ); totalHits = totalMissed = totalFalseAlarms = 0; while( !feof( info ) ) { if( fscanf( info, "%s %d", filename, &refcount ) != 2 || refcount <= 0 ) break; img = cvLoadImage( fullname ); if( !img ) continue; ref = (ObjectPos*) cvAlloc( refcount * sizeof( *ref ) ); for( i = 0; i < refcount; i++ ) { int w, h; error = (fscanf( info, "%d %d %d %d", &x, &y, &w, &h ) != 4); if( error ) break; ref[i].x = 0.5F * w + x; ref[i].y = 0.5F * h + y; ref[i].width = sqrtf( 0.5F * (w * w + h * h) ); ref[i].found = 0; ref[i].neghbors = 0; } if( !error ) { cvClearMemStorage( storage ); cascade->count = nos; totaltime -= time( 0 ); objects = cvHaarDetectObjects( img, cascade, storage, scale_factor, 1 ); totaltime += time( 0 ); cascade->count = nos0; detcount = ( objects ? objects->total : 0); det = (detcount > 0) ? ( (ObjectPos*)cvAlloc( detcount * sizeof( *det )) ) : NULL; hits = missed = falseAlarms = 0; for( i = 0; i < detcount; i++ ) { CvAvgComp r = *((CvAvgComp*) cvGetSeqElem( objects, i )); det[i].x = 0.5F * r.rect.width + r.rect.x; det[i].y = 0.5F * r.rect.height + r.rect.y; det[i].width = sqrtf( 0.5F * (r.rect.width * r.rect.width + r.rect.height * r.rect.height) ); det[i].neghbors = r.neighbors; if( saveDetected ) { cvRectangle( img, cvPoint( r.rect.x, r.rect.y ), cvPoint( r.rect.x + r.rect.width, r.rect.y + r.rect.height ), CV_RGB( 255, 0, 0 ), 3 ); } found = 0; for( j = 0; j < refcount; j++ ) { distance = sqrtf( (det[i].x - ref[j].x) * (det[i].x - ref[j].x) + (det[i].y - ref[j].y) * (det[i].y - ref[j].y) ); if( (distance < ref[j].width * maxPosDiff) && (det[i].width > ref[j].width / maxSizeDiff) && (det[i].width < ref[j].width * maxSizeDiff) ) { ref[j].found = 1; ref[j].neghbors = MAX( ref[j].neghbors, det[i].neghbors ); found = 1; } } if( !found ) { falseAlarms++; neg[MIN(det[i].neghbors, rocsize - 1)]++; } } for( j = 0; j < refcount; j++ ) { if( ref[j].found ) { hits++; pos[MIN(ref[j].neghbors, rocsize - 1)]++; } else { missed++; } } totalHits += hits; totalMissed += missed; totalFalseAlarms += falseAlarms; printf( "|%32.32s|%6d|%6d|%6d|\n", filename, hits, missed, falseAlarms ); printf( "+--------------------------------+------+------+------+\n" ); fflush( stdout ); if( saveDetected ) { strcpy( detfilename, detname ); strcat( detfilename, filename ); strcpy( filename, detfilename ); cvvSaveImage( fullname, img ); } if( det ) { cvFree( &det ); det = NULL; } } /* if( !error ) */ cvReleaseImage( &img ); cvFree( &ref ); } fclose( info ); printf( "|%32.32s|%6d|%6d|%6d|\n", "Total", totalHits, totalMissed, totalFalseAlarms ); printf( "+================================+======+======+======+\n" ); printf( "Number of stages: %d\n", nos ); printf( "Number of weak classifiers: %d\n", numclassifiers[nos - 1] ); printf( "Total time: %f\n", totaltime ); /* print ROC to stdout */ for( i = rocsize - 1; i > 0; i-- ) { pos[i-1] += pos[i]; neg[i-1] += neg[i]; } fprintf( stderr, "%d\n", nos ); for( i = 0; i < rocsize; i++ ) { fprintf( stderr, "\t%d\t%d\t%f\t%f\n", pos[i], neg[i], ((float)pos[i]) / (totalHits + totalMissed), ((float)neg[i]) / (totalHits + totalMissed) ); } cvFree( &pos ); cvFree( &neg ); } delete[] numclassifiers; cvReleaseHaarClassifierCascade( &cascade ); cvReleaseMemStorage( &storage ); return 0; }
strcat(template, suffix); fd = mkstemp(template); assert(fd >=0); nbytes = write(fd, blob_data, blob_len); assert(nbytes == (size_t) blob_len); close(fd); // cvLoad requires the filename end in .xml, argh. char *xml_name; xml_name = malloc(strlen(template) + strlen(".xml") + 1); strcpy(xml_name, template); strcat(xml_name, ".xml"); rename(template, xml_name); fconfig->haar_cascade = cvLoadHaarClassifierCascade( xml_name, cvSize(fconfig->xsize, fconfig->ysize)); free(template); free(xml_name); *fdatap = fconfig; return (0); } static int f_eval_opencv_detect(lf_obj_handle_t ohandle, void *fdata) { int pass = 0; const void * dptr; RGBImage * img; opencv_fdetect_t * fconfig = (opencv_fdetect_t *) fdata;