Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / traincascade / features.cpp
1 #include "features.h"
2 #include "cascadeclassifier.h"
3
4 float calcNormFactor( const Mat& sum, const Mat& sqSum )
5 {
6     CV_DbgAssert( sum.cols > 3 && sqSum.rows > 3 );
7     Rect normrect( 1, 1, sum.cols - 3, sum.rows - 3 );
8     size_t p0, p1, p2, p3;
9     CV_SUM_OFFSETS( p0, p1, p2, p3, normrect, sum.step1() )
10     double area = normrect.width * normrect.height;
11     const int *sp = (const int*)sum.data;
12     int valSum = sp[p0] - sp[p1] - sp[p2] + sp[p3];
13     const double *sqp = (const double *)sqSum.data;
14     double valSqSum = sqp[p0] - sqp[p1] - sqp[p2] + sqp[p3];
15     return (float) sqrt( (double) (area * valSqSum - (double)valSum * valSum) );
16 }
17
18 CvParams::CvParams() : name( "params" ) {}
19 void CvParams::printDefaults() const
20 { cout << "--" << name << "--" << endl; }
21 void CvParams::printAttrs() const {}
22 bool CvParams::scanAttr( const String prmName, const String val ) { return false; }
23
24
25 //---------------------------- FeatureParams --------------------------------------
26
27 CvFeatureParams::CvFeatureParams() : maxCatCount( 0 )
28 {
29     name = CC_FEATURE_PARAMS; 
30 }
31
32 void CvFeatureParams::init( const CvFeatureParams& fp )
33 {
34     maxCatCount = fp.maxCatCount;
35 }
36
37 void CvFeatureParams::write( FileStorage &fs ) const
38 {
39     fs << CC_MAX_CAT_COUNT << maxCatCount;
40 }
41
42 bool CvFeatureParams::read( const FileNode &node )
43 {
44     if ( node.empty() )
45         return false;
46     maxCatCount = node[CC_MAX_CAT_COUNT];
47     return maxCatCount >= 0;
48 }
49
50 Ptr<CvFeatureParams> CvFeatureParams::create( int featureType )
51 {
52     return featureType == HAAR ? Ptr<CvFeatureParams>(new CvHaarFeatureParams) :
53         featureType == LBP ? Ptr<CvFeatureParams>(new CvLBPFeatureParams) : Ptr<CvFeatureParams>();
54 }
55
56 //------------------------------------- FeatureEvaluator ---------------------------------------
57
58 void CvFeatureEvaluator::init(const CvFeatureParams *_featureParams,
59                               int _maxSampleCount, Size _winSize )
60 {
61     CV_Assert(_maxSampleCount > 0);
62     featureParams = (CvFeatureParams *)_featureParams;
63     winSize = _winSize;
64     numFeatures = 0;
65     cls.create( (int)_maxSampleCount, 1, CV_32FC1 );
66     generateFeatures();
67 }
68
69 void CvFeatureEvaluator::setImage(const Mat &img, uchar clsLabel, int idx)
70 {
71     CV_Assert(img.cols == winSize.width);
72     CV_Assert(img.rows == winSize.height);
73     CV_Assert(idx < cls.rows);
74     cls.ptr<float>(idx)[0] = clsLabel;
75 }
76
77 Ptr<CvFeatureEvaluator> CvFeatureEvaluator::create(int type)
78 {
79     return type == CvFeatureParams::HAAR ? Ptr<CvFeatureEvaluator>(new CvHaarEvaluator) :
80         type == CvFeatureParams::LBP ? Ptr<CvFeatureEvaluator>(new CvLBPEvaluator) : Ptr<CvFeatureEvaluator>();
81 }