Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / traincascade / traincascade.cpp
diff --git a/apps/traincascade/traincascade.cpp b/apps/traincascade/traincascade.cpp
new file mode 100755 (executable)
index 0000000..a4479ab
--- /dev/null
@@ -0,0 +1,106 @@
+#include "cv.h"
+#include "cascadeclassifier.h"
+
+int main( int argc, char* argv[] )
+{
+    CvCascadeClassifier classifier;
+    String cascadeDirName, vecName, bgName;
+    int numPos    = 2000;
+    int numNeg    = 1000;
+    int numStages = 20;
+    int precalcValBufSize = 256,
+        precalcIdxBufSize = 256;
+    bool baseFormatSave = false;
+    
+    CvCascadeParams cascadeParams;
+    CvCascadeBoostParams stageParams;
+    Ptr<CvFeatureParams> featureParams[] = { Ptr<CvFeatureParams>(new CvHaarFeatureParams),
+                                             Ptr<CvFeatureParams>(new CvLBPFeatureParams)
+                                           }; 
+    int fc = sizeof(featureParams)/sizeof(featureParams[0]);
+    if( argc == 1 )
+    {
+        cout << "Usage: " << argv[0] << endl;
+        cout << "  -data <cascade_dir_name>" << endl;
+        cout << "  -vec <vec_file_name>" << endl;
+        cout << "  -bg <background_file_name>" << endl;
+        cout << "  [-numPos <number_of_positive_samples = " << numPos << ">]" << endl;
+        cout << "  [-numNeg <number_of_negative_samples = " << numNeg << ">]" << endl;
+        cout << "  [-numStages <number_of_stages = " << numStages << ">]" << endl;
+        cout << "  [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = " << precalcValBufSize << ">]" << endl;
+        cout << "  [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = " << precalcIdxBufSize << ">]" << endl;
+        cout << "  [-baseFormatSave]" << endl;
+        cascadeParams.printDefaults();
+        stageParams.printDefaults();
+        for( int fi = 0; fi < fc; fi++ )
+            featureParams[fi]->printDefaults();
+        return 0;
+    }
+
+    for( int i = 1; i < argc; i++ )
+    {
+        bool set = false;
+        if( !strcmp( argv[i], "-data" ) )
+        {
+            cascadeDirName = argv[++i];
+        }
+        else if( !strcmp( argv[i], "-vec" ) )
+        {
+            vecName = argv[++i];
+        }
+        else if( !strcmp( argv[i], "-bg" ) )
+        {
+            bgName = argv[++i];
+        }
+        else if( !strcmp( argv[i], "-numPos" ) )
+        {
+            numPos = atoi( argv[++i] );
+        }
+        else if( !strcmp( argv[i], "-numNeg" ) )
+        {
+            numNeg = atoi( argv[++i] );
+        }
+        else if( !strcmp( argv[i], "-numStages" ) )
+        {
+            numStages = atoi( argv[++i] );
+        }
+        else if( !strcmp( argv[i], "-precalcValBufSize" ) )
+        {
+            precalcValBufSize = atoi( argv[++i] );
+        }
+        else if( !strcmp( argv[i], "-precalcIdxBufSize" ) )
+        {
+            precalcIdxBufSize = atoi( argv[++i] );
+        }
+        else if( !strcmp( argv[i], "-baseFormatSave" ) )
+        {
+            baseFormatSave = true;
+        }
+        else if ( cascadeParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }
+        else if ( stageParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }
+        else if ( !set )
+        {
+            for( int fi = 0; fi < fc; fi++ )
+            {
+                set = featureParams[fi]->scanAttr(argv[i], argv[i+1]);          
+                if ( !set )
+                {
+                    i++;
+                    break;
+                }
+            }
+        }
+    }
+  
+    classifier.train( cascadeDirName,
+                      vecName,
+                      bgName, 
+                      numPos, numNeg, 
+                      precalcValBufSize, precalcIdxBufSize,
+                      numStages,
+                      cascadeParams,
+                      *featureParams[cascadeParams.featureType],
+                      stageParams,
+                      baseFormatSave );
+    return 0;
+}