1 #ifndef _OPENCV_HAARFEATURES_H_ 2 #define _OPENCV_HAARFEATURES_H_ 3 4 #include "traincascade_features.h" 5 6 #define CV_HAAR_FEATURE_MAX 3 7 8 #define HFP_NAME "haarFeatureParams" 9 class CvHaarFeatureParams : public CvFeatureParams 10 { 11 public: 12 enum { BASIC = 0, CORE = 1, ALL = 2 }; 13 /* 0 - BASIC = Viola 14 * 1 - CORE = All upright 15 * 2 - ALL = All features */ 16 17 CvHaarFeatureParams(); 18 CvHaarFeatureParams( int _mode ); 19 20 virtual void init( const CvFeatureParams& fp ); 21 virtual void write( cv::FileStorage &fs ) const; 22 virtual bool read( const cv::FileNode &node ); 23 24 virtual void printDefaults() const; 25 virtual void printAttrs() const; 26 virtual bool scanAttr( const std::string prm, const std::string val); 27 28 int mode; 29 }; 30 31 class CvHaarEvaluator : public CvFeatureEvaluator 32 { 33 public: 34 virtual void init(const CvFeatureParams *_featureParams, 35 int _maxSampleCount, cv::Size _winSize ); 36 virtual void setImage(const cv::Mat& img, uchar clsLabel, int idx); 37 virtual float operator()(int featureIdx, int sampleIdx) const; 38 virtual void writeFeatures( cv::FileStorage &fs, const cv::Mat& featureMap ) const; 39 void writeFeature( cv::FileStorage &fs, int fi ) const; // for old file fornat 40 protected: 41 virtual void generateFeatures(); 42 43 class Feature 44 { 45 public: 46 Feature(); 47 Feature( int offset, bool _tilted, 48 int x0, int y0, int w0, int h0, float wt0, 49 int x1, int y1, int w1, int h1, float wt1, 50 int x2 = 0, int y2 = 0, int w2 = 0, int h2 = 0, float wt2 = 0.0F ); 51 float calc( const cv::Mat &sum, const cv::Mat &tilted, size_t y) const; 52 void write( cv::FileStorage &fs ) const; 53 54 bool tilted; 55 struct 56 { 57 cv::Rect r; 58 float weight; 59 } rect[CV_HAAR_FEATURE_MAX]; 60 61 struct 62 { 63 int p0, p1, p2, p3; 64 } fastRect[CV_HAAR_FEATURE_MAX]; 65 }; 66 67 std::vector<Feature> features; 68 cv::Mat sum; /* sum images (each row represents image) */ 69 cv::Mat tilted; /* tilted sum images (each row represents image) */ 70 cv::Mat normfactor; /* normalization factor */ 71 }; 72 73 inline float CvHaarEvaluator::operator()(int featureIdx, int sampleIdx) const 74 { 75 float nf = normfactor.at<float>(0, sampleIdx); 76 return !nf ? 0.0f : (features[featureIdx].calc( sum, tilted, sampleIdx)/nf); 77 } 78 79 inline float CvHaarEvaluator::Feature::calc( const cv::Mat &_sum, const cv::Mat &_tilted, size_t y) const 80 { 81 const int* img = tilted ? _tilted.ptr<int>((int)y) : _sum.ptr<int>((int)y); 82 float ret = rect[0].weight * (img[fastRect[0].p0] - img[fastRect[0].p1] - img[fastRect[0].p2] + img[fastRect[0].p3] ) + 83 rect[1].weight * (img[fastRect[1].p0] - img[fastRect[1].p1] - img[fastRect[1].p2] + img[fastRect[1].p3] ); 84 if( rect[2].weight != 0.0f ) 85 ret += rect[2].weight * (img[fastRect[2].p0] - img[fastRect[2].p1] - img[fastRect[2].p2] + img[fastRect[2].p3] ); 86 return ret; 87 } 88 89 #endif 90