Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / traincascade / cascadeclassifier.h
diff --git a/apps/traincascade/cascadeclassifier.h b/apps/traincascade/cascadeclassifier.h
new file mode 100755 (executable)
index 0000000..78d476f
--- /dev/null
@@ -0,0 +1,122 @@
+#ifndef _OPENCV_CASCADECLASSIFIER_H_
+#define _OPENCV_CASCADECLASSIFIER_H_
+
+#include <ctime>
+#include "features.h"
+#include "haarfeatures.h"
+#include "lbpfeatures.h"
+#include "boost.h"
+#include "cv.h"
+#include "cxcore.h"
+
+#define CC_CASCADE_FILENAME "cascade.xml"
+#define CC_PARAMS_FILENAME "params.xml"
+
+#define CC_CASCADE_PARAMS "cascadeParams"
+#define CC_STAGE_TYPE "stageType"
+#define CC_FEATURE_TYPE "featureType"
+#define CC_HEIGHT "height"
+#define CC_WIDTH  "width"
+
+#define CC_STAGE_NUM    "stageNum"
+#define CC_STAGES       "stages"
+#define CC_STAGE_PARAMS "stageParams"
+
+#define CC_BOOST            "BOOST"
+#define CC_BOOST_TYPE       "boostType"
+#define CC_DISCRETE_BOOST   "DAB"
+#define CC_REAL_BOOST       "RAB"
+#define CC_LOGIT_BOOST      "LB"
+#define CC_GENTLE_BOOST     "GAB"
+#define CC_MINHITRATE       "minHitRate"
+#define CC_MAXFALSEALARM    "maxFalseAlarm"
+#define CC_TRIM_RATE        "weightTrimRate"
+#define CC_MAX_DEPTH        "maxDepth"
+#define CC_WEAK_COUNT       "maxWeakCount"
+#define CC_STAGE_THRESHOLD  "stageThreshold"
+#define CC_WEAK_CLASSIFIERS "weakClassifiers"
+#define CC_INTERNAL_NODES   "internalNodes"
+#define CC_LEAF_VALUES      "leafValues"
+
+#define CC_FEATURES       FEATURES
+#define CC_FEATURE_PARAMS "featureParams"
+#define CC_MAX_CAT_COUNT  "maxCatCount"
+
+#define CC_HAAR        "HAAR"
+#define CC_MODE        "mode"
+#define CC_MODE_BASIC  "BASIC"
+#define CC_MODE_CORE   "CORE"
+#define CC_MODE_ALL    "ALL"
+#define CC_RECTS       "rects"
+#define CC_TILTED      "tilted"
+
+#define CC_LBP  "LBP"
+#define CC_RECT "rect"
+
+#ifdef _WIN32
+#define TIME( arg ) (((double) clock()) / CLOCKS_PER_SEC)
+#else
+#define TIME( arg ) (time( arg ))
+#endif
+
+class CvCascadeParams : public CvParams
+{
+public:
+    enum { BOOST = 0 };
+    static const int defaultStageType = BOOST;
+    static const int defaultFeatureType = CvFeatureParams::HAAR;
+
+    CvCascadeParams();
+    CvCascadeParams( int _stageType, int _featureType );
+    void write( FileStorage &fs ) const;
+    bool read( const FileNode &node );
+
+    void printDefaults() const;
+    void printAttrs() const;    
+    bool scanAttr( const String prmName, const String val );
+
+    int stageType;
+    int featureType;
+    Size winSize;
+};
+
+class CvCascadeClassifier
+{
+public:
+    bool train( const String _cascadeDirName,
+                const String _posFilename,
+                const String _negFilename, 
+                int _numPos, int _numNeg, 
+                int _precalcValBufSize, int _precalcIdxBufSize,
+                int _numStages,
+                const CvCascadeParams& _cascadeParams,
+                const CvFeatureParams& _featureParams,
+                const CvCascadeBoostParams& _stageParams,
+                bool baseFormatSave = false );
+private:
+    int predict( int sampleIdx );
+    void save( const String cascadeDirName, bool baseFormat = false );
+    bool load( const String cascadeDirName );
+    bool updateTrainingSet( double& acceptanceRatio );
+    int fillPassedSamles( int first, int count, bool isPositive, int64& consumed );
+
+    void writeParams( FileStorage &fs ) const;
+    void writeStages( FileStorage &fs, const Mat& featureMap ) const;
+    void writeFeatures( FileStorage &fs, const Mat& featureMap ) const;
+    bool readParams( const FileNode &node );
+    bool readStages( const FileNode &node );
+    
+    void getUsedFeaturesIdxMap( Mat& featureMap );
+
+    CvCascadeParams cascadeParams;
+    Ptr<CvFeatureParams> featureParams;
+    Ptr<CvCascadeBoostParams> stageParams;
+
+    Ptr<CvFeatureEvaluator> featureEvaluator;    
+    vector< Ptr<CvCascadeBoost> > stageClassifiers;
+    CvCascadeImageReader imgReader;
+    int numStages, curNumSamples;
+    int numPos, numNeg;
+};
+
+#endif