00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <QDebug>
00026 #include <qvcore/qvimage.h>
00027
00028 template <> const char * QVImage<uChar,1>::getTypeQString() const { return "QVImage<uChar,1>"; }
00029 template <> const char * QVImage<uChar,3>::getTypeQString() const { return "QVImage<uChar,3>"; }
00030 template <> const char * QVImage<uShort,1>::getTypeQString() const { return "QVImage<uShort,1>"; }
00031 template <> const char * QVImage<uShort,3>::getTypeQString() const { return "QVImage<uShort,3>"; }
00032 template <> const char * QVImage<sShort,1>::getTypeQString() const { return "QVImage<sShort,1>"; }
00033 template <> const char * QVImage<sShort,3>::getTypeQString() const { return "QVImage<sShort,3>"; }
00034 template <> const char * QVImage<sInt,1>::getTypeQString() const { return "QVImage<sInt,1>"; }
00035 template <> const char * QVImage<sInt,3>::getTypeQString() const { return "QVImage<sInt,3>"; }
00036 template <> const char * QVImage<sFloat,1>::getTypeQString() const { return "QVImage<sFloat,1>"; }
00037 template <> const char * QVImage<sFloat,3>::getTypeQString() const { return "QVImage<sFloat,3>"; }
00038
00039
00040 #define CREATE_COPY_CONSTRUCTOR(TYPE, C) \
00041 template <> QVImage<TYPE, C>::QVImage(QVImage<TYPE, C> const &img):QVGenericImage(img) \
00042 { \
00043 imageBuffer = img.imageBuffer; \
00044 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00045 }
00046
00047 CREATE_COPY_CONSTRUCTOR(uChar, 1);
00048 CREATE_COPY_CONSTRUCTOR(uChar, 3);
00049 CREATE_COPY_CONSTRUCTOR(uShort, 1);
00050 CREATE_COPY_CONSTRUCTOR(uShort, 3);
00051 CREATE_COPY_CONSTRUCTOR(sShort, 1);
00052 CREATE_COPY_CONSTRUCTOR(sShort, 3);
00053 CREATE_COPY_CONSTRUCTOR(sInt, 1);
00054 CREATE_COPY_CONSTRUCTOR(sInt, 3);
00055 CREATE_COPY_CONSTRUCTOR(sFloat, 1);
00056 CREATE_COPY_CONSTRUCTOR(sFloat, 3);
00057
00058
00059
00060
00061 #define CREATE_COPY_OPERATOR(TYPE, C) \
00062 template <> QVImage<TYPE,C> & QVImage<TYPE, C>::operator=(const QVImage<TYPE, C> &img) \
00063 { \
00064 imageBuffer = img.imageBuffer; \
00065 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00066 return *this; \
00067 }
00068
00069 CREATE_COPY_OPERATOR(uChar, 1);
00070 CREATE_COPY_OPERATOR(uChar, 3);
00071 CREATE_COPY_OPERATOR(uShort, 1);
00072 CREATE_COPY_OPERATOR(uShort, 3);
00073 CREATE_COPY_OPERATOR(sShort, 1);
00074 CREATE_COPY_OPERATOR(sShort, 3);
00075 CREATE_COPY_OPERATOR(sInt, 1);
00076 CREATE_COPY_OPERATOR(sInt, 3);
00077 CREATE_COPY_OPERATOR(sFloat, 1);
00078 CREATE_COPY_OPERATOR(sFloat, 3);
00079
00081
00082 #include <qvip/qvipp/qvipp.h>
00083
00084
00085 #define CREATE_COMPOSE_COPY_CONSTRUCTOR(TYPE) \
00086 template <> QVImage<TYPE, 3>::QVImage(QVImage<TYPE,1> const &red, QVImage<TYPE,1> const &green, QVImage<TYPE,1> const &blue):QVGenericImage(red) \
00087 { \
00088 imageBuffer = new QVImageBuffer<TYPE, 3>(red.getCols(), red.getRows()); \
00089 Copy(red, green, blue, *this); \
00090 setROI(red.getROI()); setAnchor(red.getAnchor()); \
00091 }
00092
00093 CREATE_COMPOSE_COPY_CONSTRUCTOR(uChar);
00094 CREATE_COMPOSE_COPY_CONSTRUCTOR(uShort);
00095 CREATE_COMPOSE_COPY_CONSTRUCTOR(sShort);
00096 CREATE_COMPOSE_COPY_CONSTRUCTOR(sInt);
00097 CREATE_COMPOSE_COPY_CONSTRUCTOR(sFloat);
00098
00099
00100
00101 #define CREATE_CONVERT_CONSTRUCTOR(TYPE1, TYPE2, C) \
00102 template <> QVImage<TYPE2, C>::QVImage(QVImage<TYPE1, C> const &img):QVGenericImage(img) \
00103 { \
00104 imageBuffer = new QVImageBuffer<TYPE2, C>(img.getCols(), img.getRows()); \
00105 setAnchor(img.getROI().x(),img.getROI().y()); \
00106 Convert(img, *this); \
00107 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00108 }
00109
00110
00111 CREATE_CONVERT_CONSTRUCTOR(uChar, uShort, 1);
00112 CREATE_CONVERT_CONSTRUCTOR(uChar, sShort, 1);
00113 CREATE_CONVERT_CONSTRUCTOR(uChar, sInt, 1);
00114 CREATE_CONVERT_CONSTRUCTOR(uChar, sFloat, 1);
00115 CREATE_CONVERT_CONSTRUCTOR(uChar, uShort, 3);
00116 CREATE_CONVERT_CONSTRUCTOR(uChar, sShort, 3);
00117 CREATE_CONVERT_CONSTRUCTOR(uChar, sInt, 3);
00118 CREATE_CONVERT_CONSTRUCTOR(uChar, sFloat, 3);
00119 CREATE_CONVERT_CONSTRUCTOR(uShort, uChar, 1);
00120 CREATE_CONVERT_CONSTRUCTOR(uShort, sInt, 1);
00121 CREATE_CONVERT_CONSTRUCTOR(uShort, sFloat, 1);
00122 CREATE_CONVERT_CONSTRUCTOR(uShort, uChar, 3);
00123 CREATE_CONVERT_CONSTRUCTOR(uShort, sInt, 3);
00124 CREATE_CONVERT_CONSTRUCTOR(uShort, sFloat, 3);
00125 CREATE_CONVERT_CONSTRUCTOR(sShort, uChar, 1);
00126 CREATE_CONVERT_CONSTRUCTOR(sShort, sInt, 1);
00127 CREATE_CONVERT_CONSTRUCTOR(sShort, sFloat, 1);
00128 CREATE_CONVERT_CONSTRUCTOR(sShort, uChar, 3);
00129 CREATE_CONVERT_CONSTRUCTOR(sShort, sInt, 3);
00130 CREATE_CONVERT_CONSTRUCTOR(sShort, sFloat, 3);
00131 CREATE_CONVERT_CONSTRUCTOR(sInt, uChar, 1);
00132 CREATE_CONVERT_CONSTRUCTOR(sInt, uChar, 3);
00133 CREATE_CONVERT_CONSTRUCTOR(sFloat, uChar, 1);
00134 CREATE_CONVERT_CONSTRUCTOR(sFloat, uShort, 1);
00135 CREATE_CONVERT_CONSTRUCTOR(sFloat, sShort, 1);
00136 CREATE_CONVERT_CONSTRUCTOR(sFloat, uChar, 3);
00137 CREATE_CONVERT_CONSTRUCTOR(sFloat, uShort, 3);
00138 CREATE_CONVERT_CONSTRUCTOR(sFloat, sShort, 3);
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 #define CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(TYPE1, TYPE2) \
00159 template <> QVImage<TYPE2, 1>::QVImage(QVImage<TYPE1, 1> const &img):QVGenericImage(img) \
00160 { \
00161 imageBuffer = new QVImageBuffer<TYPE2, 1>(img.getCols(), img.getRows()); \
00162 QVIMAGE_PTR_INIT_WRITE(TYPE2, this); \
00163 QVIMAGE_INIT_READ(TYPE1, img); \
00164 for (int col = img.getROI().left(); col < img.getROI().right(); col++) \
00165 for (int row = img.getROI().top(); row < img.getROI().bottom(); row++) \
00166 QVIMAGE_PIXEL(this, col, row, 0) = QVIMAGE_PIXEL(img, col, row, 0); \
00167 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00168 }
00169
00170 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(uShort, sShort);
00171 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(sShort, uShort);
00172 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(sInt, uShort);
00173 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(sInt, sShort);
00174 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(sInt, sFloat);
00175 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_1(sFloat, sInt);
00176
00177 #define CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(TYPE1, TYPE2) \
00178 template <> QVImage<TYPE2, 3>::QVImage(QVImage<TYPE1, 3> const &img):QVGenericImage(img) \
00179 { \
00180 imageBuffer = new QVImageBuffer<TYPE2, 3>(img.getCols(), img.getRows()); \
00181 QVIMAGE_PTR_INIT_WRITE(TYPE2, this); \
00182 QVIMAGE_INIT_READ(TYPE1, img); \
00183 for (int col = img.getROI().left(); col < img.getROI().right(); col++) \
00184 for (int row = img.getROI().top(); row < img.getROI().bottom(); row++) \
00185 { \
00186 QVIMAGE_PIXEL(this, col, row, 0) = QVIMAGE_PIXEL(img, col, row, 0); \
00187 QVIMAGE_PIXEL(this, col, row, 1) = QVIMAGE_PIXEL(img, col, row, 1); \
00188 QVIMAGE_PIXEL(this, col, row, 2) = QVIMAGE_PIXEL(img, col, row, 2); \
00189 } \
00190 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00191 }
00192
00193 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(uShort, sShort);
00194 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(sShort, uShort);
00195 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(sInt, uShort);
00196 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(sInt, sShort);
00197 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(sInt, sFloat);
00198 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_3(sFloat, sInt);
00199
00200 #define CREATE_CONVERT_CONSTRUCTOR_C3_C1(TYPE) \
00201 template <> QVImage<TYPE, 1>::QVImage(QVImage<TYPE, 3> const &img):QVGenericImage(img) \
00202 { \
00203 imageBuffer = new QVImageBuffer<TYPE, 1>(img.getCols(), img.getRows()); \
00204 setAnchor(img.getROI().x(),img.getROI().y()); \
00205 RGBToGray(img, *this); \
00206 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00207 }
00208
00209 CREATE_CONVERT_CONSTRUCTOR_C3_C1(uChar);
00210 CREATE_CONVERT_CONSTRUCTOR_C3_C1(uShort);
00211 CREATE_CONVERT_CONSTRUCTOR_C3_C1(sShort);
00212 CREATE_CONVERT_CONSTRUCTOR_C3_C1(sFloat);
00213
00214 #define CREATE_CONVERT_CONSTRUCTOR_NO_IPP_C3_C1(TYPE) \
00215 template <> QVImage<TYPE, 1>::QVImage(QVImage<TYPE, 3> const &img):QVGenericImage(img) \
00216 { \
00217 imageBuffer = new QVImageBuffer<TYPE, 1>(img.getCols(), img.getRows()); \
00218 QVIMAGE_PTR_INIT_WRITE(TYPE, this); \
00219 QVIMAGE_INIT_READ(TYPE, img); \
00220 for (int col = img.getROI().left(); col < img.getROI().right(); col++) \
00221 for (int row = img.getROI().top(); row < img.getROI().bottom(); row++) \
00222 { \
00223 QVIMAGE_PIXEL(this, col, row, 0) = 0.299 * QVIMAGE_PIXEL(img, col, row, 0); \
00224 QVIMAGE_PIXEL(this, col, row, 0) += 0.587 * QVIMAGE_PIXEL(img, col, row, 1); \
00225 QVIMAGE_PIXEL(this, col, row, 0) += 0.114 * QVIMAGE_PIXEL(img, col, row, 2); \
00226 } \
00227 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00228 }
00229
00230 CREATE_CONVERT_CONSTRUCTOR_NO_IPP_C3_C1(sInt);
00231
00232 #define CREATE_CONVERT_CONSTRUCTOR_C1_C3(TYPE) \
00233 template <> QVImage<TYPE, 3>::QVImage(QVImage<TYPE, 1> const &img):QVGenericImage(img) \
00234 { \
00235 imageBuffer = new QVImageBuffer<TYPE, 3>(img.getCols(), img.getRows()); \
00236 setAnchor(img.getROI().x(),img.getROI().y()); \
00237 Copy(img, *this); \
00238 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00239 }
00240
00241 CREATE_CONVERT_CONSTRUCTOR_C1_C3(uChar);
00242 CREATE_CONVERT_CONSTRUCTOR_C1_C3(uShort);
00243 CREATE_CONVERT_CONSTRUCTOR_C1_C3(sShort);
00244 CREATE_CONVERT_CONSTRUCTOR_C1_C3(sInt);
00245 CREATE_CONVERT_CONSTRUCTOR_C1_C3(sFloat);
00246
00247
00248
00249 #define CREATE_OPERATOR(NAME, OPERATOR, TYPE, C) \
00250 template <> QVImage<TYPE, C> QVImage<TYPE,C>::OPERATOR(const QVImage<TYPE, C> &img) const \
00251 { \
00252 QVImage<TYPE, C> result = *this; \
00253 NAME(*this, img, result); \
00254 return result; \
00255 }
00256
00257 CREATE_OPERATOR(Add, operator+, uChar, 1);
00258 CREATE_OPERATOR(Mul, operator*, uChar, 1);
00259 CREATE_OPERATOR(Sub, operator-, uChar, 1);
00260 CREATE_OPERATOR(Div, operator/, uChar, 1);
00261 CREATE_OPERATOR(Add, operator+, uChar, 3);
00262 CREATE_OPERATOR(Mul, operator*, uChar, 3);
00263 CREATE_OPERATOR(Sub, operator-, uChar, 3);
00264 CREATE_OPERATOR(Div, operator/, uChar, 3);
00265
00266 CREATE_OPERATOR(Add, operator+, uShort, 1);
00267 CREATE_OPERATOR(Mul, operator*, uShort, 1);
00268 CREATE_OPERATOR(Sub, operator-, uShort, 1);
00269 CREATE_OPERATOR(Div, operator/, uShort, 1);
00270 CREATE_OPERATOR(Add, operator+, uShort, 3);
00271 CREATE_OPERATOR(Mul, operator*, uShort, 3);
00272 CREATE_OPERATOR(Sub, operator-, uShort, 3);
00273 CREATE_OPERATOR(Div, operator/, uShort, 3);
00274
00275 CREATE_OPERATOR(Add, operator+, sShort, 1);
00276 CREATE_OPERATOR(Mul, operator*, sShort, 1);
00277 CREATE_OPERATOR(Sub, operator-, sShort, 1);
00278 CREATE_OPERATOR(Div, operator/, sShort, 1);
00279 CREATE_OPERATOR(Add, operator+, sShort, 3);
00280 CREATE_OPERATOR(Mul, operator*, sShort, 3);
00281 CREATE_OPERATOR(Sub, operator-, sShort, 3);
00282 CREATE_OPERATOR(Div, operator/, sShort, 3);
00283
00284 #define CREATE_OPERATOR_INT_C1(OPERATOR, OPERATION, TYPE) \
00285 template <> QVImage<TYPE, 1> QVImage<TYPE, 1>::OPERATOR(const QVImage<TYPE, 1> &img) const \
00286 { \
00287 QVImage<TYPE, 1> result = *this; \
00288 QVIMAGE_PTR_INIT_READ(TYPE, this); \
00289 QVIMAGE_INIT_READ(TYPE, img); \
00290 QVIMAGE_INIT_WRITE(TYPE, result); \
00291 for (int col = result.getROI().left(); col < result.getROI().right(); col++) \
00292 for (int row = result.getROI().top(); row < result.getROI().bottom(); row++) \
00293 QVIMAGE_PIXEL(result, col, row, 0) = QVIMAGE_PIXEL(img, col, row, 0) OPERATION QVIMAGE_PIXEL(this, col, row, 0); \
00294 return result; \
00295 }
00296
00297 CREATE_OPERATOR_INT_C1(operator+, +, sInt);
00298 CREATE_OPERATOR_INT_C1(operator*, *, sInt);
00299 CREATE_OPERATOR_INT_C1(operator-, -, sInt);
00300 CREATE_OPERATOR_INT_C1(operator/, /, sInt);
00301
00302 #define CREATE_OPERATOR_INT_C3(OPERATOR, OPERATION, TYPE) \
00303 template <> QVImage<TYPE, 3> QVImage<TYPE, 3>::OPERATOR(const QVImage<TYPE, 3> &img) const \
00304 { \
00305 QVImage<TYPE, 3> result = *this; \
00306 QVIMAGE_PTR_INIT_READ(TYPE, this); \
00307 QVIMAGE_INIT_READ(TYPE, img); \
00308 QVIMAGE_INIT_WRITE(TYPE, result); \
00309 for (int col = result.getROI().left(); col < result.getROI().right(); col++) \
00310 for (int row = result.getROI().top(); row < result.getROI().bottom(); row++) \
00311 { \
00312 QVIMAGE_PIXEL(result, col, row, 0) = QVIMAGE_PIXEL(img, col, row, 0) OPERATION QVIMAGE_PIXEL(this, col, row, 0); \
00313 QVIMAGE_PIXEL(result, col, row, 1) = QVIMAGE_PIXEL(img, col, row, 1) OPERATION QVIMAGE_PIXEL(this, col, row, 1); \
00314 QVIMAGE_PIXEL(result, col, row, 2) = QVIMAGE_PIXEL(img, col, row, 2) OPERATION QVIMAGE_PIXEL(this, col, row, 2); \
00315 } \
00316 return result; \
00317 }
00318
00319 CREATE_OPERATOR_INT_C3(operator+, +, sInt);
00320 CREATE_OPERATOR_INT_C3(operator*, *, sInt);
00321 CREATE_OPERATOR_INT_C3(operator-, -, sInt);
00322 CREATE_OPERATOR_INT_C3(operator/, /, sInt);
00323
00324
00325 #define CREATE_CONST_OPERATOR(NAME, OPERATOR, TYPE, C) \
00326 template <> QVImage<TYPE, C> QVImage<TYPE,C>::OPERATOR(const TYPE value) const \
00327 { \
00328 QVImage<TYPE, C> result = *this; \
00329 NAME(*this, result, value); \
00330 return result; \
00331 }
00332
00333 CREATE_CONST_OPERATOR(AddC, operator+, uChar, 1);
00334 CREATE_CONST_OPERATOR(MulC, operator*, uChar, 1);
00335 CREATE_CONST_OPERATOR(SubC, operator-, uChar, 1);
00336 CREATE_CONST_OPERATOR(DivC, operator/, uChar, 1);
00337 CREATE_CONST_OPERATOR(AddC, operator+, uChar, 3);
00338 CREATE_CONST_OPERATOR(MulC, operator*, uChar, 3);
00339 CREATE_CONST_OPERATOR(SubC, operator-, uChar, 3);
00340 CREATE_CONST_OPERATOR(DivC, operator/, uChar, 3);
00341
00342 CREATE_CONST_OPERATOR(AddC, operator+, uShort, 1);
00343 CREATE_CONST_OPERATOR(MulC, operator*, uShort, 1);
00344 CREATE_CONST_OPERATOR(SubC, operator-, uShort, 1);
00345 CREATE_CONST_OPERATOR(DivC, operator/, uShort, 1);
00346 CREATE_CONST_OPERATOR(AddC, operator+, uShort, 3);
00347 CREATE_CONST_OPERATOR(MulC, operator*, uShort, 3);
00348 CREATE_CONST_OPERATOR(SubC, operator-, uShort, 3);
00349 CREATE_CONST_OPERATOR(DivC, operator/, uShort, 3);
00350
00351 CREATE_CONST_OPERATOR(AddC, operator+, sShort, 1);
00352 CREATE_CONST_OPERATOR(MulC, operator*, sShort, 1);
00353 CREATE_CONST_OPERATOR(SubC, operator-, sShort, 1);
00354 CREATE_CONST_OPERATOR(DivC, operator/, sShort, 1);
00355 CREATE_CONST_OPERATOR(AddC, operator+, sShort, 3);
00356 CREATE_CONST_OPERATOR(MulC, operator*, sShort, 3);
00357 CREATE_CONST_OPERATOR(SubC, operator-, sShort, 3);
00358 CREATE_CONST_OPERATOR(DivC, operator/, sShort, 3);
00359
00360 CREATE_CONST_OPERATOR(AddC, operator+, sFloat, 1);
00361 CREATE_CONST_OPERATOR(MulC, operator*, sFloat, 1);
00362 CREATE_CONST_OPERATOR(SubC, operator-, sFloat, 1);
00363 CREATE_CONST_OPERATOR(DivC, operator/, sFloat, 1);
00364 CREATE_CONST_OPERATOR(AddC, operator+, sFloat, 3);
00365 CREATE_CONST_OPERATOR(MulC, operator*, sFloat, 3);
00366 CREATE_CONST_OPERATOR(SubC, operator-, sFloat, 3);
00367 CREATE_CONST_OPERATOR(DivC, operator/, sFloat, 3);
00368
00369 CREATE_CONST_OPERATOR(LShiftC, operator<<, uChar, 1);
00370 CREATE_CONST_OPERATOR(RShiftC, operator>>, uChar, 1);
00371 CREATE_CONST_OPERATOR(LShiftC, operator<<, uChar, 3);
00372 CREATE_CONST_OPERATOR(RShiftC, operator>>, uChar, 3);
00373
00374 CREATE_CONST_OPERATOR(LShiftC, operator<<, uShort, 1);
00375 CREATE_CONST_OPERATOR(RShiftC, operator>>, uShort, 1);
00376 CREATE_CONST_OPERATOR(LShiftC, operator<<, uShort, 3);
00377 CREATE_CONST_OPERATOR(RShiftC, operator>>, uShort, 3);
00378
00379 CREATE_CONST_OPERATOR(LShiftC, operator<<, sInt, 1);
00380 CREATE_CONST_OPERATOR(RShiftC, operator>>, sInt, 1);
00381 CREATE_CONST_OPERATOR(LShiftC, operator<<, sInt, 3);
00382 CREATE_CONST_OPERATOR(RShiftC, operator>>, sInt, 3);
00383
00384 CREATE_CONST_OPERATOR(AndC, operator&, uChar, 1);
00385 CREATE_CONST_OPERATOR(OrC, operator|, uChar, 1);
00386 CREATE_CONST_OPERATOR(XorC, operator^, uChar, 1);
00387 CREATE_CONST_OPERATOR(AndC, operator&, uChar, 3);
00388 CREATE_CONST_OPERATOR(OrC, operator|, uChar, 3);
00389 CREATE_CONST_OPERATOR(XorC, operator^, uChar, 3);
00390
00391 CREATE_CONST_OPERATOR(AndC, operator&, uShort, 1);
00392 CREATE_CONST_OPERATOR(OrC, operator|, uShort, 1);
00393 CREATE_CONST_OPERATOR(XorC, operator^, uShort, 1);
00394 CREATE_CONST_OPERATOR(AndC, operator&, uShort, 3);
00395 CREATE_CONST_OPERATOR(OrC, operator|, uShort, 3);
00396 CREATE_CONST_OPERATOR(XorC, operator^, uShort, 3);
00397
00398 CREATE_CONST_OPERATOR(AndC, operator&, sInt, 1);
00399 CREATE_CONST_OPERATOR(OrC, operator|, sInt, 1);
00400 CREATE_CONST_OPERATOR(XorC, operator^, sInt, 1);
00401 CREATE_CONST_OPERATOR(AndC, operator&, sInt, 3);
00402 CREATE_CONST_OPERATOR(OrC, operator|, sInt, 3);
00403 CREATE_CONST_OPERATOR(XorC, operator^, sInt, 3);
00404
00405 #define CREATE_CONST_OPERATOR_INT_C1(OPERATOR, OPERATION, TYPE) \
00406 template <> QVImage<TYPE, 1> QVImage<TYPE, 1>::OPERATOR(const TYPE value) const \
00407 { \
00408 QVImage<TYPE, 1> result = *this; \
00409 QVIMAGE_PTR_INIT_READ(TYPE, this); \
00410 QVIMAGE_INIT_WRITE(TYPE, result); \
00411 for (int col = result.getROI().left(); col < result.getROI().right(); col++) \
00412 for (int row = result.getROI().top(); row < result.getROI().bottom(); row++) \
00413 QVIMAGE_PIXEL(result, col, row, 0) = QVIMAGE_PIXEL(this, col, row, 0) OPERATION value; \
00414 return result; \
00415 }
00416
00417 CREATE_CONST_OPERATOR_INT_C1(operator+, +, sInt);
00418 CREATE_CONST_OPERATOR_INT_C1(operator*, *, sInt);
00419 CREATE_CONST_OPERATOR_INT_C1(operator-, -, sInt);
00420 CREATE_CONST_OPERATOR_INT_C1(operator/, /, sInt);
00421
00422 #define CREATE_CONST_OPERATOR_INT_C3(OPERATOR, OPERATION, TYPE) \
00423 template <> QVImage<TYPE, 3> QVImage<TYPE, 3>::OPERATOR(const TYPE value) const \
00424 { \
00425 QVImage<TYPE, 3> result = *this; \
00426 QVIMAGE_PTR_INIT_READ(TYPE, this); \
00427 QVIMAGE_INIT_WRITE(TYPE, result); \
00428 for (int col = result.getROI().left(); col < result.getROI().right(); col++) \
00429 for (int row = result.getROI().top(); row < result.getROI().bottom(); row++) \
00430 { \
00431 QVIMAGE_PIXEL(result, col, row, 0) = QVIMAGE_PIXEL(this, col, row, 0) OPERATION value; \
00432 QVIMAGE_PIXEL(result, col, row, 1) = QVIMAGE_PIXEL(this, col, row, 1) OPERATION value; \
00433 QVIMAGE_PIXEL(result, col, row, 2) = QVIMAGE_PIXEL(this, col, row, 2) OPERATION value; \
00434 } \
00435 return result; \
00436 }
00437
00438 CREATE_CONST_OPERATOR_INT_C3(operator+, +, sInt);
00439 CREATE_CONST_OPERATOR_INT_C3(operator*, *, sInt);
00440 CREATE_CONST_OPERATOR_INT_C3(operator-, -, sInt);
00441 CREATE_CONST_OPERATOR_INT_C3(operator/, /, sInt);
00442
00443 #define CREATE_NOT_OPERATOR(NAME, OPERATOR, TYPE, C) \
00444 template <> QVImage<TYPE, C> QVImage<TYPE,C>::OPERATOR() const \
00445 { \
00446 QVImage<TYPE, C> result = *this; \
00447 NAME(*this, result); \
00448 return result; \
00449 }
00450
00451 CREATE_NOT_OPERATOR(Not, operator!, uChar, 1);
00452 CREATE_NOT_OPERATOR(Not, operator!, uChar, 3);
00453
00454 #define CREATE_COMPARE_OPERATOR(NAME, OPERATOR, CMP, TYPE, C) \
00455 template <> QVImage<uChar> QVImage<TYPE,C>::OPERATOR(const QVImage<TYPE, C> &img) const \
00456 { \
00457 QVImage<uChar> result(getCols(), getRows()); \
00458 NAME(*this, img, result, CMP); \
00459 return result; \
00460 }
00461
00462
00463 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, uChar, 1);
00464 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, uShort, 1);
00465 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sShort, 1);
00466 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sFloat, 1);
00467
00468 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, uChar, 3);
00469 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, uShort, 3);
00470 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sShort, 3);
00471 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sFloat, 3);
00472
00473
00474 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, uChar, 1);
00475 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, uShort, 1);
00476 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sShort, 1);
00477 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sFloat, 1);
00478
00479 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, uChar, 3);
00480 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, uShort, 3);
00481 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sShort, 3);
00482 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sFloat, 3);
00483
00484
00485 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, uChar, 1);
00486 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, uShort, 1);
00487 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sShort, 1);
00488 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sFloat, 1);
00489
00490 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, uChar, 3);
00491 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, uShort, 3);
00492 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sShort, 3);
00493 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sFloat, 3);
00494
00495
00496 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, uChar, 1);
00497 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, uShort, 1);
00498 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sShort, 1);
00499 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sFloat, 1);
00500
00501 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, uChar, 3);
00502 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, uShort, 3);
00503 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sShort, 3);
00504 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sFloat, 3);
00505
00506 #define CREATE_GENERIC_COMPARE_OPERATOR_C1(OPERATOR, OPERATION, TYPE1, TYPE2) \
00507 template <> QVImage<uChar> QVImage<TYPE1, 1>::OPERATOR(const QVImage<TYPE2, 1> &img) const \
00508 { \
00509 QVImage<uChar> result(getCols(), getRows()); \
00510 result.setROI(getROI()); result.setAnchor(getAnchor()); \
00511 QVIMAGE_PTR_INIT_READ(TYPE1, this); \
00512 QVIMAGE_INIT_READ(TYPE2, img); \
00513 QVIMAGE_INIT_WRITE(uChar, result); \
00514 for (int col = result.getROI().left(); col < result.getROI().right(); col++) \
00515 for (int row = result.getROI().top(); row < result.getROI().bottom(); row++) \
00516 if (QVIMAGE_PIXEL(this, col, row, 0) OPERATION QVIMAGE_PIXEL(img, col, row, 0)) \
00517 QVIMAGE_PIXEL(result, col, row, 0) = IPP_MAX_8U; \
00518 else QVIMAGE_PIXEL(result, col, row, 0) = 0; \
00519 return result; \
00520 }
00521
00522 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uChar, uShort);
00523 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uChar, uShort);
00524 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uChar, uShort);
00525 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uChar, uShort);
00526 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uChar, sShort);
00527 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uChar, sShort);
00528 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uChar, sShort);
00529 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uChar, sShort);
00530 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uChar, sInt);
00531 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uChar, sInt);
00532 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uChar, sInt);
00533 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uChar, sInt);
00534 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uChar, sFloat);
00535 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uChar, sFloat);
00536 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uChar, sFloat);
00537 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uChar, sFloat);
00538
00539 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uShort, uChar);
00540 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uShort, uChar);
00541 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uShort, uChar);
00542 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uShort, uChar);
00543 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uShort, sShort);
00544 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uShort, sShort);
00545 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uShort, sShort);
00546 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uShort, sShort);
00547 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uShort, sInt);
00548 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uShort, sInt);
00549 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uShort, sInt);
00550 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uShort, sInt);
00551 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, uShort, sFloat);
00552 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, uShort, sFloat);
00553 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, uShort, sFloat);
00554 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, uShort, sFloat);
00555
00556 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sShort, uChar);
00557 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sShort, uChar);
00558 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sShort, uChar);
00559 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sShort, uChar);
00560 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sShort, uShort);
00561 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sShort, uShort);
00562 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sShort, uShort);
00563 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sShort, uShort);
00564 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sShort, sInt);
00565 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sShort, sInt);
00566 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sShort, sInt);
00567 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sShort, sInt);
00568 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sShort, sFloat);
00569 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sShort, sFloat);
00570 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sShort, sFloat);
00571 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sShort, sFloat);
00572
00573 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sInt, uChar);
00574 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sInt, uChar);
00575 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sInt, uChar);
00576 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sInt, uChar);
00577 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sInt, uShort);
00578 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sInt, uShort);
00579 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sInt, uShort);
00580 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sInt, uShort);
00581 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sInt, sShort);
00582 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sInt, sShort);
00583 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sInt, sShort);
00584 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sInt, sShort);
00585 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sInt, sInt);
00586 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sInt, sInt);
00587 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sInt, sInt);
00588 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sInt, sInt);
00589 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sInt, sFloat);
00590 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sInt, sFloat);
00591 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sInt, sFloat);
00592 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sInt, sFloat);
00593
00594 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sFloat, uChar);
00595 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sFloat, uChar);
00596 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sFloat, uChar);
00597 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sFloat, uChar);
00598 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sFloat, uShort);
00599 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sFloat, uShort);
00600 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sFloat, uShort);
00601 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sFloat, uShort);
00602 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sFloat, sShort);
00603 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sFloat, sShort);
00604 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sFloat, sShort);
00605 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sFloat, sShort);
00606 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<, <, sFloat, sInt);
00607 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>, >, sFloat, sInt);
00608 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator<=, <=, sFloat, sInt);
00609 CREATE_GENERIC_COMPARE_OPERATOR_C1(operator>=, >=, sFloat, sInt);
00610
00611
00612 #define CREATE_GENERIC_COMPARE_OPERATOR_C3(OPERATOR, OPERATION, TYPE1, TYPE2) \
00613 template <> QVImage<uChar> QVImage<TYPE1, 3>::OPERATOR(const QVImage<TYPE2, 3> &img) const \
00614 { \
00615 QVImage<uChar> result(getCols(), getRows()); \
00616 result.setROI(getROI()); result.setAnchor(getAnchor()); \
00617 QVIMAGE_PTR_INIT_READ(TYPE1, this); \
00618 QVIMAGE_INIT_READ(TYPE2, img); \
00619 QVIMAGE_INIT_WRITE(uChar, result); \
00620 for (int col = result.getROI().left(); col < result.getROI().right(); col++) \
00621 for (int row = result.getROI().top(); row < result.getROI().bottom(); row++) \
00622 { \
00623 if( (QVIMAGE_PIXEL(this, col, row, 0) OPERATION QVIMAGE_PIXEL(img, col, row, 0)) && \
00624 (QVIMAGE_PIXEL(this, col, row, 1) OPERATION QVIMAGE_PIXEL(img, col, row, 1)) && \
00625 (QVIMAGE_PIXEL(this, col, row, 2) OPERATION QVIMAGE_PIXEL(img, col, row, 2)) ) \
00626 QVIMAGE_PIXEL(result, col, row, 0) = IPP_MAX_8U; \
00627 else QVIMAGE_PIXEL(result, col, row, 0) = 0; \
00628 } \
00629 return result; \
00630 }
00631
00632 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uChar, uShort);
00633 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uChar, uShort);
00634 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uChar, uShort);
00635 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uChar, uShort);
00636 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uChar, sShort);
00637 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uChar, sShort);
00638 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uChar, sShort);
00639 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uChar, sShort);
00640 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uChar, sInt);
00641 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uChar, sInt);
00642 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uChar, sInt);
00643 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uChar, sInt);
00644 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uChar, sFloat);
00645 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uChar, sFloat);
00646 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uChar, sFloat);
00647 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uChar, sFloat);
00648
00649 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uShort, uChar);
00650 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uShort, uChar);
00651 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uShort, uChar);
00652 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uShort, uChar);
00653 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uShort, sShort);
00654 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uShort, sShort);
00655 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uShort, sShort);
00656 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uShort, sShort);
00657 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uShort, sInt);
00658 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uShort, sInt);
00659 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uShort, sInt);
00660 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uShort, sInt);
00661 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, uShort, sFloat);
00662 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, uShort, sFloat);
00663 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, uShort, sFloat);
00664 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, uShort, sFloat);
00665
00666 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sShort, uChar);
00667 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sShort, uChar);
00668 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sShort, uChar);
00669 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sShort, uChar);
00670 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sShort, uShort);
00671 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sShort, uShort);
00672 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sShort, uShort);
00673 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sShort, uShort);
00674 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sShort, sInt);
00675 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sShort, sInt);
00676 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sShort, sInt);
00677 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sShort, sInt);
00678 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sShort, sFloat);
00679 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sShort, sFloat);
00680 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sShort, sFloat);
00681 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sShort, sFloat);
00682
00683 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sInt, uChar);
00684 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sInt, uChar);
00685 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sInt, uChar);
00686 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sInt, uChar);
00687 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sInt, uShort);
00688 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sInt, uShort);
00689 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sInt, uShort);
00690 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sInt, uShort);
00691 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sInt, sShort);
00692 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sInt, sShort);
00693 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sInt, sShort);
00694 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sInt, sShort);
00695 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sInt, sInt);
00696 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sInt, sInt);
00697 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sInt, sInt);
00698 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sInt, sInt);
00699 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sInt, sFloat);
00700 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sInt, sFloat);
00701 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sInt, sFloat);
00702 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sInt, sFloat);
00703
00704 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sFloat, uChar);
00705 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sFloat, uChar);
00706 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sFloat, uChar);
00707 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sFloat, uChar);
00708 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sFloat, uShort);
00709 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sFloat, uShort);
00710 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sFloat, uShort);
00711 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sFloat, uShort);
00712 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sFloat, sShort);
00713 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sFloat, sShort);
00714 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sFloat, sShort);
00715 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sFloat, sShort);
00716 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<, <, sFloat, sInt);
00717 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>, >, sFloat, sInt);
00718 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator<=, <=, sFloat, sInt);
00719 CREATE_GENERIC_COMPARE_OPERATOR_C3(operator>=, >=, sFloat, sInt);
00720
00721
00722
00723 #define CREATE_SET_FUNCTION_C1(TYPE) \
00724 template <> void QVImage<TYPE>::set(TYPE c1, TYPE, TYPE) \
00725 { Set(*this, c1); }
00726
00727 CREATE_SET_FUNCTION_C1(uChar);
00728 CREATE_SET_FUNCTION_C1(uShort);
00729 CREATE_SET_FUNCTION_C1(sShort);
00730 CREATE_SET_FUNCTION_C1(sInt);
00731 CREATE_SET_FUNCTION_C1(sFloat);
00732
00733 #define CREATE_SET_FUNCTION_C3(TYPE) \
00734 template <> void QVImage<TYPE,3>::set(TYPE c1, TYPE c2, TYPE c3) \
00735 { Set(*this, c1, c2, c3); }
00736
00737 CREATE_SET_FUNCTION_C3(uChar);
00738 CREATE_SET_FUNCTION_C3(uShort);
00739 CREATE_SET_FUNCTION_C3(sShort);
00740 CREATE_SET_FUNCTION_C3(sInt);
00741 CREATE_SET_FUNCTION_C3(sFloat);
00742
00743
00745
00746 #define CREATE_CONVERT_OPERATOR(TYPE1, TYPE2, C) \
00747 template <> QVImage<TYPE2, C> & QVImage<TYPE2, C>::operator=(const QVImage<TYPE1, C> &img) \
00748 { \
00749 imageBuffer = new QVImageBuffer<TYPE2, C>(img.getCols(), img.getRows()); \
00750 setAnchor(img.getROI().x(),img.getROI().y()); \
00751 Convert(img, *this); \
00752 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00753 return *this; \
00754 }
00755
00756 CREATE_CONVERT_OPERATOR(uChar, uShort, 1);
00757 CREATE_CONVERT_OPERATOR(uChar, sShort, 1);
00758 CREATE_CONVERT_OPERATOR(uChar, sInt, 1);
00759 CREATE_CONVERT_OPERATOR(uChar, sFloat, 1);
00760 CREATE_CONVERT_OPERATOR(uChar, uShort, 3);
00761 CREATE_CONVERT_OPERATOR(uChar, sShort, 3);
00762 CREATE_CONVERT_OPERATOR(uChar, sInt, 3);
00763 CREATE_CONVERT_OPERATOR(uChar, sFloat, 3);
00764 CREATE_CONVERT_OPERATOR(uShort, uChar, 1);
00765 CREATE_CONVERT_OPERATOR(uShort, sInt, 1);
00766 CREATE_CONVERT_OPERATOR(uShort, sFloat, 1);
00767 CREATE_CONVERT_OPERATOR(uShort, uChar, 3);
00768 CREATE_CONVERT_OPERATOR(uShort, sInt, 3);
00769 CREATE_CONVERT_OPERATOR(uShort, sFloat, 3);
00770 CREATE_CONVERT_OPERATOR(sShort, uChar, 1);
00771 CREATE_CONVERT_OPERATOR(sShort, sInt, 1);
00772 CREATE_CONVERT_OPERATOR(sShort, sFloat, 1);
00773 CREATE_CONVERT_OPERATOR(sShort, uChar, 3);
00774 CREATE_CONVERT_OPERATOR(sShort, sInt, 3);
00775 CREATE_CONVERT_OPERATOR(sShort, sFloat, 3);
00776 CREATE_CONVERT_OPERATOR(sInt, uChar, 1);
00777 CREATE_CONVERT_OPERATOR(sInt, uChar, 3);
00778 CREATE_CONVERT_OPERATOR(sFloat, uChar, 1);
00779 CREATE_CONVERT_OPERATOR(sFloat, uShort, 1);
00780 CREATE_CONVERT_OPERATOR(sFloat, sShort, 1);
00781 CREATE_CONVERT_OPERATOR(sFloat, uChar, 3);
00782 CREATE_CONVERT_OPERATOR(sFloat, uShort, 3);
00783 CREATE_CONVERT_OPERATOR(sFloat, sShort, 3);
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804 #define CREATE_CONVERT_OPERATOR_NO_IPP_1(TYPE1, TYPE2) \
00805 template <> QVImage<TYPE2, 1> & QVImage<TYPE2, 1>::operator=(const QVImage<TYPE1, 1> &img) \
00806 { \
00807 imageBuffer = new QVImageBuffer<TYPE2, 1>(img.getCols(), img.getRows()); \
00808 QVIMAGE_PTR_INIT_WRITE(TYPE2, this); \
00809 QVIMAGE_INIT_READ(TYPE1, img); \
00810 for (int col = img.getROI().left(); col < img.getROI().right(); col++) \
00811 for (int row = img.getROI().top(); row < img.getROI().bottom(); row++) \
00812 QVIMAGE_PIXEL(this, col, row, 0) = QVIMAGE_PIXEL(img, col, row, 0); \
00813 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00814 return *this; \
00815 }
00816
00817 CREATE_CONVERT_OPERATOR_NO_IPP_1(uShort, sShort);
00818 CREATE_CONVERT_OPERATOR_NO_IPP_1(sShort, uShort);
00819 CREATE_CONVERT_OPERATOR_NO_IPP_1(sInt, uShort);
00820 CREATE_CONVERT_OPERATOR_NO_IPP_1(sInt, sShort);
00821 CREATE_CONVERT_OPERATOR_NO_IPP_1(sInt, sFloat);
00822 CREATE_CONVERT_OPERATOR_NO_IPP_1(sFloat, sInt);
00823
00824 #define CREATE_CONVERT_OPERATOR_NO_IPP_3(TYPE1, TYPE2) \
00825 template <> QVImage<TYPE2, 3> & QVImage<TYPE2, 3>::operator=(const QVImage<TYPE1, 3> &img) \
00826 { \
00827 imageBuffer = new QVImageBuffer<TYPE2, 3>(img.getCols(), img.getRows()); \
00828 QVIMAGE_PTR_INIT_WRITE(TYPE2, this); \
00829 QVIMAGE_INIT_READ(TYPE1, img); \
00830 for (int col = img.getROI().left(); col < img.getROI().right(); col++) \
00831 for (int row = img.getROI().top(); row < img.getROI().bottom(); row++) \
00832 { \
00833 QVIMAGE_PIXEL(this, col, row, 0) = QVIMAGE_PIXEL(img, col, row, 0); \
00834 QVIMAGE_PIXEL(this, col, row, 1) = QVIMAGE_PIXEL(img, col, row, 1); \
00835 QVIMAGE_PIXEL(this, col, row, 2) = QVIMAGE_PIXEL(img, col, row, 2); \
00836 } \
00837 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00838 return *this; \
00839 }
00840
00841 CREATE_CONVERT_OPERATOR_NO_IPP_3(uShort, sShort);
00842 CREATE_CONVERT_OPERATOR_NO_IPP_3(sShort, uShort);
00843 CREATE_CONVERT_OPERATOR_NO_IPP_3(sInt, uShort);
00844 CREATE_CONVERT_OPERATOR_NO_IPP_3(sInt, sShort);
00845 CREATE_CONVERT_OPERATOR_NO_IPP_3(sInt, sFloat);
00846 CREATE_CONVERT_OPERATOR_NO_IPP_3(sFloat, sInt);
00847
00848 #define CREATE_CONVERT_OPERATOR_C3_C1(TYPE) \
00849 template <> QVImage<TYPE, 1> & QVImage<TYPE, 1>::operator=(const QVImage<TYPE, 3> &img) \
00850 { \
00851 imageBuffer = new QVImageBuffer<TYPE, 1>(img.getCols(), img.getRows()); \
00852 setAnchor(img.getROI().x(),img.getROI().y()); \
00853 RGBToGray(img, *this); \
00854 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00855 return *this; \
00856 }
00857
00858 CREATE_CONVERT_OPERATOR_C3_C1(uChar);
00859 CREATE_CONVERT_OPERATOR_C3_C1(uShort);
00860 CREATE_CONVERT_OPERATOR_C3_C1(sShort);
00861 CREATE_CONVERT_OPERATOR_C3_C1(sFloat);
00862
00863 #define CREATE_CONVERT_OPERATOR_NO_IPP_C3_C1(TYPE) \
00864 template <> QVImage<TYPE, 1> & QVImage<TYPE, 1>::operator=(const QVImage<TYPE, 3> &img) \
00865 { \
00866 imageBuffer = new QVImageBuffer<TYPE, 1>(img.getCols(), img.getRows()); \
00867 QVIMAGE_PTR_INIT_WRITE(TYPE, this); \
00868 QVIMAGE_INIT_READ(TYPE, img); \
00869 for (int col = img.getROI().left(); col < img.getROI().right(); col++) \
00870 for (int row = img.getROI().top(); row < img.getROI().bottom(); row++) \
00871 { \
00872 QVIMAGE_PIXEL(this, col, row, 0) = 0.299 * QVIMAGE_PIXEL(img, col, row, 0); \
00873 QVIMAGE_PIXEL(this, col, row, 0) += 0.587 * QVIMAGE_PIXEL(img, col, row, 1); \
00874 QVIMAGE_PIXEL(this, col, row, 0) += 0.114 * QVIMAGE_PIXEL(img, col, row, 2); \
00875 } \
00876 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00877 return *this; \
00878 }
00879
00880 CREATE_CONVERT_OPERATOR_NO_IPP_C3_C1(sInt);
00881
00882 #define CREATE_CONVERT_OPERATOR_C1_C3(TYPE) \
00883 template <> QVImage<TYPE, 3> & QVImage<TYPE, 3>::operator=(const QVImage<TYPE, 1> &img) \
00884 { \
00885 imageBuffer = new QVImageBuffer<TYPE, 3>(img.getCols(), img.getRows()); \
00886 setAnchor(img.getROI().x(),img.getROI().y()); \
00887 Copy(img, *this); \
00888 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00889 return *this; \
00890 }
00891
00892 CREATE_CONVERT_OPERATOR_C1_C3(uChar);
00893 CREATE_CONVERT_OPERATOR_C1_C3(uShort);
00894 CREATE_CONVERT_OPERATOR_C1_C3(sShort);
00895 CREATE_CONVERT_OPERATOR_C1_C3(sInt);
00896 CREATE_CONVERT_OPERATOR_C1_C3(sFloat);
00897
00898
00899
00900 #define CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(TYPE1, TYPE2) \
00901 template <> QVImage<TYPE2, 1>::QVImage(QVImage<TYPE1, 3> const &img):QVGenericImage(img) \
00902 { \
00903 *this = QVImage<TYPE2, 3>(img); \
00904 }
00905
00906 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uChar, uShort);
00907 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uChar, sShort);
00908 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uChar, sInt);
00909 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uChar, sFloat);
00910 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uShort, uChar);
00911 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uShort, sShort);
00912 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uShort, sInt);
00913 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(uShort, sFloat);
00914 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sShort, uChar);
00915 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sShort, uShort);
00916 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sShort, sInt);
00917 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sShort, sFloat);
00918 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sInt, uChar);
00919 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sInt, uShort);
00920 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sInt, sShort);
00921 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sInt, sFloat);
00922 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sFloat, uChar);
00923 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sFloat, uShort);
00924 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sFloat, sShort);
00925 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C3_C1(sFloat, sInt);
00926
00927 #define CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(TYPE1, TYPE2) \
00928 template <> QVImage<TYPE2, 3>::QVImage(QVImage<TYPE1, 1> const &img):QVGenericImage(img) \
00929 { \
00930 *this = QVImage<TYPE2, 1>(img); \
00931 }
00932
00933 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uChar, uShort);
00934 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uChar, sShort);
00935 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uChar, sInt);
00936 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uChar, sFloat);
00937 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uShort, uChar);
00938 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uShort, sShort);
00939 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uShort, sInt);
00940 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(uShort, sFloat);
00941 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sShort, uChar);
00942 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sShort, uShort);
00943 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sShort, sInt);
00944 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sShort, sFloat);
00945 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sInt, uChar);
00946 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sInt, uShort);
00947 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sInt, sShort);
00948 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sInt, sFloat);
00949 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sFloat, uChar);
00950 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sFloat, uShort);
00951 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sFloat, sShort);
00952 CREATE_CONVERT_CONSTRUCTOR_DOUBLE_C1_C3(sFloat, sInt);
00953
00954
00955 #define CREATE_ACCESS_CONSTRUCTOR(OPERATOR, TYPE, C) \
00956 template <> QVImage<TYPE, 1> QVImage<TYPE, C>::OPERATOR(const uInt channel) const \
00957 { \
00958 QVImage<TYPE, 1> result(getCols(), getRows()); \
00959 Copy(*this, result, channel); \
00960 result.setROI(getROI()); result.setAnchor(getAnchor()); \
00961 return result; \
00962 }
00963
00964 CREATE_ACCESS_CONSTRUCTOR(operator(), uChar, 1);
00965 CREATE_ACCESS_CONSTRUCTOR(operator(), uChar, 3);
00966 CREATE_ACCESS_CONSTRUCTOR(operator(), uShort, 1);
00967 CREATE_ACCESS_CONSTRUCTOR(operator(), uShort, 3);
00968 CREATE_ACCESS_CONSTRUCTOR(operator(), sShort, 1);
00969 CREATE_ACCESS_CONSTRUCTOR(operator(), sShort, 3);
00970 CREATE_ACCESS_CONSTRUCTOR(operator(), sInt, 1);
00971 CREATE_ACCESS_CONSTRUCTOR(operator(), sInt, 3);
00972 CREATE_ACCESS_CONSTRUCTOR(operator(), sFloat, 1);
00973 CREATE_ACCESS_CONSTRUCTOR(operator(), sFloat, 3);
00974
00975
00976
00977