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()进行数据训练。

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

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/linmengran/p/6632851.html
Copyright © 2011-2022 走看看