27 #include <cams/factory.h>
28 #include <classifiers/faces.h>
29 #include <filters/roidraw.h>
30 #include <fvutils/adapters/cvmatadapter.h>
31 #include <fvutils/color/colorspaces.h>
32 #include <fvutils/draw/drawer.h>
33 #include <fvutils/readers/jpeg.h>
34 #include <fvwidgets/image_display.h>
35 #include <utils/system/argparser.h>
36 #include <utils/time/tracker.h>
41 #include <opencv2/opencv.hpp>
46 main(
int argc,
char **argv)
53 const char *cascade_file = argp->
arg(
"h");
54 const char *image_file = argp->
arg(
"f");
56 JpegReader * reader =
new JpegReader(image_file);
57 unsigned char *buffer =
58 malloc_buffer(YUV422_PLANAR, reader->pixel_width(), reader->pixel_height());
60 reader->set_buffer(buffer);
63 FacesClassifier *classifier =
64 new FacesClassifier(cascade_file, reader->pixel_width(), reader->pixel_height());
66 classifier->set_src_buffer(buffer, reader->pixel_width(), reader->pixel_height());
67 std::list<ROI> *rois = classifier->classify();
69 FilterROIDraw *roi_draw =
new FilterROIDraw();
70 for (std::list<ROI>::iterator i = rois->begin(); i != rois->end(); ++i) {
71 printf(
"ROI: start (%u, %u) extent %u x %u\n",
77 roi_draw->set_dst_buffer(buffer, &(*i));
81 ImageDisplay *display =
new ImageDisplay(reader->pixel_width(), reader->pixel_height());
82 display->show(buffer);
84 display->loop_until_quit();
97 const char *cascade_file = argp->
arg(
"h");
99 Camera *camera = NULL;
101 camera = CameraFactory::instance(argp->
arg(
"c"));
105 printf(
"Failed to open camera.\n");
110 printf(
"successfully opened camera: w=%d h=%d\n",
111 camera->pixel_width(),
112 camera->pixel_height());
115 unsigned int ttc_recognition = tt->
add_class(
"Face recognition");
116 unsigned int loop_count = 0;
118 cv::Mat image = cv::Mat(cv::Size(camera->pixel_width(), camera->pixel_height()), CV_8UC1, 3);
120 cv::Mat scaled_image =
121 cv::Mat(cv::Size(camera->pixel_width() / 2, camera->pixel_height() / 2), CV_8UC1, 3);
123 FacesClassifier *classifier =
new FacesClassifier(cascade_file,
124 camera->pixel_width(),
125 camera->pixel_height(),
129 CV_HAAR_DO_CANNY_PRUNING);
131 unsigned char *display_buffer = (
unsigned char *)malloc(camera->buffer_size());
133 ImageDisplay *display =
134 new ImageDisplay(camera->pixel_width(), camera->pixel_height(),
"QA Faces Classifier");
136 Drawer *drawer =
new Drawer();
137 drawer->set_buffer(display_buffer, camera->pixel_width(), camera->pixel_height());
139 SDL_Event redraw_event;
140 redraw_event.type = SDL_KEYUP;
141 redraw_event.key.keysym.sym = SDLK_SPACE;
143 SDL_PushEvent(&redraw_event);
148 if (SDL_WaitEvent(&event)) {
149 switch (event.type) {
150 case SDL_QUIT: quit =
true;
break;
153 if (event.key.keysym.sym == SDLK_SPACE) {
156 if (camera->buffer() != NULL) {
157 CvMatAdapter::convert_image_bgr(camera->buffer(), image);
158 image.resize(scaled_image.rows, cv::INTER_LINEAR);
159 memcpy(display_buffer, camera->buffer(), camera->buffer_size());
162 std::list<ROI> *rois = classifier->classify();
165 camera->dispose_buffer();
168 for (std::list<ROI>::reverse_iterator i = rois->rbegin(); i != rois->rend(); ++i) {
170 drawer->set_color(127, 70, 200);
172 drawer->draw_rectangle(2 * i->start.x, 2 * i->start.y, 2 * i->width, 2 * i->height);
174 drawer->set_color(30, 30, 30);
179 if (++loop_count % 15 == 0) {
183 display->show(display_buffer);
186 SDL_PushEvent(&redraw_event);
189 else if (event.key.keysym.sym == SDLK_ESCAPE) {
205 free(display_buffer);
207 scaled_image.release();
212 printf(
"Usage: %s -h <Haar cascade file> -f <Image file as JPEG>\n", argv[0]);
213 printf(
" or %s -h <Haar cascade file> -c <Camera argument string>\n", argv[0]);
Parse command line arguments.
const char * arg(const char *argn)
Get argument value.
bool has_arg(const char *argn)
Check if argument has been supplied.
Base class for exceptions in Fawkes.
void print_to_stdout()
Print results to stdout.
unsigned int add_class(std::string name)
Add a new class.
void ping_end(unsigned int cls)
End of given class task.
void ping_start(unsigned int cls)
Start of given class task.
Fawkes library namespace.