00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef INTPROTO_H
00019 #define INTPROTO_H
00020
00024 #include "genericvector.h"
00025 #include "matchdefs.h"
00026 #include "mfoutline.h"
00027 #include "protos.h"
00028 #include "scrollview.h"
00029 #include "unicharset.h"
00030
00031
00032 #define PRUNER_X 0
00033 #define PRUNER_Y 1
00034 #define PRUNER_ANGLE 2
00035
00036
00037 #define ANGLE_SHIFT (0.0)
00038 #define X_SHIFT (0.5)
00039 #define Y_SHIFT (0.5)
00040
00041 #define MAX_PROTO_INDEX 24
00042 #define BITS_PER_WERD (8 * sizeof (uinT32))
00043
00044 #define MAX_NUM_CONFIGS 64
00045 #define MAX_NUM_PROTOS 512
00046 #define PROTOS_PER_PROTO_SET 64
00047 #define MAX_NUM_PROTO_SETS (MAX_NUM_PROTOS / PROTOS_PER_PROTO_SET)
00048 #define NUM_PP_PARAMS 3
00049 #define NUM_PP_BUCKETS 64
00050 #define NUM_CP_BUCKETS 24
00051 #define CLASSES_PER_CP 32
00052 #define NUM_BITS_PER_CLASS 2
00053 #define CLASS_PRUNER_CLASS_MASK (~(~0 << NUM_BITS_PER_CLASS))
00054 #define CLASSES_PER_CP_WERD (CLASSES_PER_CP / NUM_BITS_PER_CLASS)
00055 #define PROTOS_PER_PP_WERD BITS_PER_WERD
00056 #define BITS_PER_CP_VECTOR (CLASSES_PER_CP * NUM_BITS_PER_CLASS)
00057 #define MAX_NUM_CLASS_PRUNERS ((MAX_NUM_CLASSES + CLASSES_PER_CP - 1) / \
00058 CLASSES_PER_CP)
00059 #define WERDS_PER_CP_VECTOR (BITS_PER_CP_VECTOR / BITS_PER_WERD)
00060 #define WERDS_PER_PP_VECTOR ((PROTOS_PER_PROTO_SET+BITS_PER_WERD-1)/ \
00061 BITS_PER_WERD)
00062 #define WERDS_PER_PP (NUM_PP_PARAMS * NUM_PP_BUCKETS * \
00063 WERDS_PER_PP_VECTOR)
00064 #define WERDS_PER_CP (NUM_CP_BUCKETS * NUM_CP_BUCKETS * \
00065 NUM_CP_BUCKETS * WERDS_PER_CP_VECTOR)
00066 #define WERDS_PER_CONFIG_VEC ((MAX_NUM_CONFIGS + BITS_PER_WERD - 1) / \
00067 BITS_PER_WERD)
00068
00069
00070
00071
00072
00073
00074 struct CLASS_PRUNER_STRUCT {
00075 uinT32 p[NUM_CP_BUCKETS][NUM_CP_BUCKETS][NUM_CP_BUCKETS][WERDS_PER_CP_VECTOR];
00076 };
00077
00078 typedef struct
00079 {
00080 inT8 A;
00081 uinT8 B;
00082 inT8 C;
00083 uinT8 Angle;
00084 uinT32 Configs[WERDS_PER_CONFIG_VEC];
00085 }
00086
00087
00088 INT_PROTO_STRUCT, *INT_PROTO;
00089
00090 typedef uinT32 PROTO_PRUNER[NUM_PP_PARAMS][NUM_PP_BUCKETS][WERDS_PER_PP_VECTOR];
00091
00092 typedef struct
00093 {
00094 PROTO_PRUNER ProtoPruner;
00095 INT_PROTO_STRUCT Protos[PROTOS_PER_PROTO_SET];
00096 }
00097
00098
00099 PROTO_SET_STRUCT, *PROTO_SET;
00100
00101 typedef uinT32 CONFIG_PRUNER[NUM_PP_PARAMS][NUM_PP_BUCKETS][4];
00102
00103
00104 typedef struct
00105 {
00106 uinT16 NumProtos;
00107 uinT8 NumProtoSets;
00108 uinT8 NumConfigs;
00109 PROTO_SET ProtoSets[MAX_NUM_PROTO_SETS];
00110 uinT8 *ProtoLengths;
00111 uinT16 ConfigLengths[MAX_NUM_CONFIGS];
00112 int font_set_id;
00113 }
00114
00115
00116 INT_CLASS_STRUCT, *INT_CLASS;
00117
00118 typedef struct
00119 {
00120 int NumClasses;
00121 int NumClassPruners;
00122 INT_CLASS Class[MAX_NUM_CLASSES];
00123 CLASS_PRUNER_STRUCT* ClassPruners[MAX_NUM_CLASS_PRUNERS];
00124 }
00125
00126
00127 INT_TEMPLATES_STRUCT, *INT_TEMPLATES;
00128
00129
00130 #define MAX_NUM_INT_FEATURES 512
00131 #define INT_CHAR_NORM_RANGE 256
00132
00133 struct INT_FEATURE_STRUCT
00134 {
00135 uinT8 X;
00136 uinT8 Y;
00137 uinT8 Theta;
00138 inT8 CP_misses;
00139
00140 void print() const {
00141 tprintf("(%d,%d):%d\n", X, Y, Theta);
00142 }
00143 };
00144
00145 typedef INT_FEATURE_STRUCT *INT_FEATURE;
00146
00147 typedef INT_FEATURE_STRUCT INT_FEATURE_ARRAY[MAX_NUM_INT_FEATURES];
00148
00149 enum IntmatcherDebugAction {
00150 IDA_ADAPTIVE,
00151 IDA_STATIC,
00152 IDA_SHAPE_INDEX,
00153 IDA_BOTH
00154 };
00155
00160 #define MaxNumIntProtosIn(C) (C->NumProtoSets * PROTOS_PER_PROTO_SET)
00161 #define SetForProto(P) (P / PROTOS_PER_PROTO_SET)
00162 #define IndexForProto(P) (P % PROTOS_PER_PROTO_SET)
00163 #define ProtoForProtoId(C,P) (&((C->ProtoSets[SetForProto (P)])-> \
00164 Protos [IndexForProto (P)]))
00165 #define PPrunerWordIndexFor(I) (((I) % PROTOS_PER_PROTO_SET) / \
00166 PROTOS_PER_PP_WERD)
00167 #define PPrunerBitIndexFor(I) ((I) % PROTOS_PER_PP_WERD)
00168 #define PPrunerMaskFor(I) (1 << PPrunerBitIndexFor (I))
00169
00170 #define MaxNumClassesIn(T) (T->NumClassPruners * CLASSES_PER_CP)
00171 #define LegalClassId(c) ((c) >= 0 && (c) <= MAX_CLASS_ID)
00172 #define UnusedClassIdIn(T,c) ((T)->Class[c] == NULL)
00173 #define ClassForClassId(T,c) ((T)->Class[c])
00174 #define ClassPrunersFor(T) ((T)->ClassPruner)
00175 #define CPrunerIdFor(c) ((c) / CLASSES_PER_CP)
00176 #define CPrunerFor(T,c) ((T)->ClassPruners[CPrunerIdFor(c)])
00177 #define CPrunerWordIndexFor(c) (((c) % CLASSES_PER_CP) / CLASSES_PER_CP_WERD)
00178 #define CPrunerBitIndexFor(c) (((c) % CLASSES_PER_CP) % CLASSES_PER_CP_WERD)
00179 #define CPrunerMaskFor(L,c) (((L)+1) << CPrunerBitIndexFor (c) * NUM_BITS_PER_CLASS)
00180
00181
00182 #define PRINT_MATCH_SUMMARY 0x001
00183 #define DISPLAY_FEATURE_MATCHES 0x002
00184 #define DISPLAY_PROTO_MATCHES 0x004
00185 #define PRINT_FEATURE_MATCHES 0x008
00186 #define PRINT_PROTO_MATCHES 0x010
00187 #define CLIP_MATCH_EVIDENCE 0x020
00188
00189 #define MatchDebuggingOn(D) (D)
00190 #define PrintMatchSummaryOn(D) ((D) & PRINT_MATCH_SUMMARY)
00191 #define DisplayFeatureMatchesOn(D) ((D) & DISPLAY_FEATURE_MATCHES)
00192 #define DisplayProtoMatchesOn(D) ((D) & DISPLAY_PROTO_MATCHES)
00193 #define PrintFeatureMatchesOn(D) ((D) & PRINT_FEATURE_MATCHES)
00194 #define PrintProtoMatchesOn(D) ((D) & PRINT_PROTO_MATCHES)
00195 #define ClipMatchEvidenceOn(D) ((D) & CLIP_MATCH_EVIDENCE)
00196
00200 void AddIntClass(INT_TEMPLATES Templates, CLASS_ID ClassId, INT_CLASS Class);
00201
00202 int AddIntConfig(INT_CLASS Class);
00203
00204 int AddIntProto(INT_CLASS Class);
00205
00206 void AddProtoToClassPruner(PROTO Proto,
00207 CLASS_ID ClassId,
00208 INT_TEMPLATES Templates);
00209
00210 void AddProtoToProtoPruner(PROTO Proto, int ProtoId,
00211 INT_CLASS Class, bool debug);
00212
00213 int BucketFor(FLOAT32 Param, FLOAT32 Offset, int NumBuckets);
00214
00215 int CircBucketFor(FLOAT32 Param, FLOAT32 Offset, int NumBuckets);
00216
00217 void UpdateMatchDisplay();
00218
00219 void ConvertConfig(BIT_VECTOR Config, int ConfigId, INT_CLASS Class);
00220
00221 void DisplayIntFeature(const INT_FEATURE_STRUCT* Feature, FLOAT32 Evidence);
00222
00223 void DisplayIntProto(INT_CLASS Class, PROTO_ID ProtoId, FLOAT32 Evidence);
00224
00225 INT_CLASS NewIntClass(int MaxNumProtos, int MaxNumConfigs);
00226
00227 INT_TEMPLATES NewIntTemplates();
00228
00229 void free_int_templates(INT_TEMPLATES templates);
00230
00231 void ShowMatchDisplay();
00232
00233 namespace tesseract {
00234
00235
00236
00237 void ClearFeatureSpaceWindow(NORM_METHOD norm_method, ScrollView* window);
00238
00239 }
00240
00241
00242 void RenderIntFeature(ScrollView *window, const INT_FEATURE_STRUCT* Feature,
00243 ScrollView::Color color);
00244
00245 void InitIntMatchWindowIfReqd();
00246
00247 void InitProtoDisplayWindowIfReqd();
00248
00249 void InitFeatureDisplayWindowIfReqd();
00250
00251
00252
00253 ScrollView* CreateFeatureSpaceWindow(const char* name, int xpos, int ypos);
00254
00255 #endif