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