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