intmatcher.cpp
来自「一个google的OCR源码」· C++ 代码 · 共 1,532 行 · 第 1/4 页
CPP
1,532 行
void IntegerMatcher(INT_CLASS ClassTemplate, BIT_VECTOR ProtoMask, BIT_VECTOR ConfigMask, uinT16 BlobLength, inT16 NumFeatures, INT_FEATURE_ARRAY Features, uinT8 NormalizationFactor, INT_RESULT Result, int Debug) {/* ** Parameters: ** ClassTemplate Prototypes & tables for a class ** BlobLength Length of unormalized blob ** NumFeatures Number of features in blob ** Features Array of features ** NormalizationFactor Fudge factor from blob ** normalization process ** Result Class rating & configuration: ** (0.0 -> 1.0), 0=good, 1=bad ** Debug Debugger flag: 1=debugger on ** Globals: ** LocalMatcherMultiplier Normalization factor multiplier ** IntThetaFudge Theta fudge factor used for ** evidence calculation ** Operation: ** IntegerMatcher returns the best configuration and rating ** for a single class. The class matched against is determined ** by the uniqueness of the ClassTemplate parameter. The ** best rating and its associated configuration are returned. ** Return: ** Exceptions: none ** History: Tue Feb 19 16:36:23 MST 1991, RWM, Created. */ static uinT8 FeatureEvidence[MAX_NUM_CONFIGS]; static int SumOfFeatureEvidence[MAX_NUM_CONFIGS]; static uinT8 ProtoEvidence[MAX_NUM_PROTOS][MAX_PROTO_INDEX]; int Feature; int BestMatch; if (MatchDebuggingOn (Debug)) cprintf ("Integer Matcher -------------------------------------------\n"); IMClearTables(ClassTemplate, SumOfFeatureEvidence, ProtoEvidence); Result->FeatureMisses = 0; for (Feature = 0; Feature < NumFeatures; Feature++) { int csum = IMUpdateTablesForFeature(ClassTemplate, ProtoMask, ConfigMask, Feature, &(Features[Feature]), FeatureEvidence, SumOfFeatureEvidence, ProtoEvidence, Debug); // Count features that were missed over all configs. if (csum == 0) Result->FeatureMisses++; }#ifndef GRAPHICS_DISABLED if (PrintProtoMatchesOn (Debug) || PrintMatchSummaryOn (Debug)) IMDebugFeatureProtoError(ClassTemplate, ProtoMask, ConfigMask, SumOfFeatureEvidence, ProtoEvidence, NumFeatures, Debug); if (DisplayProtoMatchesOn (Debug)) IMDisplayProtoDebugInfo(ClassTemplate, ProtoMask, ConfigMask, ProtoEvidence, Debug); if (DisplayFeatureMatchesOn (Debug)) IMDisplayFeatureDebugInfo(ClassTemplate, ProtoMask, ConfigMask, NumFeatures, Features, Debug);#endif IMUpdateSumOfProtoEvidences(ClassTemplate, ConfigMask, SumOfFeatureEvidence, ProtoEvidence, NumFeatures); IMNormalizeSumOfEvidences(ClassTemplate, SumOfFeatureEvidence, NumFeatures, NumFeatures); BestMatch = IMFindBestMatch(ClassTemplate, SumOfFeatureEvidence, BlobLength, NormalizationFactor, Result);#ifndef GRAPHICS_DISABLED if (PrintMatchSummaryOn (Debug)) IMDebugBestMatch(BestMatch, Result, BlobLength, NormalizationFactor); if (MatchDebuggingOn (Debug)) cprintf ("Match Complete --------------------------------------------\n");#endif}/*---------------------------------------------------------------------------*/int FindGoodProtos(INT_CLASS ClassTemplate, BIT_VECTOR ProtoMask, BIT_VECTOR ConfigMask, uinT16 BlobLength, inT16 NumFeatures, INT_FEATURE_ARRAY Features, PROTO_ID *ProtoArray, int Debug) {/* ** Parameters: ** ClassTemplate Prototypes & tables for a class ** ProtoMask AND Mask for proto word ** ConfigMask AND Mask for config word ** BlobLength Length of unormalized blob ** NumFeatures Number of features in blob ** Features Array of features ** ProtoArray Array of good protos ** Debug Debugger flag: 1=debugger on ** Globals: ** LocalMatcherMultiplier Normalization factor multiplier ** IntThetaFudge Theta fudge factor used for ** evidence calculation ** AdaptProtoThresh Threshold for good protos ** Operation: ** FindGoodProtos finds all protos whose normalized proto-evidence ** exceed AdaptProtoThresh. The list is ordered by increasing ** proto id number. ** Return: ** Number of good protos in ProtoArray. ** Exceptions: none ** History: Tue Mar 12 17:09:26 MST 1991, RWM, Created */ static uinT8 FeatureEvidence[MAX_NUM_CONFIGS]; static int SumOfFeatureEvidence[MAX_NUM_CONFIGS]; static uinT8 ProtoEvidence[MAX_NUM_PROTOS][MAX_PROTO_INDEX]; int Feature; register uinT8 *UINT8Pointer; register int ProtoIndex; int NumProtos; int NumGoodProtos; uinT16 ActualProtoNum; register int Temp; /* DEBUG opening heading */ if (MatchDebuggingOn (Debug)) cprintf ("Find Good Protos -------------------------------------------\n"); IMClearTables(ClassTemplate, SumOfFeatureEvidence, ProtoEvidence); for (Feature = 0; Feature < NumFeatures; Feature++) IMUpdateTablesForFeature (ClassTemplate, ProtoMask, ConfigMask, Feature, &(Features[Feature]), FeatureEvidence, SumOfFeatureEvidence, ProtoEvidence, Debug);#ifndef GRAPHICS_DISABLED if (PrintProtoMatchesOn (Debug) || PrintMatchSummaryOn (Debug)) IMDebugFeatureProtoError(ClassTemplate, ProtoMask, ConfigMask, SumOfFeatureEvidence, ProtoEvidence, NumFeatures, Debug);#endif /* Average Proto Evidences & Find Good Protos */ NumProtos = NumIntProtosIn (ClassTemplate); NumGoodProtos = 0; for (ActualProtoNum = 0; ActualProtoNum < NumProtos; ActualProtoNum++) { /* Compute Average for Actual Proto */ Temp = 0; UINT8Pointer = &(ProtoEvidence[ActualProtoNum][0]); for (ProtoIndex = LengthForProtoId (ClassTemplate, ActualProtoNum); ProtoIndex > 0; ProtoIndex--, UINT8Pointer++) Temp += *UINT8Pointer; Temp /= LengthForProtoId (ClassTemplate, ActualProtoNum); /* Find Good Protos */ if (Temp >= AdaptProtoThresh) { *ProtoArray = ActualProtoNum; ProtoArray++; NumGoodProtos++; } } if (MatchDebuggingOn (Debug)) cprintf ("Match Complete --------------------------------------------\n"); return NumGoodProtos;}/*---------------------------------------------------------------------------*/int FindBadFeatures(INT_CLASS ClassTemplate, BIT_VECTOR ProtoMask, BIT_VECTOR ConfigMask, uinT16 BlobLength, inT16 NumFeatures, INT_FEATURE_ARRAY Features, FEATURE_ID *FeatureArray, int Debug) {/* ** Parameters: ** ClassTemplate Prototypes & tables for a class ** ProtoMask AND Mask for proto word ** ConfigMask AND Mask for config word ** BlobLength Length of unormalized blob ** NumFeatures Number of features in blob ** Features Array of features ** FeatureArray Array of bad features ** Debug Debugger flag: 1=debugger on ** Globals: ** LocalMatcherMultiplier Normalization factor multiplier ** IntThetaFudge Theta fudge factor used for ** evidence calculation ** AdaptFeatureThresh Threshold for bad features ** Operation: ** FindBadFeatures finds all features whose maximum feature-evidence ** was less than AdaptFeatureThresh. The list is ordered by increasing ** feature number. ** Return: ** Number of bad features in FeatureArray. ** Exceptions: none ** History: Tue Mar 12 17:09:26 MST 1991, RWM, Created */ static uinT8 FeatureEvidence[MAX_NUM_CONFIGS]; static int SumOfFeatureEvidence[MAX_NUM_CONFIGS]; static uinT8 ProtoEvidence[MAX_NUM_PROTOS][MAX_PROTO_INDEX]; int Feature; register uinT8 *UINT8Pointer; register int ConfigNum; int NumConfigs; int NumBadFeatures; register int Temp; /* DEBUG opening heading */ if (MatchDebuggingOn (Debug)) cprintf ("Find Bad Features -------------------------------------------\n"); IMClearTables(ClassTemplate, SumOfFeatureEvidence, ProtoEvidence); NumBadFeatures = 0; NumConfigs = NumIntConfigsIn (ClassTemplate); for (Feature = 0; Feature < NumFeatures; Feature++) { IMUpdateTablesForFeature (ClassTemplate, ProtoMask, ConfigMask, Feature, &(Features[Feature]), FeatureEvidence, SumOfFeatureEvidence, ProtoEvidence, Debug); /* Find Best Evidence for Current Feature */ Temp = 0; UINT8Pointer = FeatureEvidence; for (ConfigNum = 0; ConfigNum < NumConfigs; ConfigNum++, UINT8Pointer++) if (*UINT8Pointer > Temp) Temp = *UINT8Pointer; /* Find Bad Features */ if (Temp < AdaptFeatureThresh) { *FeatureArray = Feature; FeatureArray++; NumBadFeatures++; } }#ifndef GRAPHICS_DISABLED if (PrintProtoMatchesOn (Debug) || PrintMatchSummaryOn (Debug)) IMDebugFeatureProtoError(ClassTemplate, ProtoMask, ConfigMask, SumOfFeatureEvidence, ProtoEvidence, NumFeatures, Debug);#endif if (MatchDebuggingOn (Debug)) cprintf ("Match Complete --------------------------------------------\n"); return NumBadFeatures;}/*---------------------------------------------------------------------------*/void InitIntegerMatcher() { int i; uinT32 IntSimilarity; double Similarity; double Evidence; double ScaleFactor; /* Set default mode of operation of IntegerMatcher */ SetCharNormMatch(); /* Initialize table for evidence to similarity lookup */ for (i = 0; i < SE_TABLE_SIZE; i++) { IntSimilarity = i << (27 - SE_TABLE_BITS); Similarity = ((double) IntSimilarity) / 65536.0 / 65536.0; Evidence = Similarity / SimilarityCenter; Evidence *= Evidence; Evidence += 1.0; Evidence = 1.0 / Evidence; Evidence *= 255.0; if (SEExponentialMultiplier > 0.0) { ScaleFactor = 1.0 - exp (-SEExponentialMultiplier) * exp (SEExponentialMultiplier * ((double) i / SE_TABLE_SIZE)); if (ScaleFactor > 1.0) ScaleFactor = 1.0; if (ScaleFactor < 0.0) ScaleFactor = 0.0; Evidence *= ScaleFactor; } SimilarityEvidenceTable[i] = (uinT8) (Evidence + 0.5); } /* Initialize evidence computation variables */ EvidenceTableMask = ((1 << EvidenceTableBits) - 1) << (9 - EvidenceTableBits); MultTruncShiftBits = (14 - IntEvidenceTruncBits); TableTruncShiftBits = (27 - SE_TABLE_BITS - (MultTruncShiftBits << 1)); EvidenceMultMask = ((1 << IntEvidenceTruncBits) - 1);}/*---------------------------------------------------------------------------*/void InitIntegerMatcherVars() { MakeClassPrunerThreshold(); MakeClassPrunerMultiplier(); MakeIntegerMatcherMultiplier(); MakeIntThetaFudge(); MakeCPCutoffStrength(); MakeEvidenceTableBits(); MakeIntEvidenceTruncBits(); MakeSEExponentialMultiplier(); MakeSimilarityCenter();}/*-------------------------------------------------------------------------*/void PrintIntMatcherStats(FILE *f) { fprintf (f, "protoword_lookups=%d, zero_protowords=%d, proto_shifts=%d\n", protoword_lookups, zero_protowords, proto_shifts); fprintf (f, "set_proto_bits=%d, config_shifts=%d, set_config_bits=%d\n", set_proto_bits, config_shifts, set_config_bits);}/*-------------------------------------------------------------------------*/void SetProtoThresh(FLOAT32 Threshold) { AdaptProtoThresh = (int) (255 * Threshold); if (AdaptProtoThresh < 0) AdaptProtoThresh = 0; if (AdaptProtoThresh > 255) AdaptProtoThresh = 255;}/*---------------------------------------------------------------------------*/void SetFeatureThresh(FLOAT32 Threshold) { AdaptFeatureThresh = (int) (255 * Threshold); if (AdaptFeatureThresh < 0) AdaptFeatureThresh = 0; if (AdaptFeatureThresh > 255) AdaptFeatureThresh = 255;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?