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<sShort,1>::getTypeQString() const { return "QVImage<sShort,1>"; }
00031 template <> const char * QVImage<sShort,3>::getTypeQString() const { return "QVImage<sShort,3>"; }
00032 template <> const char * QVImage<sFloat,1>::getTypeQString() const { return "QVImage<sFloat,1>"; }
00033 template <> const char * QVImage<sFloat,3>::getTypeQString() const { return "QVImage<sFloat,3>"; }
00034
00035
00036 #define CREATE_COPY_CONSTRUCTOR(TYPE, C) \
00037 template <> QVImage<TYPE, C>::QVImage(QVImage<TYPE, C> const &img):QVGenericImage(img) \
00038 { \
00039 imageBuffer = img.imageBuffer; \
00040 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00041 }
00042
00043 CREATE_COPY_CONSTRUCTOR(uChar, 1);
00044 CREATE_COPY_CONSTRUCTOR(uChar, 3);
00045 CREATE_COPY_CONSTRUCTOR(sShort, 1);
00046 CREATE_COPY_CONSTRUCTOR(sShort, 3);
00047 CREATE_COPY_CONSTRUCTOR(sFloat, 1);
00048 CREATE_COPY_CONSTRUCTOR(sFloat, 3);
00049
00050
00051 #define CREATE_COPY_OPERATOR(TYPE, C) \
00052 template <> QVImage<TYPE,C> & QVImage<TYPE, C>::operator=(const QVImage<TYPE, C> &img) \
00053 { \
00054 imageBuffer = img.imageBuffer; \
00055 setROI(img.getROI()); setAnchor(img.getAnchor()); \
00056 return *this; \
00057 }
00058
00059 CREATE_COPY_OPERATOR(uChar, 1);
00060 CREATE_COPY_OPERATOR(uChar, 3);
00061 CREATE_COPY_OPERATOR(sShort, 1);
00062 CREATE_COPY_OPERATOR(sShort, 3);
00063 CREATE_COPY_OPERATOR(sFloat, 1);
00064 CREATE_COPY_OPERATOR(sFloat, 3);
00065
00067
00068 #include <qvipp/qvipp.h>
00069
00070
00071 #define CREATE_CONVERT_CONSTRUCTOR(TYPE1, C1, TYPE2, C2) \
00072 template <> QVImage<TYPE1, C1>::QVImage(QVImage<TYPE2, C2> const &img):QVGenericImage(img) \
00073 { \
00074 imageBuffer = new QVImageBuffer<TYPE1, C1>(img.getCols(), img.getRows()); \
00075 setAnchor(img.getROI().x(),img.getROI().y()); \
00076 qvipp::Convert(img, *this); \
00077 setAnchor(img.getAnchor()); \
00078 }
00079
00080 CREATE_CONVERT_CONSTRUCTOR(uChar, 1, sShort, 1);
00081 CREATE_CONVERT_CONSTRUCTOR(uChar, 1, sFloat, 1);
00082 CREATE_CONVERT_CONSTRUCTOR(sShort, 1, uChar, 1);
00083 CREATE_CONVERT_CONSTRUCTOR(sShort, 1, sFloat, 1);
00084 CREATE_CONVERT_CONSTRUCTOR(sFloat, 1, uChar, 1);
00085 CREATE_CONVERT_CONSTRUCTOR(sFloat, 1, sShort, 1);
00086
00087 CREATE_CONVERT_CONSTRUCTOR(uChar, 3, sShort, 3);
00088 CREATE_CONVERT_CONSTRUCTOR(uChar, 3, sFloat, 3);
00089 CREATE_CONVERT_CONSTRUCTOR(sShort, 3, uChar, 3);
00090 CREATE_CONVERT_CONSTRUCTOR(sShort, 3, sFloat, 3);
00091 CREATE_CONVERT_CONSTRUCTOR(sFloat, 3, uChar, 3);
00092 CREATE_CONVERT_CONSTRUCTOR(sFloat, 3, sShort, 3);
00093
00094 #define CREATE_CONVERT_CONSTRUCTOR_C3_C1(TYPE) \
00095 template <> QVImage<TYPE, 1>::QVImage(QVImage<TYPE, 3> const &img):QVGenericImage(img) \
00096 { \
00097 imageBuffer = new QVImageBuffer<TYPE, 1>(img.getCols(), img.getRows()); \
00098 setAnchor(img.getROI().x(),img.getROI().y()); \
00099 qvipp::RGBToGray(img, *this); \
00100 setAnchor(img.getAnchor()); \
00101 }
00102
00103 CREATE_CONVERT_CONSTRUCTOR_C3_C1(uChar);
00104 CREATE_CONVERT_CONSTRUCTOR_C3_C1(sShort);
00105 CREATE_CONVERT_CONSTRUCTOR_C3_C1(sFloat);
00106
00107 #define CREATE_CONVERT_CONSTRUCTOR_C1_C3(TYPE) \
00108 template <> QVImage<TYPE, 3>::QVImage(QVImage<TYPE, 1> const &img):QVGenericImage(img) \
00109 { \
00110 imageBuffer = new QVImageBuffer<TYPE, 3>(img.getCols(), img.getRows()); \
00111 setAnchor(img.getROI().x(),img.getROI().y()); \
00112 qvipp::Copy(img, *this); \
00113 setAnchor(img.getAnchor()); \
00114 }
00115
00116 CREATE_CONVERT_CONSTRUCTOR_C1_C3(uChar);
00117 CREATE_CONVERT_CONSTRUCTOR_C1_C3(sShort);
00118 CREATE_CONVERT_CONSTRUCTOR_C1_C3(sFloat);
00119
00120
00121 #define CREATE_OPERATOR(NAME, OPERATOR, TYPE, C) \
00122 template <> QVImage<TYPE, C> QVImage<TYPE,C>::OPERATOR(const QVImage<TYPE, C> &img) const \
00123 { \
00124 QVImage<TYPE, C> result = *this; \
00125 qvipp::NAME(*this, img, result); \
00126 return result; \
00127 }
00128
00129 CREATE_OPERATOR(Add, operator+, uChar, 1);
00130 CREATE_OPERATOR(Mul, operator*, uChar, 1);
00131 CREATE_OPERATOR(Sub, operator-, uChar, 1);
00132 CREATE_OPERATOR(Div, operator/, uChar, 1);
00133
00134 CREATE_OPERATOR(Add, operator+, uChar, 3);
00135 CREATE_OPERATOR(Mul, operator*, uChar, 3);
00136 CREATE_OPERATOR(Sub, operator-, uChar, 3);
00137 CREATE_OPERATOR(Div, operator/, uChar, 3);
00138
00139 CREATE_OPERATOR(Add, operator+, sShort, 1);
00140 CREATE_OPERATOR(Mul, operator*, sShort, 1);
00141 CREATE_OPERATOR(Sub, operator-, sShort, 1);
00142 CREATE_OPERATOR(Div, operator/, sShort, 1);
00143
00144 CREATE_OPERATOR(Add, operator+, sShort, 3);
00145 CREATE_OPERATOR(Mul, operator*, sShort, 3);
00146 CREATE_OPERATOR(Sub, operator-, sShort, 3);
00147 CREATE_OPERATOR(Div, operator/, sShort, 3);
00148
00149
00150 #define CREATE_CONST_OPERATOR(NAME, OPERATOR, TYPE, C) \
00151 template <> QVImage<TYPE, C> QVImage<TYPE,C>::OPERATOR(const TYPE value) const \
00152 { \
00153 QVImage<TYPE, C> result = *this; \
00154 qvipp::NAME(*this, result, value); \
00155 return result; \
00156 }
00157
00158 CREATE_CONST_OPERATOR(AddC, operator+, uChar, 1);
00159 CREATE_CONST_OPERATOR(AddC, operator+, sShort, 1);
00160 CREATE_CONST_OPERATOR(AddC, operator+, sFloat, 1);
00161
00162 CREATE_CONST_OPERATOR(MulC, operator*, uChar, 1);
00163 CREATE_CONST_OPERATOR(MulC, operator*, sShort, 1);
00164 CREATE_CONST_OPERATOR(MulC, operator*, sFloat, 1);
00165
00166 CREATE_CONST_OPERATOR(SubC, operator-, uChar, 1);
00167 CREATE_CONST_OPERATOR(SubC, operator-, sShort, 1);
00168 CREATE_CONST_OPERATOR(SubC, operator-, sFloat, 1);
00169
00170 CREATE_CONST_OPERATOR(DivC, operator/, uChar, 1);
00171 CREATE_CONST_OPERATOR(DivC, operator/, sShort, 1);
00172 CREATE_CONST_OPERATOR(DivC, operator/, sFloat, 1);
00173
00174 CREATE_CONST_OPERATOR(LShiftC, operator<<, uChar, 1);
00175 CREATE_CONST_OPERATOR(RShiftC, operator>>, uChar, 1);
00176
00177 CREATE_CONST_OPERATOR(AndC, operator&, uChar, 1);
00178 CREATE_CONST_OPERATOR(OrC, operator|, uChar, 1);
00179 CREATE_CONST_OPERATOR(XorC, operator^, uChar, 1);
00180
00181 #define CREATE_NOT_OPERATOR(NAME, OPERATOR, TYPE, C) \
00182 template <> QVImage<TYPE, C> QVImage<TYPE,C>::OPERATOR() const \
00183 { \
00184 QVImage<TYPE, C> result = *this; \
00185 qvipp::NAME(*this, result); \
00186 return result; \
00187 }
00188
00189 CREATE_NOT_OPERATOR(Not, operator!, uChar, 1);
00190 CREATE_NOT_OPERATOR(Not, operator!, uChar, 3);
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 #define CREATE_COMPARE_OPERATOR(NAME, OPERATOR, CMP, TYPE, C) \
00203 template <> QVImage<uChar> QVImage<TYPE,C>::OPERATOR(const QVImage<TYPE, C> &img) const \
00204 { \
00205 QVImage<uChar> result(getCols(), getRows()); \
00206 qvipp::NAME(*this, img, result, CMP); \
00207 return result; \
00208 }
00209
00210
00211 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, uChar, 1);
00212 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sShort, 1);
00213 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sFloat, 1);
00214
00215 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, uChar, 3);
00216 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sShort, 3);
00217 CREATE_COMPARE_OPERATOR(Compare, operator<, ippCmpLess, sFloat, 3);
00218
00219
00220 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, uChar, 1);
00221 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sShort, 1);
00222 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sFloat, 1);
00223
00224 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, uChar, 3);
00225 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sShort, 3);
00226 CREATE_COMPARE_OPERATOR(Compare, operator>, ippCmpGreater, sFloat, 3);
00227
00228
00229 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, uChar, 1);
00230 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sShort, 1);
00231 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sFloat, 1);
00232
00233 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, uChar, 3);
00234 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sShort, 3);
00235 CREATE_COMPARE_OPERATOR(Compare, operator<=, ippCmpLessEq, sFloat, 3);
00236
00237
00238 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, uChar, 1);
00239 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sShort, 1);
00240 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sFloat, 1);
00241
00242 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, uChar, 3);
00243 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sShort, 3);
00244 CREATE_COMPARE_OPERATOR(Compare, operator>=, ippCmpGreaterEq, sFloat, 3);
00245
00246
00247
00248 #define CREATE_SET_FUNCTION_C1(TYPE) \
00249 template <> void QVImage<TYPE>::set(TYPE c1, TYPE, TYPE) \
00250 { qvipp::Set(*this, c1); }
00251
00252 CREATE_SET_FUNCTION_C1(uChar);
00253 CREATE_SET_FUNCTION_C1(sShort);
00254 CREATE_SET_FUNCTION_C1(sFloat);
00255
00256 #define CREATE_SET_FUNCTION_C3(TYPE) \
00257 template <> void QVImage<TYPE,3>::set(TYPE c1, TYPE c2, TYPE c3) \
00258 { qvipp::Set(*this, c1, c2, c3); }
00259
00260 CREATE_SET_FUNCTION_C3(uChar);
00261 CREATE_SET_FUNCTION_C3(sShort);
00262 CREATE_SET_FUNCTION_C3(sFloat);
00263
00264
00266
00267 #define CREATE_CONVERT_OPERATOR(TYPE1, TYPE2, C) \
00268 template <> QVImage<TYPE1, C> & QVImage<TYPE1, C>::operator=(const QVImage<TYPE2, C> &img) \
00269 { \
00270 imageBuffer = new QVImageBuffer<TYPE1, C>(img.getCols(), img.getRows()); \
00271 setAnchor(img.getROI().x(),img.getROI().y()); \
00272 qvipp::Convert(img, *this); \
00273 setAnchor(img.getAnchor()); \
00274 return *this; \
00275 }
00276
00277 CREATE_CONVERT_OPERATOR(uChar, sFloat, 1);
00278 CREATE_CONVERT_OPERATOR(uChar, sShort, 1);
00279 CREATE_CONVERT_OPERATOR(sShort, uChar, 1);
00280 CREATE_CONVERT_OPERATOR(sShort, sFloat, 1);
00281 CREATE_CONVERT_OPERATOR(sFloat, uChar, 1);
00282 CREATE_CONVERT_OPERATOR(sFloat, sShort, 1);
00283
00284 CREATE_CONVERT_OPERATOR(uChar, sFloat, 3);
00285 CREATE_CONVERT_OPERATOR(uChar, sShort, 3);
00286 CREATE_CONVERT_OPERATOR(sShort, uChar, 3);
00287 CREATE_CONVERT_OPERATOR(sShort, sFloat, 3);
00288 CREATE_CONVERT_OPERATOR(sFloat, uChar, 3);
00289 CREATE_CONVERT_OPERATOR(sFloat, sShort, 3);
00290
00291 #define CREATE_CONVERT_OPERATOR_C3_C1(TYPE1, C1, TYPE2, C2) \
00292 template <> QVImage<TYPE1, C1> & QVImage<TYPE1, C1>::operator=(const QVImage<TYPE2, C2> &img) \
00293 { \
00294 imageBuffer = new QVImageBuffer<TYPE1, C1>(img.getCols(), img.getRows()); \
00295 setAnchor(img.getROI().x(),img.getROI().y()); \
00296 qvipp::RGBToGray(img, *this); \
00297 setAnchor(img.getAnchor()); \
00298 return *this; \
00299 }
00300
00301 CREATE_CONVERT_OPERATOR_C3_C1(uChar, 1, uChar, 3);
00302
00303 #define CREATE_CONVERT_OPERATOR_C1_C3(TYPE1, C1, TYPE2, C2) \
00304 template <> QVImage<TYPE1, C1> & QVImage<TYPE1, C1>::operator=(const QVImage<TYPE2, C2> &img) \
00305 { \
00306 imageBuffer = new QVImageBuffer<TYPE1, C1>(img.getCols(), img.getRows()); \
00307 setAnchor(img.getROI().x(),img.getROI().y()); \
00308 qvipp::Copy(img, *this); \
00309 setAnchor(img.getAnchor()); \
00310 return *this; \
00311 }
00312
00313 CREATE_CONVERT_OPERATOR_C1_C3(uChar, 3, uChar, 1);
00314