Changeset 64


Ignore:
Timestamp:
04/15/2009 07:18:29 PM (11 years ago)
Author:
iolanda
Message:

changed a few things to work on both on windows and linux

Location:
foam/trunk/simple-faceident/src
Files:
3 edited

Legend:

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

    r61 r64  
    2121#include <vector> 
    2222 
     23#ifdef WIN32 
     24#include <string> 
     25#define snprintf _snprintf  
     26#endif 
     27 
    2328using namespace std; 
    2429 
  • foam/trunk/simple-faceident/src/ImageUtils.cpp

    r14 r64  
    1717#include "ImageUtils.h" 
    1818 
     19#include <iostream> 
    1920using namespace std; 
    2021 
  • foam/trunk/simple-faceident/src/main.cpp

    r62 r64  
    3030#include <time.h> 
    3131#include <ctype.h> 
    32 #include <unistd.h> 
     32 
     33//#include <unistd.h>  -iolanda commented this 
    3334 
    3435#include "FaceBank.h" 
     
    4142#ifdef _EiC 
    4243#define WIN32 
     44#endif 
     45 
     46#ifdef WIN32 
     47#include <string> 
     48#define snprintf _snprintf  
     49#else 
     50#include <unistd.h> 
    4351#endif 
    4452 
     
    5058void detect_and_draw( IplImage* image ); 
    5159 
    52 const char* cascade_name = 
    53     "/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"; 
     60const char* cascade_name = "haarcascade_frontalface_alt.xml"; 
     61// "/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"; 
    5462/*    "haarcascade_profileface.xml";*/ 
    55 const char* nested_cascade_name = 
    56     "/usr/local/share/opencv/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; 
     63const char* nested_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; 
     64//"/usr/local/share/opencv/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; 
    5765//    "../../data/haarcascades/haarcascade_eye.xml"; 
    5866double scale = 1; 
     
    7987int main( int argc, char** argv ) 
    8088{ 
    81     CvCapture* capture = 0; 
    82     IplImage *frame, *frame_copy = 0; 
    83     IplImage *image = 0; 
    84     const char* scale_opt = "--scale="; 
    85     int scale_opt_len = (int)strlen(scale_opt); 
    86     const char* cascade_opt = "--cascade="; 
    87     int cascade_opt_len = (int)strlen(cascade_opt); 
    88     const char* nested_cascade_opt = "--nested-cascade"; 
    89     int nested_cascade_opt_len = (int)strlen(nested_cascade_opt); 
    90     int i; 
    91     const char* input_name = 0; 
    92  
    93 ///////////////////////// 
    94 // yarp bit, would like to move this somewhere else 
    95  
    96     ctrlport.open("/faceident-ctrl");      
    97  
    98 ///////////////////////// 
    99  
    100     for( i = 1; i < argc; i++ ) 
    101     { 
    102         if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 ) 
    103             cascade_name = argv[i] + cascade_opt_len; 
    104         else if( strncmp( argv[i], nested_cascade_opt, nested_cascade_opt_len ) == 0 ) 
    105         { 
    106             if( argv[i][nested_cascade_opt_len] == '=' ) 
    107                 nested_cascade_name = argv[i] + nested_cascade_opt_len + 1; 
    108             nested_cascade = (CvHaarClassifierCascade*)cvLoad( nested_cascade_name, 0, 0, 0 ); 
    109             if( !nested_cascade ) 
    110                 fprintf( stderr, "WARNING: Could not load classifier cascade for nested objects\n" ); 
    111         } 
    112         else if( strncmp( argv[i], scale_opt, scale_opt_len ) == 0 ) 
    113         { 
    114             if( !sscanf( argv[i] + scale_opt_len, "%lf", &scale ) || scale < 1 ) 
    115                 scale = 1; 
    116         } 
    117         else if( argv[i][0] == '-' ) 
    118         { 
    119             fprintf( stderr, "WARNING: Unknown option %s\n", argv[i] ); 
    120         } 
    121         else 
    122             input_name = argv[i]; 
    123     } 
    124  
    125     cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); 
    126  
    127     if( !cascade ) 
    128     { 
    129         fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); 
    130         fprintf( stderr, 
    131         "Usage: facedetect [--cascade=\"<cascade_path>\"]\n" 
    132         "   [--nested-cascade[=\"nested_cascade_path\"]]\n" 
    133         "   [--scale[=<image scale>\n" 
    134         "   [filename|camera_index]\n" ); 
    135         return -1; 
    136     } 
    137     storage = cvCreateMemStorage(0); 
    138      
    139     if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') ) 
    140         capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' ); 
    141     else if( input_name ) 
    142     { 
    143         image = cvLoadImage( input_name, 1 ); 
    144         if( !image ) 
    145             capture = cvCaptureFromAVI( input_name ); 
    146     } 
    147     else 
    148         image = cvLoadImage( "lena.jpg", 1 ); 
    149  
    150     cvNamedWindow( "result", 1 ); 
    151          
    152     if( capture ) 
    153     { 
    154         for(;;) 
    155         { 
    156             if( !cvGrabFrame( capture )) 
    157                 break; 
    158             frame = cvRetrieveFrame( capture ); 
    159             if( !frame ) 
    160                 break; 
    161             if( !frame_copy ) 
    162                 frame_copy = cvCreateImage( cvSize(frame->width,frame->height), 
    163                                             IPL_DEPTH_8U, frame->nChannels ); 
    164             if( frame->origin == IPL_ORIGIN_TL ) 
    165                 cvCopy( frame, frame_copy, 0 ); 
    166             else 
    167                 cvFlip( frame, frame_copy, 0 ); 
    168              
    169             detect_and_draw( frame_copy ); 
    170         } 
     89        CvCapture* capture = 0; 
     90        IplImage *frame, *frame_copy = 0; 
     91        IplImage *image = 0; 
     92        const char* scale_opt = "--scale="; 
     93        int scale_opt_len = (int)strlen(scale_opt); 
     94        const char* cascade_opt = "--cascade="; 
     95        int cascade_opt_len = (int)strlen(cascade_opt); 
     96        const char* nested_cascade_opt = "--nested-cascade"; 
     97        int nested_cascade_opt_len = (int)strlen(nested_cascade_opt); 
     98        int i; 
     99        const char* input_name = 0; 
     100 
     101        ///////////////////////// 
     102        // yarp bit, would like to move this somewhere else 
     103 
     104        ctrlport.open("/faceident-ctrl");      
     105 
     106        ///////////////////////// 
     107 
     108        for( i = 1; i < argc; i++ ) 
     109        { 
     110                if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 ) 
     111                        cascade_name = argv[i] + cascade_opt_len; 
     112                else if( strncmp( argv[i], nested_cascade_opt, nested_cascade_opt_len ) == 0 ) 
     113                { 
     114                        if( argv[i][nested_cascade_opt_len] == '=' ) 
     115                                nested_cascade_name = argv[i] + nested_cascade_opt_len + 1; 
     116                        nested_cascade = (CvHaarClassifierCascade*)cvLoad( nested_cascade_name, 0, 0, 0 ); 
     117                        if( !nested_cascade ) 
     118                                fprintf( stderr, "WARNING: Could not load classifier cascade for nested objects\n" ); 
     119                } 
     120                else if( strncmp( argv[i], scale_opt, scale_opt_len ) == 0 ) 
     121                { 
     122                        if( !sscanf( argv[i] + scale_opt_len, "%lf", &scale ) || scale < 1 ) 
     123                                scale = 1; 
     124                } 
     125                else if( argv[i][0] == '-' ) 
     126                { 
     127                        fprintf( stderr, "WARNING: Unknown option %s\n", argv[i] ); 
     128                } 
     129                else 
     130                        input_name = argv[i]; 
     131        } 
     132 
     133        cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); 
     134 
     135        if( !cascade ) 
     136        { 
     137                fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); 
     138                fprintf( stderr, 
     139                        "Usage: facedetect [--cascade=\"<cascade_path>\"]\n" 
     140                        "   [--nested-cascade[=\"nested_cascade_path\"]]\n" 
     141                        "   [--scale[=<image scale>\n" 
     142                        "   [filename|camera_index]\n" ); 
     143                return -1; 
     144        } 
     145        storage = cvCreateMemStorage(0); 
     146 
     147        if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') ) 
     148                capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' ); 
     149        else if( input_name ) 
     150        { 
     151                image = cvLoadImage( input_name, 1 ); 
     152                if( !image ) 
     153                        capture = cvCaptureFromAVI( input_name ); 
     154        } 
     155        else 
     156                image = cvLoadImage( "lena.jpg", 1 ); 
     157 
     158        cvNamedWindow( "result", 1 ); 
     159 
     160        if( capture ) 
     161        { 
     162                for(;;) 
     163                { 
     164                        if( !cvGrabFrame( capture )) 
     165                                break; 
     166                        frame = cvRetrieveFrame( capture ); 
     167                        if( !frame ) 
     168                                break; 
     169                        if( !frame_copy ) 
     170                                frame_copy = cvCreateImage( cvSize(frame->width,frame->height), 
     171                                IPL_DEPTH_8U, frame->nChannels ); 
     172                        if( frame->origin == IPL_ORIGIN_TL ) 
     173                                cvCopy( frame, frame_copy, 0 ); 
     174                        else 
     175                                cvFlip( frame, frame_copy, 0 ); 
     176 
     177                        detect_and_draw( frame_copy ); 
     178                } 
    171179 
    172180_cleanup_: 
    173         cvReleaseImage( &frame_copy ); 
    174         cvReleaseCapture( &capture ); 
    175     } 
    176     else 
    177     { 
    178         if( image ) 
    179         { 
    180             detect_and_draw( image ); 
    181             cvReleaseImage( &image ); 
    182         } 
    183         else if( input_name ) 
    184         { 
    185             // assume it is a text file containing the 
    186             //   list of the image filenames to be processed - one per line  
    187             FILE* f = fopen( input_name, "rt" ); 
    188             if( f ) 
    189             { 
    190                 char buf[1000+1]; 
    191                 while( fgets( buf, 1000, f ) ) 
    192                 { 
    193                     int len = (int)strlen(buf), c; 
    194                     while( len > 0 && isspace(buf[len-1]) ) 
    195                         len--; 
    196                     buf[len] = '\0'; 
    197                     printf( "file %s\n", buf );  
    198                     image = cvLoadImage( buf, 1 ); 
    199                     if( image ) 
    200                     { 
    201                         detect_and_draw( image );                         
    202                         cvReleaseImage( &image ); 
    203                     } 
    204                 } 
    205                 fclose(f); 
    206             } 
    207         } 
    208     } 
    209      
    210     cvDestroyWindow("result"); 
    211     return 0; 
     181                cvReleaseImage( &frame_copy ); 
     182                cvReleaseCapture( &capture ); 
     183        } 
     184        else 
     185        { 
     186                if( image ) 
     187                { 
     188                        detect_and_draw( image ); 
     189                        cvReleaseImage( &image ); 
     190                } 
     191                else if( input_name ) 
     192                { 
     193                        // assume it is a text file containing the 
     194                        //   list of the image filenames to be processed - one per line  
     195                        FILE* f = fopen( input_name, "rt" ); 
     196                        if( f ) 
     197                        { 
     198                                char buf[1000+1]; 
     199                                while( fgets( buf, 1000, f ) ) 
     200                                { 
     201                                        int len = (int)strlen(buf), c; 
     202                                        while( len > 0 && isspace(buf[len-1]) ) 
     203                                                len--; 
     204                                        buf[len] = '\0'; 
     205                                        printf( "file %s\n", buf );  
     206                                        image = cvLoadImage( buf, 1 ); 
     207                                        if( image ) 
     208                                        { 
     209                                                detect_and_draw( image );                         
     210                                                cvReleaseImage( &image ); 
     211                                        } 
     212                                } 
     213                                fclose(f); 
     214                        } 
     215                } 
     216        } 
     217 
     218        cvDestroyWindow("result"); 
     219        return 0; 
    212220} 
    213221 
    214222void detect_and_draw( IplImage* img ) 
    215223{ 
    216     static CvScalar colors[] =  
    217     { 
    218         {{0,0,255}}, 
    219         {{0,128,255}}, 
    220         {{0,255,255}}, 
    221         {{0,255,0}}, 
    222         {{255,128,0}}, 
    223         {{255,255,0}}, 
    224         {{255,0,0}}, 
    225         {{255,0,255}} 
    226     }; 
    227  
    228     IplImage *small_img; 
    229     int j; 
    230  
    231     small_img = cvCreateImage( cvSize( cvRound (img->width/scale), 
    232                          cvRound (img->height/scale)), 8, 3 ); 
     224        static CvScalar colors[] =  
     225        { 
     226                {{0,0,255}}, 
     227                {{0,128,255}}, 
     228                {{0,255,255}}, 
     229                {{0,255,0}}, 
     230                {{255,128,0}}, 
     231                {{255,255,0}}, 
     232                {{255,0,0}}, 
     233                {{255,0,255}} 
     234        }; 
     235 
     236        IplImage *small_img; 
     237        int j; 
     238 
     239        small_img = cvCreateImage( cvSize( cvRound (img->width/scale), 
     240                cvRound (img->height/scale)), 8, 3 ); 
    233241        CvSize imgsize = cvGetSize(small_img); 
    234     cvResize( img, small_img, CV_INTER_LINEAR ); 
    235     cvClearMemStorage( storage ); 
     242        cvResize( img, small_img, CV_INTER_LINEAR ); 
     243        cvClearMemStorage( storage ); 
    236244 
    237245        CvFont font; 
    238     cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 2, 2, 0, 1, CV_AA ); 
     246        cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 2, 2, 0, 1, CV_AA ); 
    239247 
    240248        CvFont infofont; 
    241     cvInitFont( &infofont, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, CV_AA ); 
     249        cvInitFont( &infofont, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, CV_AA ); 
    242250 
    243251        CvFont helpfont; 
    244     cvInitFont( &helpfont, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA ); 
    245          
    246     if( cascade ) 
    247     { 
    248         double t = (double)cvGetTickCount(); 
    249         CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 
    250                                             1.1, 2, 0 
    251                                             //|CV_HAAR_FIND_BIGGEST_OBJECT 
    252                                             //|CV_HAAR_DO_ROUGH_SEARCH 
    253                                             //|CV_HAAR_DO_CANNY_PRUNING 
    254                                             //|CV_HAAR_SCALE_IMAGE 
    255                                             , 
    256                                             cvSize(30, 30) ); 
    257         t = (double)cvGetTickCount() - t; 
    258         //printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) ); 
    259                  
     252        cvInitFont( &helpfont, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA ); 
     253 
     254        if( cascade ) 
     255        { 
     256                double t = (double)cvGetTickCount(); 
     257                CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 
     258                        1.1, 2, 0 
     259                        //|CV_HAAR_FIND_BIGGEST_OBJECT 
     260                        //|CV_HAAR_DO_ROUGH_SEARCH 
     261                        //|CV_HAAR_DO_CANNY_PRUNING 
     262                        //|CV_HAAR_SCALE_IMAGE 
     263                        , 
     264                        cvSize(30, 30) ); 
     265                t = (double)cvGetTickCount() - t; 
     266                //printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) ); 
     267 
    260268                /*framenum++; 
    261269                if (framenum==100)  
    262270                { 
    263                         cerr<<"next face"<<endl; 
    264                         facenum++;  
    265                 } 
    266                  
     271                cerr<<"next face"<<endl; 
     272                facenum++;  
     273                } 
     274 
    267275                if (framenum==220)  
    268276                { 
    269                         cerr<<"stopped learning"<<endl; 
    270                         cerr<<facebank.GetFaceMap().size()<<" faces recorded"<<endl; 
    271                         learn=false;   
     277                cerr<<"stopped learning"<<endl; 
     278                cerr<<facebank.GetFaceMap().size()<<" faces recorded"<<endl; 
     279                learn=false;   
    272280                }*/ 
    273                  
     281 
    274282                /////////////////////////////////// 
    275283                // dispatch from input 
    276                  
     284 
    277285                int key=cvWaitKey(10); 
    278                  
     286 
    279287                switch (key) 
    280288                { 
    281                         case 'd': learn=false; break; 
    282                         case '1': facenum=1; learn=true; break; 
    283                         case '2': facenum=2; learn=true; break; 
    284                         case '3': facenum=3; learn=true; break; 
    285                         case '4': facenum=4; learn=true; break; 
    286                         case '5': facenum=5; learn=true; break; 
    287                         case '6': facenum=6; learn=true; break; 
    288                         case '7': facenum=7; learn=true; break; 
    289                         case '8': facenum=8; learn=true; break; 
    290                         case '9': facenum=9; learn=true; break; 
    291                         case '0': facenum=0; learn=true; break; 
    292                         case 'c': facebank.Clear(); break; 
     289                case 'd': learn=false; break; 
     290                case '1': facenum=1; learn=true; break; 
     291                case '2': facenum=2; learn=true; break; 
     292                case '3': facenum=3; learn=true; break; 
     293                case '4': facenum=4; learn=true; break; 
     294                case '5': facenum=5; learn=true; break; 
     295                case '6': facenum=6; learn=true; break; 
     296                case '7': facenum=7; learn=true; break; 
     297                case '8': facenum=8; learn=true; break; 
     298                case '9': facenum=9; learn=true; break; 
     299                case '0': facenum=0; learn=true; break; 
     300                case 'c': facebank.Clear(); break; 
    293301                } 
    294302 
     
    328336                        } 
    329337                } 
    330                  
     338 
    331339                /////////////////////////////////// 
    332340 
    333341                if (!idle) 
    334342                { 
    335                 for(int i = 0; i < (faces ? faces->total : 0); i++ ) 
    336                 { 
    337                 CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); 
    338                 CvMat small_img_roi; 
     343                        for(int i = 0; i < (faces ? faces->total : 0); i++ ) 
     344                        { 
     345                                CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); 
     346                                CvMat small_img_roi; 
    339347 
    340348                                unsigned int ID=999; 
     
    374382 
    375383                                cvRectangle(small_img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), color); 
    376                 } 
     384                        } 
    377385                } 
    378386                else 
    379387                { 
    380388                        // idling, so free up some cpu 
     389                #ifdef WIN32 
     390                        Sleep(2000); 
     391                #else 
    381392                        usleep(200000); 
    382                 } 
    383     } 
     393                #endif 
     394                } 
     395        } 
    384396 
    385397        scenestate.Update(); 
     
    405417        cvPutText(small_img, info, cvPoint(20,80), &helpfont, CV_RGB(0,0,0)); 
    406418 
    407         #ifdef SHOW_FACES 
     419#ifdef SHOW_FACES 
    408420        for(map<unsigned int,Face*>::iterator ii=facebank.GetFaceMap().begin();  
    409421                ii!=facebank.GetFaceMap().end(); ++ii) 
     
    413425                BlitImage(ii->second->m_Image,small_img,cvPoint(x,y)); 
    414426        } 
    415         #endif 
    416          
    417     cvShowImage( "result", small_img ); 
    418  
    419         #ifdef SAVE_FRAMES 
     427#endif 
     428 
     429        cvShowImage( "result", small_img ); 
     430 
     431#ifdef SAVE_FRAMES 
    420432        char name[256]; 
    421433        sprintf(name,"out-%0.4d.jpg",framenum); 
    422434        cvSaveImage(name,small_img); 
    423         #endif 
    424      
    425     cvReleaseImage( &small_img ); 
     435#endif 
     436 
     437        cvReleaseImage( &small_img ); 
    426438} 
Note: See TracChangeset for help on using the changeset viewer.