Blame view

3rdparty/opencv-4.5.4/apps/traincascade/traincascade_features.h 3.88 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  #ifndef _OPENCV_FEATURES_H_
  #define _OPENCV_FEATURES_H_
  
  #include "imagestorage.h"
  #include <stdio.h>
  
  #define FEATURES "features"
  
  #define CV_SUM_OFFSETS( p0, p1, p2, p3, rect, step )                      \
      /* (x, y) */                                                          \
      (p0) = (rect).x + (step) * (rect).y;                                  \
      /* (x + w, y) */                                                      \
      (p1) = (rect).x + (rect).width + (step) * (rect).y;                   \
      /* (x + w, y) */                                                      \
      (p2) = (rect).x + (step) * ((rect).y + (rect).height);                \
      /* (x + w, y + h) */                                                  \
      (p3) = (rect).x + (rect).width + (step) * ((rect).y + (rect).height);
  
  #define CV_TILTED_OFFSETS( p0, p1, p2, p3, rect, step )                   \
      /* (x, y) */                                                          \
      (p0) = (rect).x + (step) * (rect).y;                                  \
      /* (x - h, y + h) */                                                  \
      (p1) = (rect).x - (rect).height + (step) * ((rect).y + (rect).height);\
      /* (x + w, y + w) */                                                  \
      (p2) = (rect).x + (rect).width + (step) * ((rect).y + (rect).width);  \
      /* (x + w - h, y + w + h) */                                          \
      (p3) = (rect).x + (rect).width - (rect).height                        \
             + (step) * ((rect).y + (rect).width + (rect).height);
  
  float calcNormFactor( const cv::Mat& sum, const cv::Mat& sqSum );
  
  template<class Feature>
  void _writeFeatures( const std::vector<Feature> features, cv::FileStorage &fs, const cv::Mat& featureMap )
  {
      fs << FEATURES << "[";
      const cv::Mat_<int>& featureMap_ = (const cv::Mat_<int>&)featureMap;
      for ( int fi = 0; fi < featureMap.cols; fi++ )
          if ( featureMap_(0, fi) >= 0 )
          {
              fs << "{";
              features[fi].write( fs );
              fs << "}";
          }
      fs << "]";
  }
  
  class CvParams
  {
  public:
      CvParams();
      virtual ~CvParams() {}
      // from|to file
      virtual void write( cv::FileStorage &fs ) const = 0;
      virtual bool read( const cv::FileNode &node ) = 0;
      // from|to screen
      virtual void printDefaults() const;
      virtual void printAttrs() const;
      virtual bool scanAttr( const std::string prmName, const std::string val );
      std::string name;
  };
  
  class CvFeatureParams : public CvParams
  {
  public:
      enum { HAAR = 0, LBP = 1, HOG = 2 };
      CvFeatureParams();
      virtual void init( const CvFeatureParams& fp );
      virtual void write( cv::FileStorage &fs ) const;
      virtual bool read( const cv::FileNode &node );
      static cv::Ptr<CvFeatureParams> create( int featureType );
      int maxCatCount; // 0 in case of numerical features
      int featSize; // 1 in case of simple features (HAAR, LBP) and N_BINS(9)*N_CELLS(4) in case of Dalal's HOG features
  };
  
  class CvFeatureEvaluator
  {
  public:
      virtual ~CvFeatureEvaluator() {}
      virtual void init(const CvFeatureParams *_featureParams,
                        int _maxSampleCount, cv::Size _winSize );
      virtual void setImage(const cv::Mat& img, uchar clsLabel, int idx);
      virtual void writeFeatures( cv::FileStorage &fs, const cv::Mat& featureMap ) const = 0;
      virtual float operator()(int featureIdx, int sampleIdx) const = 0;
      static cv::Ptr<CvFeatureEvaluator> create(int type);
  
      int getNumFeatures() const { return numFeatures; }
      int getMaxCatCount() const { return featureParams->maxCatCount; }
      int getFeatureSize() const { return featureParams->featSize; }
      const cv::Mat& getCls() const { return cls; }
      float getCls(int si) const { return cls.at<float>(si, 0); }
  protected:
      virtual void generateFeatures() = 0;
  
      int npos, nneg;
      int numFeatures;
      cv::Size winSize;
      CvFeatureParams *featureParams;
      cv::Mat cls;
  };
  
  #endif