⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cascadefileparser.yy

📁 tracciatore di mani con webcam
💻 YY
字号:
/**  * cubicles  *  * This is an implementation of the Viola-Jones object detection   * method and some extensions.  The code is mostly platform-  * independent and uses only standard C and C++ libraries.  It  * can make use of MPI for parallel training and a few Windows  * MFC functions for classifier display.  *  * Mathias Kolsch, matz@cs.ucsb.edu  *  * $Id: CascadeFileParser.yy,v 1.5 2004/10/09 17:04:53 matz Exp $**/// CascadeFileParser takes care of parsing integral features,// weak classifiers, strong classifiers, and classifier cascades// from file input.  Compile with bison.////////////////////////////////////////////////////////////////////////// By downloading, copying, installing or using the software you // agree to this license.  If you do not agree to this license, // do not download, install, copy or use the software.//// Copyright (C) 2004, Mathias Kolsch, all rights reserved.// Third party copyrights are property of their respective owners.//// Redistribution and use in binary form, with or without // modification, is permitted for non-commercial purposes only.// Redistribution in source, with or without modification, is // prohibited without prior written permission.// If granted in writing in another document, personal use and // modification are permitted provided that the following two// conditions are met://// 1.Any modification of source code must retain the above //   copyright notice, this list of conditions and the following //   disclaimer.//// 2.Redistribution's in binary form must reproduce the above //   copyright notice, this list of conditions and the following //   disclaimer in the documentation and/or other materials provided//   with the distribution.//// This software is provided by the copyright holders and // contributors "as is" and any express or implied warranties, // including, but not limited to, the implied warranties of // merchantability and fitness for a particular purpose are // disclaimed.  In no event shall the copyright holder or // contributors be liable for any direct, indirect, incidental, // special, exemplary, or consequential damages (including, but not // limited to, procurement of substitute goods or services; loss of // use, data, or profits; or business interruption) however caused// and on any theory of liability, whether in contract, strict // liability, or tort (including negligence or otherwise) arising // in any way out of the use of this software, even if advised of // the possibility of such damage.//////////////////////////////////////////////////////////////////////%{#include "Cascade.h"#include "Classifiers.h"#include "IntegralFeatures.h"#include "Exceptions.h"//#include <stdio.h>// internal variables:bool parse_entire_cascade;int image_width, image_height;CStrongClassifier* curr_strong;CClassifierCascade* pCascade;CWeakClassifier* parsed_weak;int curr_line;int curr_branch;string yyIDstring;void nextline(void){  curr_line++;}void yyerror(const char *str)//void yyerror(YYLTYPE *llocp, const char *str){  char* buf = new char[strlen(str)+1024];  sprintf(buf, "parsing error (line %d): %s",          curr_line, str);  string safe(buf);  delete buf;  throw ITException(safe);//  printf("error: %s\n", str);}int yyparse(void);int yylex(void);  extern FILE* yyin;CClassifierCascade* parse_cascade(FILE* fp){  // init variables  pCascade = NULL;  curr_strong = NULL;  parsed_weak = NULL;  image_width = image_height = -1;  parse_entire_cascade = true;  curr_line = 1;  yyin = fp;  //  yyout = fopen("C:\\tmp\\dump.txt", "a+");  // parse the file!  int result = yyparse();  // fflush(yyout);  // fclose(yyout);  if (result) {    delete pCascade;    throw ITException("error parsing");  }  return pCascade;}%}%union {  int ival;  double fval;  char* sval;  bool bval;  CIntegralFeature* pIF;  CRect* pRect;  CWeakClassifier* pWC;  CClassifierCascade* pCasc;}//%error-verbose%start ROOT%token CLASSIFIER_CASCADE%token TYPE_SEQUENTIAL%token TYPE_FAN%token TYPE_TREE%token RATIO%token FPR%token DR%token SUCCESSFUL%token EXHAUSTED%token STRONG%token CLASSIFIER%token CLASSIFIERS%token UPCASE_STRONG%token WEAK%token NULL_ID%token THRESHOLD%token LEFT_RIGHT%token UP_DOWN%token LEFT_CENTER_RIGHT%token SEVEN_COLUMNS%token DIAG%token LEFT_RIGHT_SAME%token UP_DOWN_SAME%token LEFT_CENTER_RIGHT_SAME%token SEVEN_COLUMNS_SAME%token SEVEN_COLUMNS_SIMILAR%token DIAG_SAME%token DIAG_SIMILAR%token FOUR_BOXES%token FOUR_BOXES_SAME%token DOUBLEQUOTE%token COMMA%token X_BY%token SLASH%token DOT%token COLON%token OPEN_PAREN%token CLOSE_PAREN%token OPEN_BRACKET%token CLOSE_BRACKET%token ASTERIX%token LT%token GTEQ%token MINUS%token BRANCH%token BRANCHES%token COMMON%token <ival> INT_NUMBER%token <fval> FP_NUMBER%token <sval> NAME%type <pIF> integral_feature%type <pWC> weak_classifier%type <pRect> quadruple%type <bval> comparison_lt trainset_exhausted%type <pCasc> cascade%type <fval> fp_number%type <ival> strong_classifier_package_header strong_classifier_header;%%ROOT:  cascade {}| weak_classifier {};cascade:  cascade_header_p1    cascade_header_p2_sequential    strong_classifier_package  {  }| cascade_header_p1    cascade_header_p2_fan    branch_seq  {  }| cascade_header_p1    cascade_header_p2_tree  {  };cascade_header_p1:  CLASSIFIER_CASCADE DOUBLEQUOTE NAME DOUBLEQUOTE COMMA  {    if (!parse_entire_cascade) {      throw ITException("wrong parsing mode set");    }    pCascade = new CClassifierCascade();    pCascade->m_name = yyIDstring;//    pCascade->m_name = $3;    curr_branch = -1;  };cascade_header_p2_sequential:  TYPE_SEQUENTIAL COMMA INT_NUMBER X_BY INT_NUMBER COMMA    RATIO fp_number OPEN_PAREN FPR COLON fp_number COMMA    DR COLON fp_number COMMA trainset_exhausted CLOSE_PAREN  {    image_width = $3;    image_height = $5;    pCascade->m_template_width = $3;    pCascade->m_template_height = $5;    pCascade->m_image_area_ratio = $8;    pCascade->m_structure_type = CClassifierCascade::CASCADE_TYPE_SEQUENTIAL;    pCascade->m_total_false_positive_rate = $12;    pCascade->m_last_detection_rate = $16;    pCascade->m_trainset_exhausted = $18;  };cascade_header_p2_fan:  TYPE_FAN COMMA INT_NUMBER X_BY INT_NUMBER COMMA    RATIO fp_number OPEN_PAREN FPR COLON fp_number COMMA    DR COLON fp_number COMMA trainset_exhausted CLOSE_PAREN    INT_NUMBER BRANCHES DOT  {    image_width = $3;    image_height = $5;    pCascade->m_template_width = $3;    pCascade->m_template_height = $5;    pCascade->m_image_area_ratio = $8;    pCascade->m_structure_type = CClassifierCascade::CASCADE_TYPE_FAN;    pCascade->m_total_false_positive_rate = $12;    pCascade->m_last_detection_rate = $16;    pCascade->m_trainset_exhausted = $18;    int num_branches = $20;    pCascade->m_branch_classifiers.resize(num_branches);    pCascade->m_branch_names.resize(num_branches);    pCascade->m_branch_false_positive_rates.resize(num_branches);    pCascade->m_branch_detection_rates.resize(num_branches);    pCascade->m_branch_lyr_false_positive_rates.resize(num_branches);    pCascade->m_branch_lyr_detection_rates.resize(num_branches);  };cascade_header_p2_tree:  TYPE_TREE  {    pCascade->m_structure_type = CClassifierCascade::CASCADE_TYPE_TREE;    throw ITException("cascade type tree not supported yet");  };trainset_exhausted:  SUCCESSFUL { $$ = false; }| EXHAUSTED  { $$ = true; };branch_seq:  branch_header strong_classifier_package| branch_seq branch_header strong_classifier_package;branch_header:  COMMON BRANCH  {  }| BRANCH INT_NUMBER DOUBLEQUOTE NAME DOUBLEQUOTE    OPEN_PAREN FPR COLON fp_number COMMA DR COLON fp_number CLOSE_PAREN  {    curr_branch = $2;    if (curr_branch<0 || curr_branch>=(int)pCascade->m_branch_classifiers.size()) {      throw ITException("branch number out of range");    }    pCascade->m_branch_names[$2] = yyIDstring; // $4;    pCascade->m_branch_false_positive_rates[$2] = $9;    pCascade->m_branch_detection_rates[$2] = $13;  };strong_classifier_package:  strong_classifier_package_header    strong_classifier_seq  {    int declared_num_strong_clsf = $1;    if (declared_num_strong_clsf          !=pCascade->GetNumStrongClassifiers(curr_branch))    {      char buf[1024];      sprintf(buf, "instead of %d strong classifiers as declared, "                   "%d were found (branch %d)",              declared_num_strong_clsf,              pCascade->GetNumStrongClassifiers(curr_branch),              curr_branch);      throw ITException(buf);    }  };strong_classifier_package_header:  INT_NUMBER STRONG CLASSIFIERS DOT  {    $$ = $1;  };strong_classifier_seq:  strong_classifier_seq strong_classifier| strong_classifier;strong_classifier:  strong_classifier_header    weighted_weak_classifier_seq  {    int delared_num_weak = $1;    if (delared_num_weak!=curr_strong->GetNumWeakClassifiers()) {      char buf[1024];      sprintf(buf, "declared %d weak classifiers, found %d",              delared_num_weak, curr_strong->GetNumWeakClassifiers());      throw ITException(buf);    }  };strong_classifier_header:  UPCASE_STRONG CLASSIFIER INT_NUMBER OPEN_PAREN    FPR COLON fp_number COMMA DR COLON fp_number CLOSE_PAREN COLON    INT_NUMBER WEAK CLASSIFIERS COMMA THRESHOLD fp_number COLON  {    int declared_id = $3;    int branch_offset = 0;    if (curr_branch!=-1) {       branch_offset = pCascade->GetNumStrongClassifiers();    }    if (declared_id-branch_offset          !=pCascade->GetNumStrongClassifiers(curr_branch))    {      char buf[1024];      sprintf(buf, "expected strong classifier number %d, found number %d (branch %d)",              pCascade->GetNumStrongClassifiers(), $3, curr_branch);      throw ITException(buf);    }    curr_strong = &pCascade->AddStrongClassifier(curr_branch, $7, $11);    curr_strong->SetAlphasThreshold($19);    $$ = $14;  };weighted_weak_classifier_seq:  weighted_weak_classifier_seq weighted_weak_classifier| weighted_weak_classifier;weighted_weak_classifier:  fp_number ASTERIX weak_classifier  {    curr_strong->AddWeakClassifier($3, $1);    delete $3;  };weak_classifier:  OPEN_BRACKET integral_feature CLOSE_BRACKET    comparison_lt fp_number OPEN_PAREN fp_number CLOSE_PAREN  {    if (parse_entire_cascade) {      $$ = new CWeakClassifier($2, $4, $5, $7);    } else {      parsed_weak = new CWeakClassifier($2, $4, $5, $7);    }  };comparison_lt:  LT { $$ = true; }| GTEQ { $$ = false; };integral_feature:  NULL_ID { $$ = NULL; }|  LEFT_RIGHT INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CLeftRightIF(image_width, image_height,                          $2, $4, $6, $8, $10);  }|  UP_DOWN INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER  { $$ = new CUpDownIF(image_width, image_height,                       $2, $4, $6, $8, $10);  }|  LEFT_CENTER_RIGHT INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER SLASH INT_NUMBER COMMA INT_NUMBER  { $$ = new CLeftCenterRightIF(image_width, image_height,                                $2, $4, $6, $8, $10, $12);  }|  SEVEN_COLUMNS INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CSevenColumnsIF(image_width, image_height,                             $2, $4, $6, $8, $10, $12, $14, $16, $18, $20);  }|  DIAG INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CDiagIF(image_width, image_height,                     $2, $4, $6, $8, $10, $12);  }|  LEFT_RIGHT_SAME INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CLeftRightSameIF(image_width, image_height,                              $2, $4, $6, $8, $10);  }|  UP_DOWN_SAME INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER  { $$ = new CUpDownSameIF(image_width, image_height,                           $2, $4, $6, $8, $10);  }|  LEFT_CENTER_RIGHT_SAME INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER SLASH INT_NUMBER COMMA INT_NUMBER  { $$ = new CLeftCenterRightSameIF(image_width, image_height,                                    $2, $4, $6, $8, $10, $12);  }|  SEVEN_COLUMNS_SAME INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CSevenColumnsSameIF(image_width, image_height,                                 $2, $4,                                 $6, $8, $10, $12, $14, $16, $18, $20);  }|  SEVEN_COLUMNS_SIMILAR INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CSevenColumnsSimilarIF(image_width, image_height,                                    $2, $4,                                    $6, $8, $10, $12, $14, $16, $18, $20);  }|  DIAG_SAME INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CDiagSameIF(image_width, image_height,                         $2, $4, $6, $8, $10, $12);  }|  DIAG_SIMILAR INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY    INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER  { $$ = new CDiagSimilarIF(image_width, image_height,                            $2, $4, $6, $8, $10, $12);  }|  FOUR_BOXES quadruple COMMA quadruple COMMA    quadruple COMMA quadruple  {    $$ = new CFourBoxesIF(image_width, image_height,                          $2, $4, $6, $8);    delete $2;    delete $4;    delete $6;    delete $8;  }|  FOUR_BOXES_SAME quadruple COMMA quadruple COMMA    quadruple COMMA quadruple  {    $$ = new CFourBoxesSameIF(image_width, image_height,                              $2, $4, $6, $8);    delete $2;    delete $4;    delete $6;    delete $8;  };quadruple:  OPEN_PAREN INT_NUMBER COMMA INT_NUMBER COMMA    INT_NUMBER COMMA INT_NUMBER CLOSE_PAREN  { $$ = new CRect($2, $4, $6, $8); };fp_number:  FP_NUMBER { $$ = $1; }| INT_NUMBER { $$ = (double) $1; };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -