// Extracts features from the given blob and saves them in the tr_file_data_ // member variable. // fontname: Name of font that this blob was printed in. // cn_denorm: Character normalization transformation to apply to the blob. // fx_info: Character normalization parameters computed with cn_denorm. // blob_text: Ground truth text for the blob. void Classify::LearnBlob(const STRING& fontname, TBLOB* blob, const DENORM& cn_denorm, const INT_FX_RESULT_STRUCT& fx_info, const char* blob_text) { CHAR_DESC CharDesc = NewCharDescription(feature_defs_); CharDesc->FeatureSets[0] = ExtractMicros(blob, cn_denorm); CharDesc->FeatureSets[1] = ExtractCharNormFeatures(fx_info); CharDesc->FeatureSets[2] = ExtractIntCNFeatures(*blob, fx_info); CharDesc->FeatureSets[3] = ExtractIntGeoFeatures(*blob, fx_info); if (ValidCharDescription(feature_defs_, CharDesc)) { // Label the features with a class name and font name. tr_file_data_ += "\n"; tr_file_data_ += fontname; tr_file_data_ += " "; tr_file_data_ += blob_text; tr_file_data_ += "\n"; // write micro-features to file and clean up WriteCharDescription(feature_defs_, CharDesc, &tr_file_data_); } else { tprintf("Blob learned was invalid!\n"); } FreeCharDescription(CharDesc); } // LearnBlob
/*---------------------------------------------------------------------------*/ CHAR_DESC ReadCharDescription(FILE *File) { /* ** Parameters: ** File open text file to read character description from ** Globals: none ** Operation: Read a character description from File, and return ** a data structure containing this information. The data ** is formatted as follows: ** NumberOfSets ** ShortNameForSet1 Set1 ** ShortNameForSet2 Set2 ** ... ** Return: Character description read from File. ** Exceptions: ILLEGAL_NUM_SETS ** History: Wed May 23 17:32:48 1990, DSJ, Created. */ int NumSetsToRead; char ShortName[FEAT_NAME_SIZE]; CHAR_DESC CharDesc; int Type; if (fscanf (File, "%d", &NumSetsToRead) != 1 || NumSetsToRead < 0 || NumSetsToRead > NumFeaturesDefined ()) DoError (ILLEGAL_NUM_SETS, "Illegal number of feature sets"); CharDesc = NewCharDescription (); for (; NumSetsToRead > 0; NumSetsToRead--) { fscanf (File, "%s", ShortName); Type = ShortNameToFeatureType (ShortName); FeaturesOfType (CharDesc, Type) = ReadFeatureSet (File, DefinitionOf (Type)); } return (CharDesc); } // ReadCharDescription
/** * Read a character description from File, and return * a data structure containing this information. The data * is formatted as follows: * @verbatim NumberOfSets ShortNameForSet1 Set1 ShortNameForSet2 Set2 ... @endverbatim * * Globals: * - none * * @param FeatureDefs definitions of feature types/extractors * @param File open text file to read character description from * @return Character description read from File. * @note Exceptions: * - ILLEGAL_NUM_SETS * @note History: Wed May 23 17:32:48 1990, DSJ, Created. */ CHAR_DESC ReadCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, FILE *File) { int NumSetsToRead; char ShortName[FEAT_NAME_SIZE]; CHAR_DESC CharDesc; int Type; if (fscanf (File, "%d", &NumSetsToRead) != 1 || NumSetsToRead < 0 || NumSetsToRead > FeatureDefs.NumFeatureTypes) DoError (ILLEGAL_NUM_SETS, "Illegal number of feature sets"); CharDesc = NewCharDescription(FeatureDefs); for (; NumSetsToRead > 0; NumSetsToRead--) { fscanf (File, "%s", ShortName); Type = ShortNameToFeatureType(FeatureDefs, ShortName); CharDesc->FeatureSets[Type] = ReadFeatureSet (File, FeatureDefs.FeatureDesc[Type]); } return (CharDesc); } // ReadCharDescription