Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/apps/traincascade/haarfeatures.h
16337 views
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
91