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) { free(Feature); } /* FreeFeature */
60 
69 void FreeFeatureSet(FEATURE_SET FeatureSet) {
70  int i;
71 
72  if (FeatureSet) {
73  for (i = 0; i < FeatureSet->NumFeatures; i++)
74  FreeFeature(FeatureSet->Features[i]);
75  free(FeatureSet);
76  }
77 } /* FreeFeatureSet */
78 
86 FEATURE NewFeature(const FEATURE_DESC_STRUCT* FeatureDesc) {
87  FEATURE Feature;
88 
89  Feature = (FEATURE)malloc(sizeof(FEATURE_STRUCT) +
90  (FeatureDesc->NumParams - 1) * sizeof(FLOAT32));
91  Feature->Type = FeatureDesc;
92  return (Feature);
93 
94 } /* NewFeature */
95 
103 FEATURE_SET NewFeatureSet(int NumFeatures) {
104  FEATURE_SET FeatureSet;
105 
106  FeatureSet = (FEATURE_SET) Emalloc (sizeof (FEATURE_SET_STRUCT) +
107  (NumFeatures - 1) * sizeof (FEATURE));
108  FeatureSet->MaxNumFeatures = NumFeatures;
109  FeatureSet->NumFeatures = 0;
110  return (FeatureSet);
111 
112 } /* NewFeatureSet */
113 
128 FEATURE ReadFeature(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) {
129  FEATURE Feature;
130  int i;
131 
132  Feature = NewFeature (FeatureDesc);
133  for (i = 0; i < Feature->Type->NumParams; i++) {
134  if (tfscanf(File, "%f", &(Feature->Params[i])) != 1)
135  DoError (ILLEGAL_FEATURE_PARAM, "Illegal feature parameter spec");
136 #ifndef _WIN32
137  assert (!isnan(Feature->Params[i]));
138 #endif
139  }
140  return (Feature);
141 } /* ReadFeature */
142 
154 FEATURE_SET ReadFeatureSet(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) {
155  FEATURE_SET FeatureSet;
156  int NumFeatures;
157  int i;
158 
159  if (tfscanf(File, "%d", &NumFeatures) != 1 || NumFeatures < 0)
160  DoError(ILLEGAL_NUM_FEATURES, "Illegal number of features in set");
161 
162  FeatureSet = NewFeatureSet(NumFeatures);
163  for (i = 0; i < NumFeatures; i++)
164  AddFeature(FeatureSet, ReadFeature (File, FeatureDesc));
165 
166  return (FeatureSet);
167 } /* ReadFeatureSet */
168 
181 void WriteFeature(FEATURE Feature, STRING* str) {
182  for (int i = 0; i < Feature->Type->NumParams; i++) {
183 #ifndef WIN32
184  assert(!isnan(Feature->Params[i]));
185 #endif
186  str->add_str_double(" ", Feature->Params[i]);
187  }
188  *str += "\n";
189 } /* WriteFeature */
190 
201 void WriteFeatureSet(FEATURE_SET FeatureSet, STRING* str) {
202  if (FeatureSet) {
203  str->add_str_int("", FeatureSet->NumFeatures);
204  *str += "\n";
205  for (int i = 0; i < FeatureSet->NumFeatures; i++) {
206  WriteFeature(FeatureSet->Features[i], str);
207  }
208  }
209 } /* WriteFeatureSet */
210 
226 void WriteOldParamDesc(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) {
227  int i;
228 
229  fprintf (File, "%d\n", FeatureDesc->NumParams);
230  for (i = 0; i < FeatureDesc->NumParams; i++) {
231  if (FeatureDesc->ParamDesc[i].Circular)
232  fprintf (File, "circular ");
233  else
234  fprintf (File, "linear ");
235 
236  if (FeatureDesc->ParamDesc[i].NonEssential)
237  fprintf (File, "non-essential ");
238  else
239  fprintf (File, "essential ");
240 
241  fprintf (File, "%f %f\n",
242  FeatureDesc->ParamDesc[i].Min, FeatureDesc->ParamDesc[i].Max);
243  }
244 } /* WriteOldParamDesc */
FEATURE_STRUCT * FEATURE
Definition: ocrfeatures.h:67
#define TRUE
Definition: capi.h:45
void DoError(int Error, const char *Message)
Definition: danerror.cpp:42
inT8 NonEssential
Definition: ocrfeatures.h:48
void add_str_int(const char *str, int number)
Definition: strngs.cpp:381
FLOAT32 Min
Definition: ocrfeatures.h:49
int tfscanf(FILE *stream, const char *format,...)
Definition: scanutils.cpp:228
void WriteOldParamDesc(FILE *File, const FEATURE_DESC_STRUCT *FeatureDesc)
void WriteFeature(FEATURE Feature, STRING *str)
FLOAT32 Params[1]
Definition: ocrfeatures.h:65
void add_str_double(const char *str, double number)
Definition: strngs.cpp:391
#define FALSE
Definition: capi.h:46
FEATURE_SET NewFeatureSet(int NumFeatures)
FEATURE_SET_STRUCT * FEATURE_SET
Definition: ocrfeatures.h:74
inT8 Circular
Definition: ocrfeatures.h:47
Definition: strngs.h:45
FLOAT32 Max
Definition: ocrfeatures.h:50
FEATURE_SET ReadFeatureSet(FILE *File, const FEATURE_DESC_STRUCT *FeatureDesc)
const PARAM_DESC * ParamDesc
Definition: ocrfeatures.h:59
void FreeFeatureSet(FEATURE_SET FeatureSet)
Definition: ocrfeatures.cpp:69
void WriteFeatureSet(FEATURE_SET FeatureSet, STRING *str)
FEATURE NewFeature(const FEATURE_DESC_STRUCT *FeatureDesc)
Definition: ocrfeatures.cpp:86
FEATURE Features[1]
Definition: ocrfeatures.h:72
FEATURE ReadFeature(FILE *File, const FEATURE_DESC_STRUCT *FeatureDesc)
unsigned char BOOL8
Definition: host.h:44
const FEATURE_DESC_STRUCT * Type
Definition: ocrfeatures.h:64
#define ILLEGAL_FEATURE_PARAM
Definition: ocrfeatures.h:36
void * Emalloc(int Size)
Definition: emalloc.cpp:47
float FLOAT32
Definition: host.h:42
#define ILLEGAL_NUM_FEATURES
Definition: ocrfeatures.h:37
BOOL8 AddFeature(FEATURE_SET FeatureSet, FEATURE Feature)
Definition: ocrfeatures.cpp:43
void FreeFeature(FEATURE Feature)
Definition: ocrfeatures.cpp:59