FEATURE_SET Classify::ExtractPicoFeatures(TBLOB *Blob) { /* ** Parameters: ** Blob blob to extract pico-features from ** LineStats statistics on text row blob is in ** Globals: ** classify_norm_method normalization method currently specified ** Operation: Dummy for now. ** Return: Pico-features for Blob. ** Exceptions: none ** History: 9/4/90, DSJ, Created. */ LIST Outlines; LIST RemainingOutlines; MFOUTLINE Outline; FEATURE_SET FeatureSet; FLOAT32 XScale, YScale; FeatureSet = NewFeatureSet(MAX_PICO_FEATURES); Outlines = ConvertBlob(Blob); NormalizeOutlines(Outlines, &XScale, &YScale); RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node (RemainingOutlines); ConvertToPicoFeatures2(Outline, FeatureSet); } if (classify_norm_method == baseline) NormalizePicoX(FeatureSet); FreeOutlines(Outlines); return (FeatureSet); } /* ExtractPicoFeatures */
/*---------------------------------------------------------------------------*/ CHAR_FEATURES BlobMicroFeatures(TBLOB *Blob, const DENORM& denorm) { /* ** Parameters: ** Blob blob to extract micro-features from ** denorm control parameter to feature extractor ** Operation: ** This routine extracts micro-features from the specified ** blob and returns a list of the micro-features. All ** micro-features are normalized according to the specified ** line statistics. ** Return: List of micro-features extracted from the blob. ** Exceptions: none ** History: 7/21/89, DSJ, Created. */ MICROFEATURES MicroFeatures = NIL_LIST; FLOAT32 XScale, YScale; LIST Outlines; LIST RemainingOutlines; MFOUTLINE Outline; INT_FEATURE_ARRAY blfeatures; INT_FEATURE_ARRAY cnfeatures; INT_FX_RESULT_STRUCT results; if (Blob != NULL) { Outlines = ConvertBlob (Blob); if (!ExtractIntFeat(Blob, denorm, blfeatures, cnfeatures, &results)) return NULL; XScale = 0.2f / results.Ry; YScale = 0.2f / results.Rx; RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node (RemainingOutlines); CharNormalizeOutline (Outline, results.Xmean, results.Ymean, XScale, YScale); } RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node (RemainingOutlines); FindDirectionChanges(Outline, classify_min_slope, classify_max_slope); MarkDirectionChanges(Outline); SmearExtremities(Outline, XScale, YScale); MicroFeatures = ConvertToMicroFeatures (Outline, MicroFeatures); } FreeOutlines(Outlines); }
/** * Operation: Dummy for now. * * Globals: * - classify_norm_method normalization method currently specified * @param Blob blob to extract pico-features from * @return Pico-features for Blob. * @note Exceptions: none * @note History: 9/4/90, DSJ, Created. */ FEATURE_SET Classify::ExtractPicoFeatures(TBLOB * Blob) { LIST Outlines; LIST RemainingOutlines; MFOUTLINE Outline; FEATURE_SET FeatureSet; FLOAT32 XScale, YScale; FeatureSet = NewFeatureSet(MAX_PICO_FEATURES); Outlines = ConvertBlob(Blob); NormalizeOutlines(Outlines, &XScale, &YScale); RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node(RemainingOutlines); ConvertToPicoFeatures2(Outline, FeatureSet); } if (classify_norm_method == baseline) NormalizePicoX(FeatureSet); FreeOutlines(Outlines); return (FeatureSet); } /* ExtractPicoFeatures */
FEATURE_SET Classify::ExtractOutlineFeatures(TBLOB *Blob) { /* ** Parameters: ** Blob blob to extract pico-features from ** LineStats statistics on text row blob is in ** Globals: none ** Operation: Convert each segment in the outline to a feature ** and return the features. ** Return: Outline-features for Blob. ** Exceptions: none ** History: 11/13/90, DSJ, Created. ** 05/24/91, DSJ, Updated for either char or baseline normalize. */ LIST Outlines; LIST RemainingOutlines; MFOUTLINE Outline; FEATURE_SET FeatureSet; FLOAT32 XScale, YScale; FeatureSet = NewFeatureSet (MAX_OUTLINE_FEATURES); if (Blob == NULL) return (FeatureSet); Outlines = ConvertBlob (Blob); NormalizeOutlines(Outlines, &XScale, &YScale); RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node (RemainingOutlines); ConvertToOutlineFeatures(Outline, FeatureSet); } if (classify_norm_method == baseline) NormalizeOutlineX(FeatureSet); FreeOutlines(Outlines); return (FeatureSet); } /* ExtractOutlineFeatures */
/** * This routine extracts micro-features from the specified * blob and returns a list of the micro-features. All * micro-features are normalized according to the specified * line statistics. * @param Blob blob to extract micro-features from * @param cn_denorm control parameter to feature extractor * @return List of micro-features extracted from the blob. * @note Exceptions: none * @note History: 7/21/89, DSJ, Created. */ MICROFEATURES BlobMicroFeatures(TBLOB* Blob, const DENORM& cn_denorm) { MICROFEATURES MicroFeatures = NIL_LIST; LIST Outlines; LIST RemainingOutlines; MFOUTLINE Outline; if (Blob != nullptr) { Outlines = ConvertBlob(Blob); RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node (RemainingOutlines); CharNormalizeOutline(Outline, cn_denorm); } RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node(RemainingOutlines); FindDirectionChanges(Outline, classify_min_slope, classify_max_slope); MarkDirectionChanges(Outline); MicroFeatures = ConvertToMicroFeatures(Outline, MicroFeatures); } FreeOutlines(Outlines); }
/*---------------------------------------------------------------------------*/ FEATURE_SET ExtractCharNormFeatures(TBLOB *Blob, LINE_STATS *LineStats) { /* ** Parameters: ** Blob blob to extract char norm feature from ** LineStats statistics on text row blob is in ** Globals: none ** Operation: Compute a feature whose parameters describe how a ** character will be affected by the character normalization ** algorithm. The feature parameters are: ** y position of center of mass in baseline coordinates ** total length of outlines in baseline coordinates ** divided by a scale factor ** radii of gyration about the center of mass in ** baseline coordinates ** Return: Character normalization feature for Blob. ** Exceptions: none ** History: Wed May 23 18:06:38 1990, DSJ, Created. */ FEATURE_SET FeatureSet; FEATURE Feature; FLOAT32 Scale; FLOAT32 Baseline; LIST Outlines; INT_FEATURE_ARRAY blfeatures; INT_FEATURE_ARRAY cnfeatures; INT_FX_RESULT_STRUCT FXInfo; /* allocate the feature and feature set - note that there is always one and only one char normalization feature for any blob */ FeatureSet = NewFeatureSet (1); Feature = NewFeature (&CharNormDesc); AddFeature(FeatureSet, Feature); /* compute the normalization statistics for this blob */ Outlines = ConvertBlob (Blob); /*---------Debug--------------------------------------------------* OFile = fopen ("f:/ims/debug/nfOutline.logCPP", "r"); if (OFile == NULL) { OFile = Efopen ("f:/ims/debug/nfOutline.logCPP", "w"); WriteOutlines(OFile, Outlines); } else { fclose (OFile); OFile = Efopen ("f:/ims/debug/nfOutline.logCPP", "a"); } WriteOutlines(OFile, Outlines); fclose (OFile); *--------------------------------------------------------------------*/ ExtractIntFeat(Blob, blfeatures, cnfeatures, &FXInfo); Baseline = BaselineAt (LineStats, FXInfo.Xmean); Scale = ComputeScaleFactor (LineStats); Feature->Params[CharNormY] = (FXInfo.Ymean - Baseline) * Scale; Feature->Params[CharNormLength] = FXInfo.Length * Scale / LENGTH_COMPRESSION; Feature->Params[CharNormRx] = FXInfo.Rx * Scale; Feature->Params[CharNormRy] = FXInfo.Ry * Scale; /*---------Debug--------------------------------------------------* File = fopen ("f:/ims/debug/nfFeatSet.logCPP", "r"); if (File == NULL) { File = Efopen ("f:/ims/debug/nfFeatSet.logCPP", "w"); WriteFeatureSet(File, FeatureSet); } else { fclose (File); File = Efopen ("f:/ims/debug/nfFeatSet.logCPP", "a"); } WriteFeatureSet(File, FeatureSet); fclose (File); *--------------------------------------------------------------------*/ FreeOutlines(Outlines); return (FeatureSet); } /* ExtractCharNormFeatures */
/*---------------------------------------------------------------------------*/ FEATURE_SET ExtractPicoFeatures(TBLOB *Blob, LINE_STATS *LineStats) { /* ** Parameters: ** Blob blob to extract pico-features from ** LineStats statistics on text row blob is in ** Globals: ** classify_norm_method normalization method currently specified ** Operation: Dummy for now. ** Return: Pico-features for Blob. ** Exceptions: none ** History: 9/4/90, DSJ, Created. */ LIST Outlines; LIST RemainingOutlines; MFOUTLINE Outline; FEATURE_SET FeatureSet; FLOAT32 XScale, YScale; FeatureSet = NewFeatureSet (MAX_PICO_FEATURES); Outlines = ConvertBlob (Blob); NormalizeOutlines(Outlines, LineStats, &XScale, &YScale); RemainingOutlines = Outlines; iterate(RemainingOutlines) { Outline = (MFOUTLINE) first_node (RemainingOutlines); /*---------Debug--------------------------------------------------* OFile = fopen ("f:/ims/debug/pfOutline.logCPP", "r"); if (OFile == NULL) { OFile = Efopen ("f:/ims/debug/pfOutline.logCPP", "w"); WriteOutline(OFile, Outline); } else { fclose (OFile); OFile = Efopen ("f:/ims/debug/pfOutline.logCPP", "a"); } WriteOutline(OFile, Outline); fclose (OFile); *--------------------------------------------------------------------*/ ConvertToPicoFeatures2(Outline, FeatureSet); } if (classify_norm_method == baseline) NormalizePicoX(FeatureSet); /*---------Debug--------------------------------------------------* File = fopen ("f:/ims/debug/pfFeatSet.logCPP", "r"); if (File == NULL) { File = Efopen ("f:/ims/debug/pfFeatSet.logCPP", "w"); WriteFeatureSet(File, FeatureSet); } else { fclose (File); File = Efopen ("f:/ims/debug/pfFeatSet.logCPP", "a"); } WriteFeatureSet(File, FeatureSet); fclose (File); *--------------------------------------------------------------------*/ FreeOutlines(Outlines); return (FeatureSet); } /* ExtractPicoFeatures */