00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00080 #ifndef CMotion2DImage_h
00081 #define CMotion2DImage_h
00082
00083 #ifdef __SunOS_
00084 # include <iostream.h>
00085 #else
00086 # include <iostream>
00087 #endif
00088 #include <math.h>
00089
00090 using namespace std;
00091
00092 #if defined (WIN32)
00093 # if defined MOTION2D_DLL_EXPORTS
00094 # define MOTION2D_API __declspec( dllexport )
00095 # elif defined MOTION2D_DLL_IMPORTS
00096 # define MOTION2D_API __declspec( dllimport )
00097 # else
00098 # define MOTION2D_API
00099 # endif
00100 #else
00101 # define MOTION2D_API
00102 #endif
00103
00104 #ifndef FILENAME_MAX
00105 # define FILENAME_MAX 1024
00106 #endif
00107
00108
00109 #define DEBUG_LEVEL1 0
00110
00121 template <class T> bool sort(unsigned n, T* ra)
00122 {
00123 unsigned long l,j,ir,i;
00124 T rra;
00125 unsigned long min,max;
00126
00127 if (DEBUG_LEVEL1) cout << "Begin sort()" << endl;
00128 if (n == 0)
00129 return false;
00130
00131 if (n == 1)
00132 return true;
00133
00134 min=n+1;
00135 max= 0;
00136 l=(n >> 1)+1;
00137 ir=n;
00138 for (;;) {
00139 if (l > 1)
00140 rra=ra[--l];
00141 else {
00142 rra=ra[ir];
00143 ra[ir]=ra[1];
00144 if (ir>max) max=ir;
00145 if (ir<min) min=ir;
00146 if (--ir == 1) {
00147 ra[1]=rra;
00148
00149 return true;
00150 }
00151 }
00152 i=l;
00153 j=l << 1;
00154 while (j <= ir) {
00155 if (j+1>max) max=j+1;
00156 if (j<min) min=j;
00157 if (j < ir && ra[j] < ra[j+1]) ++j;
00158 if (rra < ra[j]) {
00159 if (i>max) max=i;
00160 if (i<min) min=i;
00161 ra[i]=ra[j];
00162 j += (i=j);
00163 }
00164 else j=ir+1;
00165 }
00166 if (i>max) max=i;
00167 if (i<min) min=i;
00168 ra[i]=rra;
00169 }
00170 if (DEBUG_LEVEL1) cout << "End sort()" << endl;
00171 return true;
00172 }
00173
00174
00175
00176
00177 template<class Type>
00178 class CMotion2DImage
00179 {
00180 private:
00181 unsigned npixels;
00182 unsigned ncols ;
00183 unsigned nrows ;
00184
00185 public:
00186 Type *bitmap ;
00187 Type **row ;
00189 public:
00190 CMotion2DImage() ;
00191
00192 CMotion2DImage(const CMotion2DImage<Type>&);
00193 CMotion2DImage(unsigned nb_rows, unsigned nb_cols);
00194 CMotion2DImage(unsigned nb_rows, unsigned nb_cols, Type value);
00195 ~CMotion2DImage() ;
00196
00197 bool Init(unsigned nb_rows, unsigned nb_cols);
00198 bool Init(unsigned nb_rows, unsigned nb_cols, Type value);
00199
00200 bool Resize(unsigned nb_rows, unsigned nb_cols);
00201 void Subsample();
00202 bool And(CMotion2DImage<Type> &A, CMotion2DImage<Type> &B);
00203 bool And(CMotion2DImage<Type> &A, CMotion2DImage<Type> &B, Type label);
00204 bool MedianFilter(unsigned filterRowSize, unsigned filterColSize);
00205
00211 inline unsigned GetRows() const { return nrows ; }
00217 inline unsigned GetCols() const { return ncols ; }
00224 inline unsigned GetNumberOfPixel() const{ return npixels; }
00225
00232 Type *operator[](unsigned i) {return row[i];}
00239 const Type *operator[](unsigned i) const {return row[i];}
00240
00241
00242 void operator=(Type x);
00243
00244 void operator=(const CMotion2DImage<Type> &image);
00245
00246 CMotion2DImage<Type> operator-(const CMotion2DImage<Type> &image);
00247
00248 private:
00254 void SetCols(unsigned nb_cols) { ncols = nb_cols ; } ;
00260 void SetRows(unsigned nb_rows) { nrows = nb_rows ; } ;
00261
00262
00263 } ;
00264
00265
00266 #include <CMotion2DImage_base.cpp>
00267
00268
00269 #include "Motion2DImage_PNM.h"
00270 #include "Motion2DImage_RAW.h"
00271 #include "Motion2DImage_PNG.h"
00272
00273 #undef DEBUG_LEVEL1
00274
00275
00276 #endif