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