faces.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <classifiers/faces.h>
00025
00026 #include <core/exception.h>
00027 #include <core/exceptions/software.h>
00028 #include <fvutils/color/colorspaces.h>
00029 #include <fvutils/color/conversions.h>
00030 #include <fvutils/adapters/iplimage.h>
00031
00032 #include <cstddef>
00033 #include <opencv/cv.h>
00034
00035 namespace firevision {
00036 #if 0
00037 }
00038 #endif
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 FacesClassifier::FacesClassifier(const char *haarcascade_file,
00065 unsigned int pixel_width, unsigned int pixel_height,
00066 IplImage *image,
00067 float haar_scale_factor, int min_neighbours, int flags)
00068 : Classifier("FacesClassifier")
00069 {
00070 __haar_scale_factor = haar_scale_factor;
00071 __min_neighbours = min_neighbours;
00072 __flags = flags;
00073
00074 __cascade = (CvHaarClassifierCascade *) cvLoad(haarcascade_file);
00075 if ( ! __cascade ) {
00076 throw fawkes::Exception("Could not load Haar casca via OpenCV");
00077 }
00078
00079 __storage = cvCreateMemStorage(0);
00080 if ( ! __storage ) {
00081 cvReleaseHaarClassifierCascade(&__cascade);
00082 throw fawkes::Exception("Could not initialize OpenCV memory");
00083 }
00084
00085 if ( image ) {
00086 __image = image;
00087 __own_image = false;
00088 } else {
00089 __image = cvCreateImage(cvSize(pixel_width, pixel_height), IPL_DEPTH_8U, 3);
00090 __own_image = true;
00091 }
00092 }
00093
00094
00095
00096 FacesClassifier::~FacesClassifier()
00097 {
00098 cvReleaseHaarClassifierCascade(&__cascade);
00099 cvReleaseMemStorage(&__storage);
00100 if ( __own_image ) {
00101 cvReleaseImage(&__image);
00102 }
00103 }
00104
00105
00106 std::list< ROI > *
00107 FacesClassifier::classify()
00108 {
00109 std::list< ROI > *rv = new std::list< ROI >();
00110
00111 if ( __own_image ) {
00112 IplImageAdapter::convert_image_bgr(_src, __image);
00113 }
00114
00115 CvSeq *face_seq = cvHaarDetectObjects(__image, __cascade, __storage,
00116 __haar_scale_factor, __min_neighbours, __flags);
00117
00118 for ( int i = 0; i < face_seq->total; ++i) {
00119 CvAvgComp el = *(CvAvgComp*)cvGetSeqElem(face_seq, i);
00120 ROI r(el.rect.x, el.rect.y, el.rect.width, el.rect.height, _width, _height);
00121 r.num_hint_points = el.rect.width * el.rect.height;
00122 rv->push_back(r);
00123 }
00124
00125
00126 rv->sort();
00127
00128 return rv;
00129 }
00130
00131 }