/src/tesseract/src/classify/intproto.h
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /******************************************************************************  | 
2  |  |  ** Filename:    intproto.h  | 
3  |  |  ** Purpose:     Definition of data structures for integer protos.  | 
4  |  |  ** Author:      Dan Johnson  | 
5  |  |  **  | 
6  |  |  ** (c) Copyright Hewlett-Packard Company, 1988.  | 
7  |  |  ** Licensed under the Apache License, Version 2.0 (the "License");  | 
8  |  |  ** you may not use this file except in compliance with the License.  | 
9  |  |  ** You may obtain a copy of the License at  | 
10  |  |  ** http://www.apache.org/licenses/LICENSE-2.0  | 
11  |  |  ** Unless required by applicable law or agreed to in writing, software  | 
12  |  |  ** distributed under the License is distributed on an "AS IS" BASIS,  | 
13  |  |  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | 
14  |  |  ** See the License for the specific language governing permissions and  | 
15  |  |  ** limitations under the License.  | 
16  |  |  *****************************************************************************/  | 
17  |  |  | 
18  |  | #ifndef INTPROTO_H  | 
19  |  | #define INTPROTO_H  | 
20  |  |  | 
21  |  | /**----------------------------------------------------------------------------  | 
22  |  |           Include Files and Type Defines  | 
23  |  | ----------------------------------------------------------------------------**/  | 
24  |  | #include "matchdefs.h"  | 
25  |  | #include "mfoutline.h"  | 
26  |  | #include "protos.h"  | 
27  |  | #include "scrollview.h"  | 
28  |  | #include "unicharset.h"  | 
29  |  |  | 
30  |  | namespace tesseract { | 
31  |  |  | 
32  |  | class FCOORD;  | 
33  |  |  | 
34  |  | /* define order of params in pruners */  | 
35  | 19.0k  | #define PRUNER_X 0  | 
36  | 19.0k  | #define PRUNER_Y 1  | 
37  | 19.0k  | #define PRUNER_ANGLE 2  | 
38  |  |  | 
39  |  | /* definition of coordinate system offsets for each table parameter */  | 
40  | 139k  | #define ANGLE_SHIFT (0.0)  | 
41  | 149k  | #define X_SHIFT (0.5)  | 
42  | 55.9k  | #define Y_SHIFT (0.5)  | 
43  |  |  | 
44  | 19.5G  | #define MAX_PROTO_INDEX 24  | 
45  | 6.35G  | #define BITS_PER_WERD static_cast<int>(8 * sizeof(uint32_t))  | 
46  |  | /* Script detection: increase this number to 128 */  | 
47  | 2.78G  | #define MAX_NUM_CONFIGS 64  | 
48  | 12.5M  | #define MAX_NUM_PROTOS 512  | 
49  | 19.5G  | #define PROTOS_PER_PROTO_SET 64  | 
50  |  | #define MAX_NUM_PROTO_SETS (MAX_NUM_PROTOS / PROTOS_PER_PROTO_SET)  | 
51  | 796  | #define NUM_PP_PARAMS 3  | 
52  | 1.94G  | #define NUM_PP_BUCKETS 64  | 
53  | 698M  | #define NUM_CP_BUCKETS 24  | 
54  | 6.36G  | #define CLASSES_PER_CP 32  | 
55  | 137G  | #define NUM_BITS_PER_CLASS 2  | 
56  | 67.7G  | #define CLASS_PRUNER_CLASS_MASK (~(~0u << NUM_BITS_PER_CLASS))  | 
57  | 7.93k  | #define CLASSES_PER_CP_WERD (CLASSES_PER_CP / NUM_BITS_PER_CLASS)  | 
58  |  | #define PROTOS_PER_PP_WERD BITS_PER_WERD  | 
59  | 6.35G  | #define BITS_PER_CP_VECTOR (CLASSES_PER_CP * NUM_BITS_PER_CLASS)  | 
60  | 4  | #define MAX_NUM_CLASS_PRUNERS ((MAX_NUM_CLASSES + CLASSES_PER_CP - 1) / CLASSES_PER_CP)  | 
61  | 6.35G  | #define WERDS_PER_CP_VECTOR (BITS_PER_CP_VECTOR / BITS_PER_WERD)  | 
62  | 796  | #define WERDS_PER_PP_VECTOR ((PROTOS_PER_PROTO_SET + BITS_PER_WERD - 1) / BITS_PER_WERD)  | 
63  |  | #define WERDS_PER_PP (NUM_PP_PARAMS * NUM_PP_BUCKETS * WERDS_PER_PP_VECTOR)  | 
64  |  | #define WERDS_PER_CP (NUM_CP_BUCKETS * NUM_CP_BUCKETS * NUM_CP_BUCKETS * WERDS_PER_CP_VECTOR)  | 
65  | 57.2k  | #define WERDS_PER_CONFIG_VEC ((MAX_NUM_CONFIGS + BITS_PER_WERD - 1) / BITS_PER_WERD)  | 
66  |  |  | 
67  |  | /* The first 3 dimensions of the CLASS_PRUNER_STRUCT are the  | 
68  |  |  * 3 axes of the quantized feature space.  | 
69  |  |  * The position of the bits recorded for each class in the  | 
70  |  |  * 4th dimension is determined by using CPrunerWordIndexFor(c),  | 
71  |  |  * where c is the corresponding class id. */  | 
72  |  | struct CLASS_PRUNER_STRUCT { | 
73  |  |   uint32_t p[NUM_CP_BUCKETS][NUM_CP_BUCKETS][NUM_CP_BUCKETS][WERDS_PER_CP_VECTOR];  | 
74  |  | };  | 
75  |  |  | 
76  |  | struct INT_PROTO_STRUCT { | 
77  |  |   int8_t A;  | 
78  |  |   uint8_t B;  | 
79  |  |   int8_t C;  | 
80  |  |   uint8_t Angle;  | 
81  |  |   uint32_t Configs[WERDS_PER_CONFIG_VEC];  | 
82  |  | };  | 
83  |  |  | 
84  |  | typedef uint32_t PROTO_PRUNER[NUM_PP_PARAMS][NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR];  | 
85  |  |  | 
86  |  | struct PROTO_SET_STRUCT { | 
87  |  |   PROTO_PRUNER ProtoPruner;  | 
88  |  |   INT_PROTO_STRUCT Protos[PROTOS_PER_PROTO_SET];  | 
89  |  | };  | 
90  |  |  | 
91  |  | typedef uint32_t CONFIG_PRUNER[NUM_PP_PARAMS][NUM_PP_BUCKETS][4];  | 
92  |  |  | 
93  |  | struct INT_CLASS_STRUCT { | 
94  | 452  |   INT_CLASS_STRUCT() = default;  | 
95  |  |   INT_CLASS_STRUCT(int MaxNumProtos, int MaxNumConfigs);  | 
96  |  |   ~INT_CLASS_STRUCT();  | 
97  |  |   uint16_t NumProtos = 0;  | 
98  |  |   uint8_t NumProtoSets = 0;  | 
99  |  |   uint8_t NumConfigs = 0;  | 
100  |  |   PROTO_SET_STRUCT *ProtoSets[MAX_NUM_PROTO_SETS];  | 
101  |  |   std::vector<uint8_t> ProtoLengths;  | 
102  |  |   uint16_t ConfigLengths[MAX_NUM_CONFIGS];  | 
103  |  |   int font_set_id = 0; // FontSet id, see above  | 
104  |  | };  | 
105  |  |  | 
106  |  | struct TESS_API INT_TEMPLATES_STRUCT { | 
107  |  |   INT_TEMPLATES_STRUCT();  | 
108  |  |   ~INT_TEMPLATES_STRUCT();  | 
109  |  |   unsigned NumClasses;  | 
110  |  |   unsigned NumClassPruners;  | 
111  |  |   INT_CLASS_STRUCT *Class[MAX_NUM_CLASSES];  | 
112  |  |   CLASS_PRUNER_STRUCT *ClassPruners[MAX_NUM_CLASS_PRUNERS];  | 
113  |  | };  | 
114  |  |  | 
115  |  | /* definitions of integer features*/  | 
116  |  | #define MAX_NUM_INT_FEATURES 512  | 
117  | 1.16G  | #define INT_CHAR_NORM_RANGE 256  | 
118  |  |  | 
119  |  | struct INT_FEATURE_STRUCT { | 
120  | 127M  |   INT_FEATURE_STRUCT() : X(0), Y(0), Theta(0), CP_misses(0) {} | 
121  |  |   // Builds a feature from an FCOORD for position with all the necessary  | 
122  |  |   // clipping and rounding.  | 
123  |  |   INT_FEATURE_STRUCT(const FCOORD &pos, uint8_t theta);  | 
124  |  |   // Builds a feature from ints with all the necessary clipping and casting.  | 
125  |  |   INT_FEATURE_STRUCT(int x, int y, int theta);  | 
126  |  |  | 
127  |  |   uint8_t X;  | 
128  |  |   uint8_t Y;  | 
129  |  |   uint8_t Theta;  | 
130  |  |   int8_t CP_misses;  | 
131  |  |  | 
132  | 0  |   void print() const { | 
133  | 0  |     tprintf("(%d,%d):%d\n", X, Y, Theta); | 
134  | 0  |   }  | 
135  |  | };  | 
136  |  |  | 
137  |  | typedef INT_FEATURE_STRUCT INT_FEATURE_ARRAY[MAX_NUM_INT_FEATURES];  | 
138  |  |  | 
139  |  | enum IntmatcherDebugAction { IDA_ADAPTIVE, IDA_STATIC, IDA_SHAPE_INDEX, IDA_BOTH }; | 
140  |  |  | 
141  |  | /**----------------------------------------------------------------------------  | 
142  |  |             Macros  | 
143  |  | ----------------------------------------------------------------------------**/  | 
144  |  |  | 
145  | 6.27M  | #define MaxNumIntProtosIn(C) (C->NumProtoSets * PROTOS_PER_PROTO_SET)  | 
146  | 81.9k  | #define SetForProto(P) (P / PROTOS_PER_PROTO_SET)  | 
147  | 81.9k  | #define IndexForProto(P) (P % PROTOS_PER_PROTO_SET)  | 
148  | 62.8k  | #define ProtoForProtoId(C, P) (&((C->ProtoSets[SetForProto(P)])->Protos[IndexForProto(P)]))  | 
149  |  | #define PPrunerWordIndexFor(I) (((I) % PROTOS_PER_PROTO_SET) / PROTOS_PER_PP_WERD)  | 
150  |  | #define PPrunerBitIndexFor(I) ((I) % PROTOS_PER_PP_WERD)  | 
151  |  | #define PPrunerMaskFor(I) (1 << PPrunerBitIndexFor(I))  | 
152  |  |  | 
153  | 6.25M  | #define MaxNumClassesIn(T) (T->NumClassPruners * CLASSES_PER_CP)  | 
154  | 5.45k  | #define LegalClassId(c) ((c) >= 0 && (c) < MAX_NUM_CLASSES)  | 
155  | 0  | #define UnusedClassIdIn(T, c) ((T)->Class[c] == nullptr)  | 
156  | 448M  | #define ClassForClassId(T, c) ((T)->Class[c])  | 
157  |  | #define ClassPrunersFor(T) ((T)->ClassPruner)  | 
158  | 1.58k  | #define CPrunerIdFor(c) ((c) / CLASSES_PER_CP)  | 
159  | 1.58k  | #define CPrunerFor(T, c) ((T)->ClassPruners[CPrunerIdFor(c)])  | 
160  | 1.58k  | #define CPrunerWordIndexFor(c) (((c) % CLASSES_PER_CP) / CLASSES_PER_CP_WERD)  | 
161  | 6.34k  | #define CPrunerBitIndexFor(c) (((c) % CLASSES_PER_CP) % CLASSES_PER_CP_WERD)  | 
162  | 6.34k  | #define CPrunerMaskFor(L, c) (((L) + 1) << CPrunerBitIndexFor(c) * NUM_BITS_PER_CLASS)  | 
163  |  |  | 
164  |  | /* DEBUG macros*/  | 
165  | 0  | #define PRINT_MATCH_SUMMARY 0x001  | 
166  |  | #define DISPLAY_FEATURE_MATCHES 0x002  | 
167  |  | #define DISPLAY_PROTO_MATCHES 0x004  | 
168  | 5.19G  | #define PRINT_FEATURE_MATCHES 0x008  | 
169  | 0  | #define PRINT_PROTO_MATCHES 0x010  | 
170  |  | #define CLIP_MATCH_EVIDENCE 0x020  | 
171  |  |  | 
172  | 14.7M  | #define MatchDebuggingOn(D) (D)  | 
173  |  | #define PrintMatchSummaryOn(D) ((D)&PRINT_MATCH_SUMMARY)  | 
174  |  | #define DisplayFeatureMatchesOn(D) ((D)&DISPLAY_FEATURE_MATCHES)  | 
175  |  | #define DisplayProtoMatchesOn(D) ((D)&DISPLAY_PROTO_MATCHES)  | 
176  | 5.19G  | #define PrintFeatureMatchesOn(D) ((D)&PRINT_FEATURE_MATCHES)  | 
177  |  | #define PrintProtoMatchesOn(D) ((D)&PRINT_PROTO_MATCHES)  | 
178  |  | #define ClipMatchEvidenceOn(D) ((D)&CLIP_MATCH_EVIDENCE)  | 
179  |  |  | 
180  |  | /**----------------------------------------------------------------------------  | 
181  |  |           Public Function Prototypes  | 
182  |  | ----------------------------------------------------------------------------**/  | 
183  |  | void AddIntClass(INT_TEMPLATES_STRUCT *Templates, CLASS_ID ClassId, INT_CLASS_STRUCT *Class);  | 
184  |  |  | 
185  |  | int AddIntConfig(INT_CLASS_STRUCT *Class);  | 
186  |  |  | 
187  |  | int AddIntProto(INT_CLASS_STRUCT *Class);  | 
188  |  |  | 
189  |  | void AddProtoToClassPruner(PROTO_STRUCT *Proto, CLASS_ID ClassId, INT_TEMPLATES_STRUCT *Templates);  | 
190  |  |  | 
191  |  | void AddProtoToProtoPruner(PROTO_STRUCT *Proto, int ProtoId, INT_CLASS_STRUCT *Class, bool debug);  | 
192  |  |  | 
193  |  | uint8_t Bucket8For(float param, float offset, int num_buckets);  | 
194  |  | uint16_t Bucket16For(float param, float offset, int num_buckets);  | 
195  |  |  | 
196  |  | uint8_t CircBucketFor(float param, float offset, int num_buckets);  | 
197  |  |  | 
198  |  | void UpdateMatchDisplay();  | 
199  |  |  | 
200  |  | void ConvertConfig(BIT_VECTOR Config, int ConfigId, INT_CLASS_STRUCT *Class);  | 
201  |  |  | 
202  |  | void DisplayIntFeature(const INT_FEATURE_STRUCT *Feature, float Evidence);  | 
203  |  |  | 
204  |  | void DisplayIntProto(INT_CLASS_STRUCT *Class, PROTO_ID ProtoId, float Evidence);  | 
205  |  |  | 
206  |  | void ShowMatchDisplay();  | 
207  |  |  | 
208  |  | #ifndef GRAPHICS_DISABLED  | 
209  |  | // Clears the given window and draws the featurespace guides for the  | 
210  |  | // appropriate normalization method.  | 
211  |  | TESS_API  | 
212  |  | void ClearFeatureSpaceWindow(NORM_METHOD norm_method, ScrollView *window);  | 
213  |  | #endif // !GRAPHICS_DISABLED  | 
214  |  |  | 
215  |  | /*----------------------------------------------------------------------------*/  | 
216  |  | #ifndef GRAPHICS_DISABLED  | 
217  |  | TESS_API  | 
218  |  | void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT *Feature,  | 
219  |  |                       ScrollView::Color color);  | 
220  |  |  | 
221  |  | void InitIntMatchWindowIfReqd();  | 
222  |  |  | 
223  |  | void InitProtoDisplayWindowIfReqd();  | 
224  |  |  | 
225  |  | void InitFeatureDisplayWindowIfReqd();  | 
226  |  |  | 
227  |  | // Creates a window of the appropriate size for displaying elements  | 
228  |  | // in feature space.  | 
229  |  | TESS_API  | 
230  |  | ScrollView *CreateFeatureSpaceWindow(const char *name, int xpos, int ypos);  | 
231  |  | #endif // !GRAPHICS_DISABLED  | 
232  |  |  | 
233  |  | } // namespace tesseract  | 
234  |  |  | 
235  |  | #endif  |