00001 #ifndef DLCONNECTEDCOMPONENTSUTILS_H
00002 #define DLCONNECTEDCOMPONENTSUTILS_H
00003
00004
00005 #include "DLTypes.h"
00006 #include "DLLogger.h"
00007 #include "DLDatarun.h"
00008 #include "DLPoint.h"
00009 #include "DLException.h"
00010
00011 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00013 typedef struct {
00014 friend class DLConnectedComponents;
00015 friend class DLConnectedComponentsUtils;
00016 private:
00018 int run_row;
00020 int run_start;
00022 int run_stop;
00024 int run_link;
00025 } DLtmpdatalink;
00026
00027
00029 typedef struct {
00030 friend class DLConnectedComponents;
00031 friend class DLConnectedComponentsUtils;
00032
00033 private:
00035 int urow_flag;
00037 int *still_curr;
00039 int *B_Seen;
00041 int row;
00043 int mask[256];
00045 int *ptr[256];
00047 int LUT[5*256];
00049 unsigned char msk[3];
00051 int extra_bits;
00053 int *num_stk;
00055 int irun;
00056
00058 DLtmpdatalink *R;
00060 int *Rhead;
00062 int *Rtail;
00064 int *Rlink;
00066 int next_Rlink;
00068 int free_R;
00070 int top_R;
00071
00073 DLtmpdatalink *C;
00075 int *Chead;
00077 int *Ctail;
00079 int *Clink;
00081 int next_Clink;
00083 int free_C;
00085 int top_C;
00086 } DLtmpdocdata;
00087
00088
00090 typedef struct {
00091 friend class DLConnectedComponents;
00092 friend class DLConnectedComponentsUtils;
00093
00094 private:
00096 int *run;
00098 int *num;
00100 int i;
00102 int len;
00103 } DLtmpdata;
00104
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00131
00132 typedef struct {
00133 friend class DLConnectedComponents;
00134 friend class DLConnectedComponentsUtils;
00135 private:
00137 int area;
00139 float rcentroid;
00141 float ccentroid;
00143 int perimeter;
00145 int rmin ;
00147 int rmax ;
00149 int cmin ;
00151 int cmax ;
00153 int rseed;
00155 int cseed ;
00157 int number_of_holes;
00159 int num_runs;
00161 DLDatarun *runs;
00163 int num_conc_up;
00165 DLDatarun *conc_up;
00167 int num_conc_down;
00169 DLDatarun *conc_down;
00171 int num_points_convex_hull;
00173 DLPoint *convex_hull;
00175 float area_of_convex_hull;
00177 float perimeter_of_convex_hull;
00179 float moments[14];
00181 int *user_data;
00182 } DLCCcomponent;
00183
00184
00186 typedef struct {
00187 friend class DLConnectedComponents;
00188 friend class DLConnectedComponentsUtils;
00189 private:
00191 char cFileName[FILENAME_MAX];
00193 int iCols;
00195 int iRows;
00197 int iColBytes;
00199 short *image;
00201 DLCCcomponent* ComponentList;
00203 int iComponentCount;
00205 int top_S;
00207 int next_num;
00209 double dSkewAngle;
00211 int *user_data;
00213 int iImageLength;
00215 int iCalcMoments;
00217 int iCalcHulls;
00219 int iFixErrors;
00221 int iCalcSkew;
00223 float fHorizontalRes;
00225 float fVerticalRes;
00227 int iPixelDensity;
00229 DL_SHORT sEnableWarnings;
00231 DL_UBYTE* ub1BitImage;
00233 DL_UBYTE* ub8BitImage;
00234 } DLCCdocument;
00235
00236
00241 class DLConnectedComponentsUtils
00242 {
00243 friend class DLConnectedComponents;
00244 private:
00245
00249 DLConnectedComponentsUtils(const DLConnectedComponentsUtils & orig);
00250
00255 const DLConnectedComponentsUtils & operator=(const DLConnectedComponentsUtils & right);
00256
00257
00263 static void DLCalcConnectedComponents(DLCCdocument * D1);
00264
00270 static void DLClose(DLCCdocument* doink);
00271
00277 static int DLFreeConnectedComponents(DLCCdocument* doink);
00278
00288 static int DLiPixelToRunStart(unsigned char *lampimage,int w,int bw,int h,short **outstarts);
00292 DLConnectedComponentsUtils(void);
00296 virtual ~DLConnectedComponentsUtils(void);
00297
00304 static void GET_RUNS(DLCCdocument * D, DLtmpdata * A, DLtmpdocdata * T);
00305
00313 static void NEW_SEGMENT(DLCCdocument * H, DLCCdocument * D, DLtmpdata * A, DLtmpdocdata * T);
00321 static void ADD_RUN(DLCCdocument * H, DLtmpdata * A, DLtmpdata * B, DLtmpdocdata * T);
00329 static void MERGE(DLCCdocument * H, DLCCdocument * D,
00330 DLtmpdata * A, DLtmpdata * B, DLtmpdocdata * T);
00337 static void OVERLAP(DLCCdocument * H, DLtmpdata * A, DLtmpdata * B);
00346 static void OUTPUT(DLCCdocument * H, DLCCdocument * D, DLtmpdocdata * T,
00347 DLtmpdata * A, DLtmpdata * B);
00354 static void GET_MEMORY_S(DLCCdocument * D, DLtmpdata * B, DLtmpdocdata * T);
00361 static void GET_MEMORY_RC(DLCCdocument * D, DLtmpdata * A, DLtmpdocdata * T);
00371 static void ADD_CONCAVITY(DLCCdocument * H, DLtmpdocdata * T,
00372 int n, int run_row, int run_start, int run_stop);
00373 };
00374 #endif //DOXYGEN_SHOULD_SKIP_THIS
00375 #endif // DLCONNECTEDCOMPONENTSUTILS_H