zoukankan      html  css  js  c++  java
  • opencv实例训练器traincascade源码学习-------traincascade.cpp解析

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

    这部分主要是主函数对输入的命令参数的解析,及默认值输出。

    主函数转向的线路图:

    main()-------->cascadeclassifier.h -------->调用这部分的函数   train()进行数据训练。

    初次尝试源码分析,多多指教!!

  • 相关阅读:
    layui 获取select下拉选项上自定义的属性
    TP中关联模型的使用
    安卓模仿直播中的闪动(放大缩小)的动画
    Android报错Multiple dex files define Lcom/ta/utdid2/c/a/c
    Date.parse()的坑
    Android应用加固的简单实现方案(二)
    Android应用加固的简单实现方案
    Android中ANR的触发机制-BroadcastReceiver篇
    Android中ANR的触发机制-Service篇
    Application中以标准模式启动Activity报错的原因分析
  • 原文地址:https://www.cnblogs.com/linmengran/p/6632851.html
Copyright © 2011-2022 走看看