Home | History | Annotate | Download | only in traincascade
      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