27 #include <fvutils/adapters/iplimage.h> 28 #include <fvutils/color/colorspaces.h> 29 #include <fvutils/readers/jpeg.h> 30 #include <fvutils/draw/drawer.h> 31 #include <classifiers/faces.h> 32 #include <filters/roidraw.h> 33 #include <fvwidgets/image_display.h> 34 #include <utils/system/argparser.h> 35 #include <utils/time/tracker.h> 36 #include <cams/factory.h> 39 #include <opencv/cv.h> 47 main(
int argc,
char **argv)
54 const char *cascade_file = argp->
arg(
"h" );
55 const char *image_file = argp->
arg(
"f" );
57 JpegReader *reader =
new JpegReader(image_file);
58 unsigned char *buffer = malloc_buffer(YUV422_PLANAR,
59 reader->pixel_width(), reader->pixel_height());
61 reader->set_buffer(buffer);
64 FacesClassifier *classifier =
new FacesClassifier(cascade_file, reader->pixel_width(),
65 reader->pixel_height());
68 classifier->set_src_buffer(buffer, reader->pixel_width(), reader->pixel_height());
69 std::list< ROI > *rois = classifier->classify();
71 FilterROIDraw *roi_draw =
new FilterROIDraw();
72 for (std::list< ROI >::iterator i = rois->begin(); i != rois->end(); ++i) {
73 printf(
"ROI: start (%u, %u) extent %u x %u\n", (*i).start.x, (*i).start.y,
74 (*i).width, (*i).height);
76 roi_draw->set_dst_buffer(buffer, &(*i));
80 ImageDisplay *display =
new ImageDisplay(reader->pixel_width(), reader->pixel_height());
81 display->show(buffer);
83 display->loop_until_quit();
96 const char *cascade_file = argp->
arg(
"h" );
98 Camera* camera = NULL;
101 camera = CameraFactory::instance( argp->
arg(
"c" ) );
107 printf(
"Failed to open camera.\n" );
112 printf(
"successfully opened camera: w=%d h=%d\n",
113 camera->pixel_width(), camera->pixel_height() );
116 unsigned int ttc_recognition = tt->add_class(
"Face recognition" );
117 unsigned int loop_count = 0;
120 IplImage* image = cvCreateImage( cvSize( camera->pixel_width(),
121 camera->pixel_height() ),
124 IplImage* scaled_image = cvCreateImage( cvSize( camera->pixel_width() / 2,
125 camera->pixel_height() / 2 ),
128 FacesClassifier *classifier =
new FacesClassifier( cascade_file,
129 camera->pixel_width(),
130 camera->pixel_height(),
134 CV_HAAR_DO_CANNY_PRUNING );
136 unsigned char* display_buffer = (
unsigned char*) malloc( camera->buffer_size() );
138 ImageDisplay* display =
new ImageDisplay( camera->pixel_width(),
139 camera->pixel_height(),
140 "QA Faces Classifier" );
142 Drawer* drawer =
new Drawer();
143 drawer->set_buffer( display_buffer,
144 camera->pixel_width(),
145 camera->pixel_height() );
147 SDL_Event redraw_event;
148 redraw_event.type = SDL_KEYUP;
149 redraw_event.key.keysym.sym = SDLK_SPACE;
151 SDL_PushEvent( &redraw_event );
157 if ( SDL_WaitEvent( &event ) )
159 switch ( event.type )
166 if ( event.key.keysym.sym == SDLK_SPACE )
170 if ( camera->buffer() != NULL )
172 IplImageAdapter::convert_image_bgr( camera->buffer(), image );
173 cvResize( image, scaled_image, CV_INTER_LINEAR );
174 memcpy( display_buffer, camera->buffer(), camera->buffer_size() );
176 tt->ping_start( ttc_recognition );
177 std::list< ROI > *rois = classifier->classify();
178 tt->ping_end( ttc_recognition );
180 camera->dispose_buffer();
183 for ( std::list< ROI >::reverse_iterator i = rois->rbegin();
187 if ( first ) { drawer->set_color( 127, 70, 200 ); }
188 drawer->draw_rectangle( 2 * i->start.x, 2 * i->start.y, 2 * i->width, 2 * i->height );
189 if ( first ) { drawer->set_color( 30, 30, 30 ); first =
false; }
192 if ( ++loop_count % 15 == 0 ) { tt->print_to_stdout(); }
194 display->show( display_buffer );
197 SDL_PushEvent( &redraw_event );
200 else if ( event.key.keysym.sym == SDLK_ESCAPE )
216 free( display_buffer );
217 cvReleaseImage( &image );
218 cvReleaseImage( &scaled_image );
224 printf(
"Usage: %s -h <Haar cascade file> -f <Image file as JPEG>\n", argv[0]);
225 printf(
" or %s -h <Haar cascade file> -c <Camera argument string>\n", argv[0]);
const char * arg(const char *argn)
Get argument value.
Fawkes library namespace.
Parse command line arguments.
Base class for exceptions in Fawkes.
bool has_arg(const char *argn)
Check if argument has been supplied.