Ignore:
Timestamp:
03/19/2009 10:58:22 AM (11 years ago)
Author:
dave
Message:

Proper calibration system, better user interface and fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • foam/trunk/simple-faceident/src/main.cpp

    r1 r14  
    5757// These are the tweakable bits - see comments in FaceBank.h 
    5858 
    59 const int nfaces = 3; 
    60 FaceBank facebank(nfaces, 30, 40, 0.05);  
     59FaceBank facebank(30, 40, 0.15);  
    6160 
    6261// number of frames to detect new faces for 
    63 int calibrate_frames = 100; 
     62int calibrate_frames = 200; 
    6463 
    6564// show all faces currently detected  
    66 //#define SHOW_FACES 
     65#define SHOW_FACES 
    6766 
    6867//#define SAVE_FRAMES 
    6968 
    7069// globals 
    71 int frame=0; 
    7270bool learn=true; 
     71int facenum=0; 
     72int framenum=0; 
    7373 
    7474////////////////////////////////////////////////////////// 
     
    140140    cvNamedWindow( "result", 1 ); 
    141141         
    142         #ifdef SHOW_FACES 
    143         char name[256]; 
    144         for (i=0; i<nfaces; i++) 
    145         { 
    146                 sprintf(name,"face%i",i); 
    147         cvNamedWindow(name, 1); 
    148         } 
    149         #endif 
    150          
    151142    if( capture ) 
    152143    { 
     
    159150                break; 
    160151            if( !frame_copy ) 
    161                 frame_copy = cvCreateImage( cvSize(frame->width,frame->height), 
     152                frame_copy = cvCreateImage( cvSize(frame->width/2,frame->height/2), 
    162153                                            IPL_DEPTH_8U, frame->nChannels ); 
    163154            if( frame->origin == IPL_ORIGIN_TL ) 
    164                 cvCopy( frame, frame_copy, 0 ); 
     155                                cvResize(frame, frame_copy, CV_INTER_LINEAR ); 
     156                //cvCopy( frame, frame_copy, 0 ); 
    165157            else 
    166158                cvFlip( frame, frame_copy, 0 ); 
    167159             
    168160            detect_and_draw( frame_copy ); 
    169  
    170             if( cvWaitKey( 10 ) >= 0 ) 
    171                 goto _cleanup_; 
    172         } 
    173  
    174         cvWaitKey(0); 
     161        } 
     162 
    175163_cleanup_: 
    176164        cvReleaseImage( &frame_copy ); 
     
    182170        { 
    183171            detect_and_draw( image ); 
    184             cvWaitKey(0); 
    185172            cvReleaseImage( &image ); 
    186173        } 
     
    203190                    if( image ) 
    204191                    { 
    205                         detect_and_draw( image ); 
    206                         c = cvWaitKey(0); 
    207                         if( c == 27 || c == 'q' || c == 'Q' ) 
    208                             break; 
     192                        detect_and_draw( image );                         
    209193                        cvReleaseImage( &image ); 
    210194                    } 
     
    216200     
    217201    cvDestroyWindow("result"); 
    218         #ifdef SHOW_FACES 
    219         for (i=0; i<nfaces; i++) 
    220         { 
    221                 sprintf(name,"face%i",i); 
    222         cvDestroyWindow(name); 
    223         } 
    224         #endif 
    225  
    226202    return 0; 
    227203} 
    228  
    229204 
    230205void detect_and_draw( IplImage* img ) 
     
    244219    IplImage *gray, *small_img; 
    245220    int j; 
     221        CvSize imgsize = cvGetSize(img); 
    246222 
    247223    gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 ); 
     
    256232        CvFont font; 
    257233    cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 2, 2, 0, 1, CV_AA ); 
     234 
     235        CvFont infofont; 
     236    cvInitFont( &infofont, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, CV_AA ); 
     237 
     238        CvFont helpfont; 
     239    cvInitFont( &helpfont, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA ); 
    258240         
    259241    if( cascade ) 
     
    271253        //printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) ); 
    272254                 
    273                 if (frame==calibrate_frames)  
     255                framenum++; 
     256                if (framenum==100)  
    274257                { 
    275                         learn=false; 
    276                         cerr<<"finished learning new faces"<<endl; 
     258                        cerr<<"next face"<<endl; 
     259                        facenum++;  
    277260                } 
    278261                 
    279                 frame++; 
    280                  
     262                if (framenum==200)  
     263                { 
     264                        cerr<<"stopped learning"<<endl; 
     265                        cerr<<facebank.GetFaceMap().size()<<" faces recorded"<<endl; 
     266                        learn=false;   
     267                } 
     268                 
     269                 
     270                int key=cvWaitKey(10); 
     271                 
     272                switch (key) 
     273                { 
     274                        case 'd': learn=false; break; 
     275                        case '1': facenum=1; learn=true; break; 
     276                        case '2': facenum=2; learn=true; break; 
     277                        case '3': facenum=3; learn=true; break; 
     278                        case '4': facenum=4; learn=true; break; 
     279                        case '5': facenum=5; learn=true; break; 
     280                        case '6': facenum=6; learn=true; break; 
     281                        case '7': facenum=7; learn=true; break; 
     282                        case '8': facenum=8; learn=true; break; 
     283                        case '9': facenum=9; learn=true; break; 
     284                        case '0': facenum=0; learn=true; break; 
     285                        case 'c': facebank.Clear(); break; 
     286                } 
     287                 
     288                                 
    281289        for(int i = 0; i < (faces ? faces->total : 0); i++ ) 
    282290        { 
     
    285293                         
    286294                        unsigned int ID=999; 
     295                        float error=0; 
    287296                        // get the face area as a sub image 
    288297                        IplImage *face = SubImage(img, *r); 
    289298                        // pass it into the face bank  
    290                         facebank.Identify(face,ID,learn); 
     299                        if (learn) 
     300                        { 
     301                                error=facebank.Suggest(face,facenum); 
     302                                ID=facenum; 
     303                        } 
     304                        else 
     305                        {        
     306                                error=facebank.Identify(face,ID); 
     307                        } 
     308                         
    291309                        cvReleaseImage(&face); 
    292                          
     310                        CvScalar color = colors[ID%8]; 
     311 
    293312                        // if it's recognised the face (should really check the confidence) 
    294313                        if (ID!=999) 
    295314                        { 
    296315                                char s[32]; 
    297                                 sprintf(s,"%d",ID); 
    298                                 cvPutText(img, s, cvPoint(r->x,r->y+25), &font, CV_RGB(1,1,1)); 
     316                                sprintf(s,"%d %0.2f",ID,error); 
     317                                cvPutText(img, s, cvPoint(r->x,r->y+25), &font, color); 
     318                                int x=(facebank.GetFaceWidth()+1)*ID; 
     319                                int y=imgsize.height-facebank.GetFaceHeight(); 
     320                                cvLine(img, cvPoint(r->x+r->width/2,r->y+r->height/2), 
     321                                        cvPoint(x+facebank.GetFaceWidth()/2,y+facebank.GetFaceHeight()/2), color); 
    299322                        } 
    300323 
    301             CvScalar color = colors[ID%8]; 
    302324                        cvRectangle(img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), color); 
    303325        } 
    304326    } 
    305327 
     328        char info[256]; 
     329        if (learn) 
     330        { 
     331                snprintf(info,256,"learning user %d",facenum); 
     332        } 
     333        else 
     334        { 
     335                snprintf(info,256,"detecting faces"); 
     336        } 
     337        cvPutText(img, info, cvPoint(20,30), &infofont, CV_RGB(0,0,0)); 
     338 
     339        snprintf(info,256,"keys:"); 
     340        cvPutText(img, info, cvPoint(20,50), &helpfont, CV_RGB(0,0,0)); 
     341        snprintf(info,256,"number key 0-9 : learn face"); 
     342        cvPutText(img, info, cvPoint(20,60), &helpfont, CV_RGB(0,0,0)); 
     343        snprintf(info,256,"'d' : face detect mode"); 
     344        cvPutText(img, info, cvPoint(20,70), &helpfont, CV_RGB(0,0,0)); 
     345        snprintf(info,256,"'c' : clear all faces"); 
     346        cvPutText(img, info, cvPoint(20,80), &helpfont, CV_RGB(0,0,0)); 
     347 
     348 
     349        #ifdef SHOW_FACES 
     350        for(map<unsigned int,Face*>::iterator ii=facebank.GetFaceMap().begin();  
     351                ii!=facebank.GetFaceMap().end(); ++ii) 
     352        { 
     353                int x=(facebank.GetFaceWidth()+1)*ii->first; 
     354                int y=imgsize.height-facebank.GetFaceHeight(); 
     355                BlitImage(ii->second->m_Image,img,cvPoint(x,y)); 
     356        } 
     357        #endif 
     358         
    306359    cvShowImage( "result", img ); 
    307360 
     
    311364        cvSaveImage(name,img); 
    312365        #endif 
    313          
    314         #ifdef SHOW_FACES 
    315         char name[256]; 
    316         int i=0; 
    317         for(list<Face*>::iterator ii=facebank.GetFaceList().begin();  
    318                 ii!=facebank.GetFaceList().end(); ++ii) 
    319         { 
    320                 sprintf(name,"face%i",i); 
    321         cvShowImage(name,(*ii)->m_Image); 
    322                 i++; 
    323         } 
    324         #endif 
    325366     
    326367        cvReleaseImage( &gray ); 
Note: See TracChangeset for help on using the changeset viewer.