00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef MFOUTLINE_H
00019 #define MFOUTLINE_H
00020
00024 #include "general.h"
00025 #include "oldlist.h"
00026 #include "fpoint.h"
00027 #include "fxdefs.h"
00028 #include "baseline.h"
00029 #include "varable.h"
00030
00031 #define NORMAL_X_HEIGHT (0.5)
00032 #define NORMAL_BASELINE (0.0)
00033
00034 typedef LIST MFOUTLINE;
00035
00036 typedef enum {
00037 north, south, east, west, northeast, northwest, southeast, southwest
00038 }
00039
00040
00041 DIRECTION;
00042
00043 typedef struct
00044 {
00045 FPOINT Point;
00046 FLOAT32 Slope;
00047 unsigned Padding:20;
00048 BOOL8 Hidden:TRUE;
00049 BOOL8 ExtremityMark:TRUE;
00050 DIRECTION Direction:4;
00051 DIRECTION PreviousDirection:4;
00052 }
00053
00054
00055 MFEDGEPT;
00056
00057 typedef enum {
00058 outer, hole
00059 }
00060
00061
00062 OUTLINETYPE;
00063
00064 typedef struct
00065 {
00066 FLOAT64 Mx, My;
00067 FLOAT64 L;
00068 FLOAT64 x, y;
00069 FLOAT64 Ix, Iy;
00070 FLOAT64 Rx, Ry;
00071 }
00072
00073
00074 OUTLINE_STATS;
00075
00076 typedef enum {
00077 baseline, character
00078 }
00079
00080
00081 NORM_METHOD;
00082
00083
00084
00085
00086
00087 extern INT_VAR_H(classify_norm_method, character,
00088 "Normalization Method ...");
00089
00090 extern double_VAR_H(classify_char_norm_range, 0.2,
00091 "Character Normalization Range ...");
00092 extern double_VAR_H(classify_min_norm_scale_x, 0.0,
00093 "Min char x-norm scale ...");
00094
00095 extern double_VAR_H(classify_max_norm_scale_x, 0.325,
00096 "Max char x-norm scale ...");
00097
00098 extern double_VAR_H(classify_min_norm_scale_y, 0.0,
00099 "Min char y-norm scale ...");
00100
00101 extern double_VAR_H(classify_max_norm_scale_y, 0.325,
00102 "Max char y-norm scale ...");
00103
00104
00108 #define AverageOf(A,B) (((A) + (B)) / 2)
00109
00110
00111 #define BaselineAt(L,X) (BASELINE_OFFSET)
00112
00113
00114 #define ComputeScaleFactor(L) \
00115 (NORMAL_X_HEIGHT / ((classify_baseline_normalized)? \
00116 (BASELINE_SCALE): \
00117 ((L)->xheight)))
00118
00119
00120 #define DegenerateOutline(O) (((O) == NIL) || ((O) == rest(O)))
00121 #define PointAt(O) ((MFEDGEPT *) first_node (O))
00122 #define NextPointAfter(E) (rest (E))
00123 #define MakeOutlineCircular(O) (set_rest (last (O), (O)))
00124
00125
00126 #define ClearMark(P) ((P)->ExtremityMark = FALSE)
00127 #define MarkPoint(P) ((P)->ExtremityMark = TRUE)
00128
00132 void ComputeBlobCenter(TBLOB *Blob, TPOINT *BlobCenter);
00133
00134 LIST ConvertBlob(TBLOB *Blob);
00135
00136 MFOUTLINE ConvertOutline(TESSLINE *Outline);
00137
00138 LIST ConvertOutlines(TESSLINE *Outline,
00139 LIST ConvertedOutlines,
00140 OUTLINETYPE OutlineType);
00141
00142 void ComputeOutlineStats(LIST Outlines, OUTLINE_STATS *OutlineStats);
00143
00144 void FilterEdgeNoise(MFOUTLINE Outline, FLOAT32 NoiseSegmentLength);
00145
00146 void FindDirectionChanges(MFOUTLINE Outline,
00147 FLOAT32 MinSlope,
00148 FLOAT32 MaxSlope);
00149
00150 void FreeMFOutline(void *agr);
00151
00152 void FreeOutlines(LIST Outlines);
00153
00154 void MarkDirectionChanges(MFOUTLINE Outline);
00155
00156 MFEDGEPT *NewEdgePoint();
00157
00158 MFOUTLINE NextExtremity(MFOUTLINE EdgePoint);
00159
00160 void NormalizeOutline(MFOUTLINE Outline,
00161 LINE_STATS *LineStats,
00162 FLOAT32 XOrigin);
00163
00164 void NormalizeOutlines(LIST Outlines,
00165 LINE_STATS *LineStats,
00166 FLOAT32 *XScale,
00167 FLOAT32 *YScale);
00168
00169 void SettupBlobConversion(TBLOB *Blob);
00170
00171 void SmearExtremities(MFOUTLINE Outline, FLOAT32 XScale, FLOAT32 YScale);
00172
00173
00174
00175
00176 void ChangeDirection(MFOUTLINE Start, MFOUTLINE End, DIRECTION Direction);
00177
00178 void CharNormalizeOutline(MFOUTLINE Outline,
00179 FLOAT32 XCenter,
00180 FLOAT32 YCenter,
00181 FLOAT32 XScale,
00182 FLOAT32 YScale);
00183
00184 void ComputeDirection(MFEDGEPT *Start,
00185 MFEDGEPT *Finish,
00186 FLOAT32 MinSlope,
00187 FLOAT32 MaxSlope);
00188
00189 void FinishOutlineStats(register OUTLINE_STATS *OutlineStats);
00190
00191 void InitOutlineStats(OUTLINE_STATS *OutlineStats);
00192
00193 MFOUTLINE NextDirectionChange(MFOUTLINE EdgePoint);
00194
00195 void UpdateOutlineStats(register OUTLINE_STATS *OutlineStats,
00196 register FLOAT32 x1,
00197 register FLOAT32 x2,
00198 register FLOAT32 y1,
00199 register FLOAT32 y2);
00200
00201 #endif