All pastes #1868798 Raw Edit

facedetect_bmp

public cpp v1 · immutable
#1868798 ·published 2010-04-20 00:47 UTC
rendered paste body
#define HAVE_LRINT 1#include "cv.h"#include "highgui.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <math.h>#include <float.h>#include <limits.h>#include <time.h>#include <ctype.h>#ifdef _EiC#define WIN32#endifstatic CvMemStorage* storage = 0;static CvHaarClassifierCascade* cascade = 0;static CvHaarClassifierCascade* nested_cascade = 0;int use_nested_cascade = 0;void detect_and_draw( IplImage* image, char size);const char* cascade_name =    "../../data/haarcascades/haarcascade_frontalface_alt.xml";/*    "haarcascade_profileface.xml";*/const char* nested_cascade_name =    "../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";//    "../../data/haarcascades/haarcascade_eye.xml";double scale = 1;const char window_size[]={20,30,40,50};FILE    *outfile = NULL;typedef enum{   FILE_BMP,   FILE_YML,   FILE_JPG}eInputType;int main( int argc, char** argv ){    CvCapture* capture = 0;    IplImage *frame, *frame_copy = 0;    IplImage *image = 0;    const char* scale_opt = "--scale=";    int scale_opt_len = (int)strlen(scale_opt);    const char* cascade_opt = "--cascade=";    int cascade_opt_len = (int)strlen(cascade_opt);    const char* nested_cascade_opt = "--nested-cascade";        const char* ext_opt = "--extension";    int ext_opt_len = (int)strlen(ext_opt);        eInputType type = FILE_BMP;        int nested_cascade_opt_len = (int)strlen(nested_cascade_opt);    int i;    const char* input_name = 0;    CV_SET_IMAGE_IO_FUNCTIONS();    for( i = 1; i < argc; i++ )    {        if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )            cascade_name = argv[i] + cascade_opt_len;        else if( strncmp( argv[i], nested_cascade_opt, nested_cascade_opt_len ) == 0 )        {            if( argv[i][nested_cascade_opt_len] == '=' )                nested_cascade_name = argv[i] + nested_cascade_opt_len + 1;            nested_cascade = (CvHaarClassifierCascade*)cvLoad( nested_cascade_name, 0, 0, 0 );            if( !nested_cascade )                fprintf( stderr, "WARNING: Could not load classifier cascade for nested objects\n" );        }        else if( strncmp( argv[i], scale_opt, scale_opt_len ) == 0 )        {            if( !sscanf( argv[i] + scale_opt_len, "%lf", &scale ) || scale < 1 )                scale = 1;        }        else if( strncmp( argv[i],ext_opt, ext_opt_len ) == 0 )        {           sscanf( argv[i] + ext_opt_len+1, "%lu", &type );//                type = FILE_YML;        }        else if( argv[i][0] == '-' )        {            fprintf( stderr, "WARNING: Unknown option %s\n", argv[i] );        }        else            input_name = argv[i];    }    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );    if( !cascade )    {        fprintf( stderr, "ERROR: Could not load classifier cascade\n" );        fprintf( stderr,        "Usage: facedetect [--cascade=\"<cascade_path>\"]\n"        "   [--nested-cascade[=\"nested_cascade_path\"]]\n"        "   [--scale[=<image scale>\n"        "   [filename|camera_index]\n" );        return -1;    }    outfile = fopen("facedetect.txt","a+");    storage = cvCreateMemStorage(0);       switch (type)    {      case FILE_YML:         image = (IplImage*)cvLoad( "lena.jpg.yml");        break;      case FILE_BMP:        image = cvLoadImage( "lena.bmp",1);        break;      case FILE_JPG:        image = cvLoadImage( "lena.jpg",1);          break;    }         if( image )        {            detect_and_draw( image, 20 );            cvReleaseImage( &image );        }        else if( input_name )        {            /* assume it is a text file containing the               list of the image filenames to be processed - one per line */            FILE* f = fopen( input_name, "rt" );            if( f )            {                char buf[1000+1];                while( fgets( buf, 1000, f ) )                {                    int len = (int)strlen(buf), c;                    while( len > 0 && isspace(buf[len-1]) )                        len--;                    buf[len] = '\0';                    printf( "file %s\n", buf );                     for (int i=0; i < sizeof(window_size); i++)                    {                        image = cvLoadImage( buf, 1 );                        if( image )                        {                            detect_and_draw( image, window_size[i] );                        }                        if( c == 27 || c == 'q' || c == 'Q' )                            break;                        cvReleaseImage( &image );                    }                }                fclose(f);            }        }        fclose(outfile);    return 0;}void detect_and_draw( IplImage* img, char size ){    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}}    };    IplImage *gray, *small_img;    char filename[256];    int i, j;    gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );    small_img = cvCreateImage( cvSize( cvRound (img->width/scale),                         cvRound (img->height/scale)), 8, 1 );    cvCvtColor( img, gray, CV_BGR2GRAY );    cvResize( gray, small_img, CV_INTER_LINEAR );    cvEqualizeHist( small_img, small_img );    cvClearMemStorage( storage );    if( cascade )    {        double t = (double)cvGetTickCount();        double time;                printf( "Window size = %d\n", size );        CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,                                            1.1, 2, 0                                            //|CV_HAAR_FIND_BIGGEST_OBJECT                                            //|CV_HAAR_DO_ROUGH_SEARCH                                            |CV_HAAR_DO_CANNY_PRUNING                                            //|CV_HAAR_SCALE_IMAGE                                            ,                                            cvSize(size, size) );        t = (double)cvGetTickCount() - t;        time = t/((double)cvGetTickFrequency()*1000.);         printf( "detection time = %gms\n", time );        fprintf(outfile, "detection time = %gms\n", time );        printf( "faces found = %d\n",(faces ? faces->total : 0));        fprintf(outfile,"faces found = %d\n",(faces ? faces->total : 0));        for( i = 0; i < (faces ? faces->total : 0); i++ )        {            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );            CvMat small_img_roi;            CvSeq* nested_objects;            CvPoint center;            CvScalar color = colors[i%8];            int radius;            center.x = cvRound((r->x + r->width*0.5)*scale);            center.y = cvRound((r->y + r->height*0.5)*scale);            radius = cvRound((r->width + r->height)*0.25*scale);            cvCircle( img, center, radius, color, 3, 8, 0 );            if( !nested_cascade )                continue;            cvGetSubRect( small_img, &small_img_roi, *r );            nested_objects = cvHaarDetectObjects( &small_img_roi, nested_cascade, storage,                                        1.1, 2, 0                                        //|CV_HAAR_FIND_BIGGEST_OBJECT                                        //|CV_HAAR_DO_ROUGH_SEARCH                                        //|CV_HAAR_DO_CANNY_PRUNING                                        //|CV_HAAR_SCALE_IMAGE                                        ,                                        cvSize(0, 0) );            printf( "nested objects found = %d\n",(nested_objects ? nested_objects->total: 0));              for( j = 0; j < (nested_objects ? nested_objects->total : 0); j++ )            {                CvRect* nr = (CvRect*)cvGetSeqElem( nested_objects, j );                center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);                center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);                radius = cvRound((nr->width + nr->height)*0.25*scale);                cvCircle( img, center, radius, color, 3, 8, 0 );            }        }    }    sprintf(filename,"out_%dx%d_%d.bmp", img->width,img->height, size);     cvSaveImage(filename, img);    cvReleaseImage( &gray );    cvReleaseImage( &small_img );}