- Timestamp:
- 04/15/2009 07:18:29 PM (12 years ago)
- Location:
- foam/trunk/simple-faceident/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
foam/trunk/simple-faceident/src/FaceBank.cpp
r61 r64 21 21 #include <vector> 22 22 23 #ifdef WIN32 24 #include <string> 25 #define snprintf _snprintf 26 #endif 27 23 28 using namespace std; 24 29 -
foam/trunk/simple-faceident/src/ImageUtils.cpp
r14 r64 17 17 #include "ImageUtils.h" 18 18 19 #include <iostream> 19 20 using namespace std; 20 21 -
foam/trunk/simple-faceident/src/main.cpp
r62 r64 30 30 #include <time.h> 31 31 #include <ctype.h> 32 #include <unistd.h> 32 33 //#include <unistd.h> -iolanda commented this 33 34 34 35 #include "FaceBank.h" … … 41 42 #ifdef _EiC 42 43 #define WIN32 44 #endif 45 46 #ifdef WIN32 47 #include <string> 48 #define snprintf _snprintf 49 #else 50 #include <unistd.h> 43 51 #endif 44 52 … … 50 58 void detect_and_draw( IplImage* image ); 51 59 52 const char* cascade_name = 53 60 const char* cascade_name = "haarcascade_frontalface_alt.xml"; 61 // "/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"; 54 62 /* "haarcascade_profileface.xml";*/ 55 const char* nested_cascade_name = 56 63 const char* nested_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; 64 //"/usr/local/share/opencv/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; 57 65 // "../../data/haarcascades/haarcascade_eye.xml"; 58 66 double scale = 1; … … 79 87 int main( int argc, char** argv ) 80 88 { 81 82 83 84 85 86 87 88 89 90 91 92 93 /////////////////////////94 // yarp bit, would like to move this somewhere else95 96 97 98 /////////////////////////99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 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 } 171 179 172 180 _cleanup_: 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 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; 212 220 } 213 221 214 222 void detect_and_draw( IplImage* img ) 215 223 { 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 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 ); 233 241 CvSize imgsize = cvGetSize(small_img); 234 235 242 cvResize( img, small_img, CV_INTER_LINEAR ); 243 cvClearMemStorage( storage ); 236 244 237 245 CvFont font; 238 246 cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 2, 2, 0, 1, CV_AA ); 239 247 240 248 CvFont infofont; 241 249 cvInitFont( &infofont, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, CV_AA ); 242 250 243 251 CvFont helpfont; 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 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 260 268 /*framenum++; 261 269 if (framenum==100) 262 270 { 263 264 265 } 266 271 cerr<<"next face"<<endl; 272 facenum++; 273 } 274 267 275 if (framenum==220) 268 276 { 269 270 271 277 cerr<<"stopped learning"<<endl; 278 cerr<<facebank.GetFaceMap().size()<<" faces recorded"<<endl; 279 learn=false; 272 280 }*/ 273 281 274 282 /////////////////////////////////// 275 283 // dispatch from input 276 284 277 285 int key=cvWaitKey(10); 278 286 279 287 switch (key) 280 288 { 281 282 283 284 285 286 287 288 289 290 291 292 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; 293 301 } 294 302 … … 328 336 } 329 337 } 330 338 331 339 /////////////////////////////////// 332 340 333 341 if (!idle) 334 342 { 335 336 337 338 343 for(int i = 0; i < (faces ? faces->total : 0); i++ ) 344 { 345 CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); 346 CvMat small_img_roi; 339 347 340 348 unsigned int ID=999; … … 374 382 375 383 cvRectangle(small_img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), color); 376 384 } 377 385 } 378 386 else 379 387 { 380 388 // idling, so free up some cpu 389 #ifdef WIN32 390 Sleep(2000); 391 #else 381 392 usleep(200000); 382 } 383 } 393 #endif 394 } 395 } 384 396 385 397 scenestate.Update(); … … 405 417 cvPutText(small_img, info, cvPoint(20,80), &helpfont, CV_RGB(0,0,0)); 406 418 407 419 #ifdef SHOW_FACES 408 420 for(map<unsigned int,Face*>::iterator ii=facebank.GetFaceMap().begin(); 409 421 ii!=facebank.GetFaceMap().end(); ++ii) … … 413 425 BlitImage(ii->second->m_Image,small_img,cvPoint(x,y)); 414 426 } 415 416 417 418 419 427 #endif 428 429 cvShowImage( "result", small_img ); 430 431 #ifdef SAVE_FRAMES 420 432 char name[256]; 421 433 sprintf(name,"out-%0.4d.jpg",framenum); 422 434 cvSaveImage(name,small_img); 423 424 425 435 #endif 436 437 cvReleaseImage( &small_img ); 426 438 }
Note: See TracChangeset
for help on using the changeset viewer.