Update to 2.0.0 tree from current Fremantle build
[opencv] / apps / traincascade / traincascade.cpp
1 #include "cv.h"
2 #include "cascadeclassifier.h"
3
4 int main( int argc, char* argv[] )
5 {
6     CvCascadeClassifier classifier;
7     String cascadeDirName, vecName, bgName;
8     int numPos    = 2000;
9     int numNeg    = 1000;
10     int numStages = 20;
11     int precalcValBufSize = 256,
12         precalcIdxBufSize = 256;
13     bool baseFormatSave = false;
14     
15     CvCascadeParams cascadeParams;
16     CvCascadeBoostParams stageParams;
17     Ptr<CvFeatureParams> featureParams[] = { Ptr<CvFeatureParams>(new CvHaarFeatureParams),
18                                              Ptr<CvFeatureParams>(new CvLBPFeatureParams)
19                                            }; 
20     int fc = sizeof(featureParams)/sizeof(featureParams[0]);
21     if( argc == 1 )
22     {
23         cout << "Usage: " << argv[0] << endl;
24         cout << "  -data <cascade_dir_name>" << endl;
25         cout << "  -vec <vec_file_name>" << endl;
26         cout << "  -bg <background_file_name>" << endl;
27         cout << "  [-numPos <number_of_positive_samples = " << numPos << ">]" << endl;
28         cout << "  [-numNeg <number_of_negative_samples = " << numNeg << ">]" << endl;
29         cout << "  [-numStages <number_of_stages = " << numStages << ">]" << endl;
30         cout << "  [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = " << precalcValBufSize << ">]" << endl;
31         cout << "  [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = " << precalcIdxBufSize << ">]" << endl;
32         cout << "  [-baseFormatSave]" << endl;
33         cascadeParams.printDefaults();
34         stageParams.printDefaults();
35         for( int fi = 0; fi < fc; fi++ )
36             featureParams[fi]->printDefaults();
37         return 0;
38     }
39
40     for( int i = 1; i < argc; i++ )
41     {
42         bool set = false;
43         if( !strcmp( argv[i], "-data" ) )
44         {
45             cascadeDirName = argv[++i];
46         }
47         else if( !strcmp( argv[i], "-vec" ) )
48         {
49             vecName = argv[++i];
50         }
51         else if( !strcmp( argv[i], "-bg" ) )
52         {
53             bgName = argv[++i];
54         }
55         else if( !strcmp( argv[i], "-numPos" ) )
56         {
57             numPos = atoi( argv[++i] );
58         }
59         else if( !strcmp( argv[i], "-numNeg" ) )
60         {
61             numNeg = atoi( argv[++i] );
62         }
63         else if( !strcmp( argv[i], "-numStages" ) )
64         {
65             numStages = atoi( argv[++i] );
66         }
67         else if( !strcmp( argv[i], "-precalcValBufSize" ) )
68         {
69             precalcValBufSize = atoi( argv[++i] );
70         }
71         else if( !strcmp( argv[i], "-precalcIdxBufSize" ) )
72         {
73             precalcIdxBufSize = atoi( argv[++i] );
74         }
75         else if( !strcmp( argv[i], "-baseFormatSave" ) )
76         {
77             baseFormatSave = true;
78         }
79         else if ( cascadeParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }
80         else if ( stageParams.scanAttr( argv[i], argv[i+1] ) ) { i++; }
81         else if ( !set )
82         {
83             for( int fi = 0; fi < fc; fi++ )
84             {
85                 set = featureParams[fi]->scanAttr(argv[i], argv[i+1]);          
86                 if ( !set )
87                 {
88                     i++;
89                     break;
90                 }
91             }
92         }
93     }
94   
95     classifier.train( cascadeDirName,
96                       vecName,
97                       bgName, 
98                       numPos, numNeg, 
99                       precalcValBufSize, precalcIdxBufSize,
100                       numStages,
101                       cascadeParams,
102                       *featureParams[cascadeParams.featureType],
103                       stageParams,
104                       baseFormatSave );
105     return 0;
106 }