tesseract  4.00.00dev
ocrfeatures.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  ** Filename: features.c
3  ** Purpose: Generic definition of a feature.
4  ** Author: Dan Johnson
5  ** History: Mon May 21 10:49:04 1990, DSJ, Created.
6  **
7  ** (c) Copyright Hewlett-Packard Company, 1988.
8  ** Licensed under the Apache License, Version 2.0 (the "License");
9  ** you may not use this file except in compliance with the License.
10  ** You may obtain a copy of the License at
11  ** http://www.apache.org/licenses/LICENSE-2.0
12  ** Unless required by applicable law or agreed to in writing, software
13  ** distributed under the License is distributed on an "AS IS" BASIS,
14  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  ** See the License for the specific language governing permissions and
16  ** limitations under the License.
17  ******************************************************************************/
18 /*----------------------------------------------------------------------------
19  Include Files and Type Defines
20 ----------------------------------------------------------------------------*/
21 #include "ocrfeatures.h"
22 #include "emalloc.h"
23 #include "callcpp.h"
24 #include "danerror.h"
25 #include "scanutils.h"
26 
27 #include <assert.h>
28 #include <math.h>
29 
30 /*----------------------------------------------------------------------------
31  Public Code
32 ----------------------------------------------------------------------------*/
43 BOOL8 AddFeature(FEATURE_SET FeatureSet, FEATURE Feature) {
44  if (FeatureSet->NumFeatures >= FeatureSet->MaxNumFeatures) {
45  FreeFeature(Feature);
46  return FALSE;
47  }
48 
49  FeatureSet->Features[FeatureSet->NumFeatures++] = Feature;
50  return TRUE;
51 } /* AddFeature */
52 
59 void FreeFeature(FEATURE Feature) {
60  free(Feature);
61 } /* FreeFeature */
62 
71 void FreeFeatureSet(FEATURE_SET FeatureSet) {
72  int i;
73 
74  if (FeatureSet) {
75  for (i = 0; i < FeatureSet->NumFeatures; i++)
76  FreeFeature(FeatureSet->Features[i]);
77  free(FeatureSet);
78  }
79 } /* FreeFeatureSet */
80 
88 FEATURE NewFeature(const FEATURE_DESC_STRUCT* FeatureDesc) {
89  FEATURE Feature;
90 
91  Feature = (FEATURE) malloc(sizeof(FEATURE_STRUCT) +
92  (FeatureDesc->NumParams - 1) *
93  sizeof (FLOAT32));
94  Feature->Type = FeatureDesc;
95  return (Feature);
96 
97 } /* NewFeature */
98 
106 FEATURE_SET NewFeatureSet(int NumFeatures) {
107  FEATURE_SET FeatureSet;
108 
109  FeatureSet = (FEATURE_SET) Emalloc (sizeof (FEATURE_SET_STRUCT) +
110  (NumFeatures - 1) * sizeof (FEATURE));
111  FeatureSet->MaxNumFeatures = NumFeatures;
112  FeatureSet->NumFeatures = 0;
113  return (FeatureSet);
114 
115 } /* NewFeatureSet */
116 
131 FEATURE ReadFeature(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) {
132  FEATURE Feature;
133  int i;
134 
135  Feature = NewFeature (FeatureDesc);
136  for (i = 0; i < Feature->Type->NumParams; i++) {
137  if (tfscanf(File, "%f", &(Feature->Params[i])) != 1)
138  DoError (ILLEGAL_FEATURE_PARAM, "Illegal feature parameter spec");
139 #ifndef _WIN32
140  assert (!isnan(Feature->Params[i]));
141 #endif
142  }
143  return (Feature);
144 } /* ReadFeature */
145 
157 FEATURE_SET ReadFeatureSet(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) {
158  FEATURE_SET FeatureSet;
159  int NumFeatures;
160  int i;
161 
162  if (tfscanf(File, "%d", &NumFeatures) != 1 || NumFeatures < 0)
163  DoError(ILLEGAL_NUM_FEATURES, "Illegal number of features in set");
164 
165  FeatureSet = NewFeatureSet(NumFeatures);
166  for (i = 0; i < NumFeatures; i++)
167  AddFeature(FeatureSet, ReadFeature (File, FeatureDesc));
168 
169  return (FeatureSet);
170 } /* ReadFeatureSet */
171 
184 void WriteFeature(FEATURE Feature, STRING* str) {
185  for (int i = 0; i < Feature->Type->NumParams; i++) {
186 #ifndef WIN32
187  assert(!isnan(Feature->Params[i]));
188 #endif
189  str->add_str_double(" ", Feature->Params[i]);
190  }
191  *str += "\n";
192 } /* WriteFeature */
193 
204 void WriteFeatureSet(FEATURE_SET FeatureSet, STRING* str) {
205  if (FeatureSet) {
206  str->add_str_int("", FeatureSet->NumFeatures);
207  *str += "\n";
208  for (int i = 0; i < FeatureSet->NumFeatures; i++) {
209  WriteFeature(FeatureSet->Features[i], str);
210  }
211  }
212 } /* WriteFeatureSet */
213 
229 void WriteOldParamDesc(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) {
230  int i;
231 
232  fprintf (File, "%d\n", FeatureDesc->NumParams);
233  for (i = 0; i < FeatureDesc->NumParams; i++) {
234  if (FeatureDesc->ParamDesc[i].Circular)
235  fprintf (File, "circular ");
236  else
237  fprintf (File, "linear ");
238 
239  if (FeatureDesc->ParamDesc[i].NonEssential)
240  fprintf (File, "non-essential ");
241  else
242  fprintf (File, "essential ");
243 
244  fprintf (File, "%f %f\n",
245  FeatureDesc->ParamDesc[i].Min, FeatureDesc->ParamDesc[i].Max);
246  }
247 } /* WriteOldParamDesc */
int tfscanf(FILE *stream, const char *format,...)
Definition: scanutils.cpp:228
FEATURE_SET NewFeatureSet(int NumFeatures)
void WriteOldParamDesc(FILE *File, const FEATURE_DESC_STRUCT *FeatureDesc)
void add_str_int(const char *str, int number)
Definition: strngs.cpp:381
FEATURE ReadFeature(FILE *File, const FEATURE_DESC_STRUCT *FeatureDesc)
#define TRUE
Definition: capi.h:45
FEATURE Features[1]
Definition: ocrfeatures.h:72
void FreeFeatureSet(FEATURE_SET FeatureSet)
Definition: ocrfeatures.cpp:71
void * Emalloc(int Size)
Definition: emalloc.cpp:47
void WriteFeatureSet(FEATURE_SET FeatureSet, STRING *str)
const PARAM_DESC * ParamDesc
Definition: ocrfeatures.h:59
const FEATURE_DESC_STRUCT * Type
Definition: ocrfeatures.h:64
#define ILLEGAL_FEATURE_PARAM
Definition: ocrfeatures.h:36
inT8 Circular
Definition: ocrfeatures.h:47
FLOAT32 Min
Definition: ocrfeatures.h:49
inT8 NonEssential
Definition: ocrfeatures.h:48
FEATURE_STRUCT * FEATURE
Definition: ocrfeatures.h:67
unsigned char BOOL8
Definition: host.h:44
Definition: strngs.h:45
#define FALSE
Definition: capi.h:46
void add_str_double(const char *str, double number)
Definition: strngs.cpp:391
FEATURE NewFeature(const FEATURE_DESC_STRUCT *FeatureDesc)
Definition: ocrfeatures.cpp:88
FEATURE_SET_STRUCT * FEATURE_SET
Definition: ocrfeatures.h:74
#define isnan(x)
Definition: mathfix.h:31
#define ILLEGAL_NUM_FEATURES
Definition: ocrfeatures.h:37
void FreeFeature(FEATURE Feature)
Definition: ocrfeatures.cpp:59
FEATURE_SET ReadFeatureSet(FILE *File, const FEATURE_DESC_STRUCT *FeatureDesc)
float FLOAT32
Definition: host.h:42
void DoError(int Error, const char *Message)
Definition: danerror.cpp:42
FLOAT32 Max
Definition: ocrfeatures.h:50
FLOAT32 Params[1]
Definition: ocrfeatures.h:65
void WriteFeature(FEATURE Feature, STRING *str)
BOOL8 AddFeature(FEATURE_SET FeatureSet, FEATURE Feature)
Definition: ocrfeatures.cpp:43