1 #include "opencv2/core.hpp"
2 
3 #include "traincascade_features.h"
4 #include "cascadeclassifier.h"
5 
6 using namespace std;
7 using namespace cv;
8 
calcNormFactor(const Mat & sum,const Mat & sqSum)9 float calcNormFactor( const Mat& sum, const Mat& sqSum )
10 {
11     CV_DbgAssert( sum.cols > 3 && sqSum.rows > 3 );
12     Rect normrect( 1, 1, sum.cols - 3, sum.rows - 3 );
13     size_t p0, p1, p2, p3;
14     CV_SUM_OFFSETS( p0, p1, p2, p3, normrect, sum.step1() )
15     double area = normrect.width * normrect.height;
16     const int *sp = sum.ptr<int>();
17     int valSum = sp[p0] - sp[p1] - sp[p2] + sp[p3];
18     const double *sqp = sqSum.ptr<double>();
19     double valSqSum = sqp[p0] - sqp[p1] - sqp[p2] + sqp[p3];
20     return (float) sqrt( (double) (area * valSqSum - (double)valSum * valSum) );
21 }
22 
CvParams()23 CvParams::CvParams() : name( "params" ) {}
printDefaults() const24 void CvParams::printDefaults() const
25 { cout << "--" << name << "--" << endl; }
printAttrs() const26 void CvParams::printAttrs() const {}
scanAttr(const string,const string)27 bool CvParams::scanAttr( const string, const string ) { return false; }
28 
29 
30 //---------------------------- FeatureParams --------------------------------------
31 
CvFeatureParams()32 CvFeatureParams::CvFeatureParams() : maxCatCount( 0 ), featSize( 1 )
33 {
34     name = CC_FEATURE_PARAMS;
35 }
36 
init(const CvFeatureParams & fp)37 void CvFeatureParams::init( const CvFeatureParams& fp )
38 {
39     maxCatCount = fp.maxCatCount;
40     featSize = fp.featSize;
41 }
42 
write(FileStorage & fs) const43 void CvFeatureParams::write( FileStorage &fs ) const
44 {
45     fs << CC_MAX_CAT_COUNT << maxCatCount;
46     fs << CC_FEATURE_SIZE << featSize;
47 }
48 
read(const FileNode & node)49 bool CvFeatureParams::read( const FileNode &node )
50 {
51     if ( node.empty() )
52         return false;
53     maxCatCount = node[CC_MAX_CAT_COUNT];
54     featSize = node[CC_FEATURE_SIZE];
55     return ( maxCatCount >= 0 && featSize >= 1 );
56 }
57 
create(int featureType)58 Ptr<CvFeatureParams> CvFeatureParams::create( int featureType )
59 {
60     return featureType == HAAR ? Ptr<CvFeatureParams>(new CvHaarFeatureParams) :
61         featureType == LBP ? Ptr<CvFeatureParams>(new CvLBPFeatureParams) :
62         featureType == HOG ? Ptr<CvFeatureParams>(new CvHOGFeatureParams) :
63         Ptr<CvFeatureParams>();
64 }
65 
66 //------------------------------------- FeatureEvaluator ---------------------------------------
67 
init(const CvFeatureParams * _featureParams,int _maxSampleCount,Size _winSize)68 void CvFeatureEvaluator::init(const CvFeatureParams *_featureParams,
69                               int _maxSampleCount, Size _winSize )
70 {
71     CV_Assert(_maxSampleCount > 0);
72     featureParams = (CvFeatureParams *)_featureParams;
73     winSize = _winSize;
74     numFeatures = 0;
75     cls.create( (int)_maxSampleCount, 1, CV_32FC1 );
76     generateFeatures();
77 }
78 
setImage(const Mat & img,uchar clsLabel,int idx)79 void CvFeatureEvaluator::setImage(const Mat &img, uchar clsLabel, int idx)
80 {
81     CV_Assert(img.cols == winSize.width);
82     CV_Assert(img.rows == winSize.height);
83     CV_Assert(idx < cls.rows);
84     cls.ptr<float>(idx)[0] = clsLabel;
85 }
86 
create(int type)87 Ptr<CvFeatureEvaluator> CvFeatureEvaluator::create(int type)
88 {
89     return type == CvFeatureParams::HAAR ? Ptr<CvFeatureEvaluator>(new CvHaarEvaluator) :
90         type == CvFeatureParams::LBP ? Ptr<CvFeatureEvaluator>(new CvLBPEvaluator) :
91         type == CvFeatureParams::HOG ? Ptr<CvFeatureEvaluator>(new CvHOGEvaluator) :
92         Ptr<CvFeatureEvaluator>();
93 }
94