adaptmatch.cpp

来自「一个google的OCR源码」· C++ 代码 · 共 1,846 行 · 第 1/5 页

CPP
1,846
字号
**                          is better than the old rating for the class, it replaces the**                          old rating.  If this is the first rating for the class, the**                          class is added to the list of matched classes in Results.**                          If the new rating is better than the best so far, it**                          becomes the best so far.**                          Return: none**                          Exceptions: none**                          History: Tue Mar 12 18:19:29 1991, DSJ, Created.*/  FLOAT32 OldRating;  INT_CLASS_STRUCT* CharClass = NULL;  OldRating = Results->Ratings[ClassId];  if (Rating <= Results->BestRating + BadMatchPad && Rating < OldRating) {    Results->Ratings[ClassId] = Rating;    if (ClassId != NO_CLASS)      CharClass = ClassForClassId(PreTrainedTemplates, ClassId);    if (CharClass != NULL && NumIntConfigsIn(CharClass) == 32)      Results->Configs[ClassId] = ConfigId;    else      Results->Configs[ClassId] = ~0;    if (Rating < Results->BestRating) {      Results->BestRating = Rating;      Results->BestClass = ClassId;      Results->BestConfig = ConfigId;    }    /* if this is first rating for class, add to list of classes matched */    if (OldRating == WORST_POSSIBLE_RATING)      Results->Classes[Results->NumMatches++] = ClassId;  }}                                /* AddNewResult *//*---------------------------------------------------------------------------*/void AmbigClassifier(TBLOB *Blob,                     LINE_STATS *LineStats,                     INT_TEMPLATES Templates,                     UNICHAR_ID *Ambiguities,                     ADAPT_RESULTS *Results) {/* **                         Parameters: **                         Blob              blob to be classified**                          LineStats              statistics for text line Blob is in**                          Templates              built-in templates to classify against**                          Ambiguities              array of class id's to match against**                          Results              place to put match results**                          Globals:**                          AllProtosOn              mask that enables all protos**                          AllConfigsOn              mask that enables all configs**                          Operation: This routine is identical to CharNormClassifier()**                          except that it does no class pruning.  It simply matches**                          the unknown blob against the classes listed in**                          Ambiguities.**                          Return: none**                          Exceptions: none**                          History: Tue Mar 12 19:40:36 1991, DSJ, Created.*/  int NumFeatures;  INT_FEATURE_ARRAY IntFeatures;  CLASS_NORMALIZATION_ARRAY CharNormArray;  INT_RESULT_STRUCT IntResult;  CLASS_ID ClassId;  CLASS_INDEX ClassIndex;  AmbigClassifierCalls++;  NumFeatures = GetCharNormFeatures (Blob, LineStats,    Templates,    IntFeatures, CharNormArray,    &(Results->BlobLength));  if (NumFeatures <= 0)    return;  if (MatcherDebugLevel >= 2)    cprintf ("AM Matches =  ");  while (*Ambiguities >= 0) {    ClassId = *Ambiguities;    ClassIndex = IndexForClassId (Templates, ClassId);    SetCharNormMatch();    IntegerMatcher (ClassForClassId (Templates, ClassId),      AllProtosOn, AllConfigsOn,      Results->BlobLength, NumFeatures, IntFeatures,      CharNormArray[ClassIndex], &IntResult, NO_DEBUG);    if (MatcherDebugLevel >= 2)      cprintf ("%s-%-2d %2.0f  ", unicharset.id_to_unichar(ClassId),               IntResult.Config,               IntResult.Rating * 100.0);    AddNewResult (Results, ClassId, IntResult.Rating, IntResult.Config);    Ambiguities++;    NumAmbigClassesTried++;  }  if (MatcherDebugLevel >= 2)    cprintf ("\n");}                                /* AmbigClassifier *//*---------------------------------------------------------------------------*/// Factored-out calls to IntegerMatcher based on class pruner results.// Returns integer matcher results inside CLASS_PRUNER_RESULTS structure.void MasterMatcher(INT_TEMPLATES templates,                   inT16 num_features,                   INT_FEATURE_ARRAY features,                   CLASS_NORMALIZATION_ARRAY norm_factors,                   ADAPT_CLASS* classes,                   int debug,                   int num_classes,                   CLASS_PRUNER_RESULTS results,                   ADAPT_RESULTS* final_results) {  for (int c = 0; c < num_classes; c++) {    CLASS_ID class_id = results[c].Class;    INT_RESULT_STRUCT& int_result = results[c].IMResult;    CLASS_INDEX class_index = IndexForClassId(templates, class_id);    BIT_VECTOR protos = classes != NULL ? classes[class_index]->PermProtos                                        : AllProtosOn;    BIT_VECTOR configs = classes != NULL ? classes[class_index]->PermConfigs                                         : AllConfigsOn;    IntegerMatcher(ClassForClassId(templates, class_id),                   protos, configs, final_results->BlobLength,                   num_features, features, norm_factors[class_index],                   &int_result, NO_DEBUG);    // Compute class feature corrections.    double miss_penalty = tessedit_class_miss_scale *                          int_result.FeatureMisses;    if (MatcherDebugLevel >= 2 || display_ratings > 1) {      cprintf("%s-%-2d %2.1f(CP%2.1f, IM%2.1f + MP%2.1f)  ",              unicharset.id_to_unichar(class_id), int_result.Config,              (int_result.Rating + miss_penalty) * 100.0,              results[c].Rating * 100.0,              int_result.Rating * 100.0, miss_penalty * 100.0);      if (c % 4 == 3)        cprintf ("\n");    }    int_result.Rating += miss_penalty;    if (int_result.Rating > WORST_POSSIBLE_RATING)      int_result.Rating = WORST_POSSIBLE_RATING;    AddNewResult(final_results, class_id, int_result.Rating, int_result.Config);  }  if (MatcherDebugLevel >= 2 || display_ratings > 1)    cprintf("\n");}/*---------------------------------------------------------------------------*/UNICHAR_ID *BaselineClassifier(TBLOB *Blob,                               LINE_STATS *LineStats,                               ADAPT_TEMPLATES Templates,                               ADAPT_RESULTS *Results) {/* **                         Parameters: **                         Blob              blob to be classified**                          LineStats              statistics for text line Blob is in**                          Templates              current set of adapted templates**                          Results              place to put match results**                          Globals:**                          BaselineCutoffs              expected num features for each class**                          Operation: This routine extracts baseline normalized features**                          from the unknown character and matches them against the**                          specified set of templates.  The classes which match**                          are added to Results.**                          Return: Array of possible ambiguous chars that should be checked.**                          Exceptions: none**                          History: Tue Mar 12 19:38:03 1991, DSJ, Created.*/  int NumFeatures;  int NumClasses;  INT_FEATURE_ARRAY IntFeatures;  CLASS_NORMALIZATION_ARRAY CharNormArray;  CLASS_ID ClassId;  CLASS_INDEX ClassIndex;  BaselineClassifierCalls++;  NumFeatures = GetBaselineFeatures (Blob, LineStats,    Templates->Templates,    IntFeatures, CharNormArray,    &(Results->BlobLength));  if (NumFeatures <= 0)    return NULL;  NumClasses = ClassPruner (Templates->Templates, NumFeatures,    IntFeatures, CharNormArray,    BaselineCutoffs, Results->CPResults,    MatchDebugFlags);  NumBaselineClassesTried += NumClasses;  if (MatcherDebugLevel >= 2 || display_ratings > 1)    cprintf ("BL Matches =  ");  SetBaseLineMatch();  MasterMatcher(Templates->Templates, NumFeatures, IntFeatures, CharNormArray,                Templates->Class, MatchDebugFlags, NumClasses,                Results->CPResults, Results);  ClassId = Results->BestClass;  if (ClassId == NO_CLASS)    return (NULL);  /* this is a bug - maybe should return "" */  ClassIndex = IndexForClassId (Templates->Templates, ClassId);  return (Templates->Class[ClassIndex]->    Config[Results->BestConfig].Perm);}                                /* BaselineClassifier *//*---------------------------------------------------------------------------*/void CharNormClassifier(TBLOB *Blob,                        LINE_STATS *LineStats,                        INT_TEMPLATES Templates,                        ADAPT_RESULTS *Results) {/* **                         Parameters: **                         Blob              blob to be classified**                          LineStats              statistics for text line Blob is in**                          Templates              templates to classify unknown against**                          Results              place to put match results**                          Globals:**                          CharNormCutoffs              expected num features for each class**                          AllProtosOn              mask that enables all protos**                          AllConfigsOn              mask that enables all configs**                          Operation: This routine extracts character normalized features**                          from the unknown character and matches them against the**                          specified set of templates.  The classes which match**                          are added to Results.**                          Return: none**                          Exceptions: none**                          History: Tue Mar 12 16:02:52 1991, DSJ, Created.*/  int NumFeatures;  int NumClasses;  INT_FEATURE_ARRAY IntFeatures;  CLASS_NORMALIZATION_ARRAY CharNormArray;  CharNormClassifierCalls++;  NumFeatures = GetCharNormFeatures(Blob, LineStats,    Templates,    IntFeatures, CharNormArray,    &(Results->BlobLength));  if (NumFeatures <= 0)    return;  NumClasses = ClassPruner(Templates, NumFeatures,                           IntFeatures, CharNormArray,                           CharNormCutoffs, Results->CPResults,                           MatchDebugFlags);  if (tessedit_single_match && NumClasses > 1)    NumClasses = 1;  NumCharNormClassesTried += NumClasses;  if (MatcherDebugLevel >= 2 || display_ratings > 1)    cprintf("CN Matches =  ");  SetCharNormMatch();  MasterMatcher(Templates, NumFeatures, IntFeatures, CharNormArray,                NULL, MatchDebugFlags, NumClasses,                Results->CPResults, Results);}                                /* CharNormClassifier *//*---------------------------------------------------------------------------*/void ClassifyAsNoise(TBLOB *Blob,                     LINE_STATS *LineStats,                     ADAPT_RESULTS *Results) {/* **                         Parameters: **                         Blob              blob to be classified**                          LineStats              statistics for text line Blob is in**                          Results              results to add noise classification to**                          Globals:**                          NoiseBlobLength              avg. length of a noise blob**                          Operation: This routine computes a rating which reflects the**                          likelihood that the blob being classified is a noise**                          blob.  NOTE: assumes that the blob length has already been**                          computed and placed into Results.**                          Return: none**                          Exceptions: none**                          History: Tue Mar 12 18:36:52 1991, DSJ, Created.*/  register FLOAT32 Rating;  Rating = Results->BlobLength / NoiseBlobLength;  Rating *= Rating;  Rating /= 1.0 + Rating;  AddNewResult (Results, NO_CLASS, Rating, 0);}                                /* ClassifyAsNoise *//*---------------------------------------------------------------------------*/int CompareCurrentRatings(                     //CLASS_ID              *Class1,                          const void *arg1,                          const void *arg2) {  //CLASS_ID              *Class2)/* **                         Parameters: **                         Class1, Class2              classes whose ratings are to be compared**                          Globals:**                          CurrentRatings              contains actual ratings for each class**                          Operation: This routine gets the ratings for the 2 specified classes**                          from a global variable (CurrentRatings) and returns:**          -1 if Rating1 < Rating2**                          0 if Rating1 = Rating2**                          1 if Rating1 > Rating2**                          Return: Order of classes based on their ratings (see above).**                          Exceptions: none**                          History: Tue Mar 12 14:18:31 1991, DSJ, Created.*/  FLOAT32 Rating1, Rating2;  CLASS_ID *Class1 = (CLASS_ID *) arg1;  CLASS_ID *Class2 = (CLASS_ID *) arg2;  Rating1 = CurrentRatings[*Class1];  Rating2 = CurrentRatings[*Class2];  if (Rating1 < Rating2)    return (-1);  else if (Rating1 > Rating2)    return (1);  else    return (0);}                                /* CompareCurrentRatings *//*---------------------------------------------------------------------------*/LIST ConvertMatchesToChoices(ADAPT_RESULTS *Results) {/* **                         Parameters: **                         Results              adaptive matcher results to convert to choices**                          Globals: none**                          Operation: This routine create

⌨️ 快捷键说明

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