/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this license. // If you do not agree to this license, do not download, install, // copy or use the software. // // // License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistribution's of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // * The name of the copyright holders may not be used to endorse or promote products // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and // any express or implied warranties, including, but not limited to, the implied // warranties of merchantability and fitness for a particular purpose are disclaimed. // In no event shall the Intel Corporation or contributors be liable for any direct, // indirect, incidental, special, exemplary, or consequential damages // (including, but not limited to, procurement of substitute goods or services; // loss of use, data, or profits; or business interruption) however caused // and on any theory of liability, whether in contract, strict liability, // or tort (including negligence or otherwise) arising in any way out of // the use of this software, even if advised of the possibility of such damage. // //M*/ #ifndef _ncv_pixel_operations_hpp_ #define _ncv_pixel_operations_hpp_ #include #include #include "opencv2/cudalegacy/NCV.hpp" template inline __host__ __device__ TBase _pixMaxVal(); template<> inline __host__ __device__ Ncv8u _pixMaxVal() {return UCHAR_MAX;} template<> inline __host__ __device__ Ncv16u _pixMaxVal() {return USHRT_MAX;} template<> inline __host__ __device__ Ncv32u _pixMaxVal() {return UINT_MAX;} template<> inline __host__ __device__ Ncv8s _pixMaxVal() {return SCHAR_MAX;} template<> inline __host__ __device__ Ncv16s _pixMaxVal() {return SHRT_MAX;} template<> inline __host__ __device__ Ncv32s _pixMaxVal() {return INT_MAX;} template<> inline __host__ __device__ Ncv32f _pixMaxVal() {return FLT_MAX;} template<> inline __host__ __device__ Ncv64f _pixMaxVal() {return DBL_MAX;} template inline __host__ __device__ TBase _pixMinVal(); template<> inline __host__ __device__ Ncv8u _pixMinVal() {return 0;} template<> inline __host__ __device__ Ncv16u _pixMinVal() {return 0;} template<> inline __host__ __device__ Ncv32u _pixMinVal() {return 0;} template<> inline __host__ __device__ Ncv8s _pixMinVal() {return SCHAR_MIN;} template<> inline __host__ __device__ Ncv16s _pixMinVal() {return SHRT_MIN;} template<> inline __host__ __device__ Ncv32s _pixMinVal() {return INT_MIN;} template<> inline __host__ __device__ Ncv32f _pixMinVal() {return FLT_MIN;} template<> inline __host__ __device__ Ncv64f _pixMinVal() {return DBL_MIN;} template struct TConvVec2Base; template<> struct TConvVec2Base {typedef Ncv8u TBase;}; template<> struct TConvVec2Base {typedef Ncv8u TBase;}; template<> struct TConvVec2Base {typedef Ncv8u TBase;}; template<> struct TConvVec2Base {typedef Ncv16u TBase;}; template<> struct TConvVec2Base {typedef Ncv16u TBase;}; template<> struct TConvVec2Base {typedef Ncv16u TBase;}; template<> struct TConvVec2Base {typedef Ncv32u TBase;}; template<> struct TConvVec2Base {typedef Ncv32u TBase;}; template<> struct TConvVec2Base {typedef Ncv32u TBase;}; template<> struct TConvVec2Base {typedef Ncv32f TBase;}; template<> struct TConvVec2Base {typedef Ncv32f TBase;}; template<> struct TConvVec2Base {typedef Ncv32f TBase;}; template<> struct TConvVec2Base {typedef Ncv64f TBase;}; template<> struct TConvVec2Base {typedef Ncv64f TBase;}; template<> struct TConvVec2Base {typedef Ncv64f TBase;}; #define NC(T) (sizeof(T) / sizeof(TConvVec2Base::TBase)) template struct TConvBase2Vec; template<> struct TConvBase2Vec {typedef uchar1 TVec;}; template<> struct TConvBase2Vec {typedef uchar3 TVec;}; template<> struct TConvBase2Vec {typedef uchar4 TVec;}; template<> struct TConvBase2Vec {typedef ushort1 TVec;}; template<> struct TConvBase2Vec {typedef ushort3 TVec;}; template<> struct TConvBase2Vec {typedef ushort4 TVec;}; template<> struct TConvBase2Vec {typedef uint1 TVec;}; template<> struct TConvBase2Vec {typedef uint3 TVec;}; template<> struct TConvBase2Vec {typedef uint4 TVec;}; template<> struct TConvBase2Vec {typedef float1 TVec;}; template<> struct TConvBase2Vec {typedef float3 TVec;}; template<> struct TConvBase2Vec {typedef float4 TVec;}; template<> struct TConvBase2Vec {typedef double1 TVec;}; template<> struct TConvBase2Vec {typedef double3 TVec;}; template<> struct TConvBase2Vec {typedef double4 TVec;}; //TODO: consider using CUDA intrinsics to avoid branching template inline __host__ __device__ void _TDemoteClampZ(Tin &a, Ncv8u &out) {out = (Ncv8u)CLAMP_0_255(a);} template inline __host__ __device__ void _TDemoteClampZ(Tin &a, Ncv16u &out) {out = (Ncv16u)CLAMP(a, 0, USHRT_MAX);} template inline __host__ __device__ void _TDemoteClampZ(Tin &a, Ncv32u &out) {out = (Ncv32u)CLAMP(a, 0, UINT_MAX);} template inline __host__ __device__ void _TDemoteClampZ(Tin &a, Ncv32f &out) {out = (Ncv32f)a;} //TODO: consider using CUDA intrinsics to avoid branching template inline __host__ __device__ void _TDemoteClampNN(Tin &a, Ncv8u &out) {out = (Ncv8u)CLAMP_0_255(a+0.5f);} template inline __host__ __device__ void _TDemoteClampNN(Tin &a, Ncv16u &out) {out = (Ncv16u)CLAMP(a+0.5f, 0, USHRT_MAX);} template inline __host__ __device__ void _TDemoteClampNN(Tin &a, Ncv32u &out) {out = (Ncv32u)CLAMP(a+0.5f, 0, UINT_MAX);} template inline __host__ __device__ void _TDemoteClampNN(Tin &a, Ncv32f &out) {out = (Ncv32f)a;} template inline Tout _pixMakeZero(); template<> inline __host__ __device__ uchar1 _pixMakeZero() {return make_uchar1(0);} template<> inline __host__ __device__ uchar3 _pixMakeZero() {return make_uchar3(0,0,0);} template<> inline __host__ __device__ uchar4 _pixMakeZero() {return make_uchar4(0,0,0,0);} template<> inline __host__ __device__ ushort1 _pixMakeZero() {return make_ushort1(0);} template<> inline __host__ __device__ ushort3 _pixMakeZero() {return make_ushort3(0,0,0);} template<> inline __host__ __device__ ushort4 _pixMakeZero() {return make_ushort4(0,0,0,0);} template<> inline __host__ __device__ uint1 _pixMakeZero() {return make_uint1(0);} template<> inline __host__ __device__ uint3 _pixMakeZero() {return make_uint3(0,0,0);} template<> inline __host__ __device__ uint4 _pixMakeZero() {return make_uint4(0,0,0,0);} template<> inline __host__ __device__ float1 _pixMakeZero() {return make_float1(0.f);} template<> inline __host__ __device__ float3 _pixMakeZero() {return make_float3(0.f,0.f,0.f);} template<> inline __host__ __device__ float4 _pixMakeZero() {return make_float4(0.f,0.f,0.f,0.f);} template<> inline __host__ __device__ double1 _pixMakeZero() {return make_double1(0.);} template<> inline __host__ __device__ double3 _pixMakeZero() {return make_double3(0.,0.,0.);} template<> inline __host__ __device__ double4 _pixMakeZero() {return make_double4(0.,0.,0.,0.);} static inline __host__ __device__ uchar1 _pixMake(Ncv8u x) {return make_uchar1(x);} static inline __host__ __device__ uchar3 _pixMake(Ncv8u x, Ncv8u y, Ncv8u z) {return make_uchar3(x,y,z);} static inline __host__ __device__ uchar4 _pixMake(Ncv8u x, Ncv8u y, Ncv8u z, Ncv8u w) {return make_uchar4(x,y,z,w);} static inline __host__ __device__ ushort1 _pixMake(Ncv16u x) {return make_ushort1(x);} static inline __host__ __device__ ushort3 _pixMake(Ncv16u x, Ncv16u y, Ncv16u z) {return make_ushort3(x,y,z);} static inline __host__ __device__ ushort4 _pixMake(Ncv16u x, Ncv16u y, Ncv16u z, Ncv16u w) {return make_ushort4(x,y,z,w);} static inline __host__ __device__ uint1 _pixMake(Ncv32u x) {return make_uint1(x);} static inline __host__ __device__ uint3 _pixMake(Ncv32u x, Ncv32u y, Ncv32u z) {return make_uint3(x,y,z);} static inline __host__ __device__ uint4 _pixMake(Ncv32u x, Ncv32u y, Ncv32u z, Ncv32u w) {return make_uint4(x,y,z,w);} static inline __host__ __device__ float1 _pixMake(Ncv32f x) {return make_float1(x);} static inline __host__ __device__ float3 _pixMake(Ncv32f x, Ncv32f y, Ncv32f z) {return make_float3(x,y,z);} static inline __host__ __device__ float4 _pixMake(Ncv32f x, Ncv32f y, Ncv32f z, Ncv32f w) {return make_float4(x,y,z,w);} static inline __host__ __device__ double1 _pixMake(Ncv64f x) {return make_double1(x);} static inline __host__ __device__ double3 _pixMake(Ncv64f x, Ncv64f y, Ncv64f z) {return make_double3(x,y,z);} static inline __host__ __device__ double4 _pixMake(Ncv64f x, Ncv64f y, Ncv64f z, Ncv64f w) {return make_double4(x,y,z,w);} template struct __pixDemoteClampZ_CN {static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix);}; template struct __pixDemoteClampZ_CN { static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix) { Tout out; _TDemoteClampZ(pix.x, out.x); return out; }}; template struct __pixDemoteClampZ_CN { static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix) { Tout out; _TDemoteClampZ(pix.x, out.x); _TDemoteClampZ(pix.y, out.y); _TDemoteClampZ(pix.z, out.z); return out; }}; template struct __pixDemoteClampZ_CN { static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix) { Tout out; _TDemoteClampZ(pix.x, out.x); _TDemoteClampZ(pix.y, out.y); _TDemoteClampZ(pix.z, out.z); _TDemoteClampZ(pix.w, out.w); return out; }}; template inline __host__ __device__ Tout _pixDemoteClampZ(Tin &pix) { return __pixDemoteClampZ_CN::_pixDemoteClampZ_CN(pix); } template struct __pixDemoteClampNN_CN {static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix);}; template struct __pixDemoteClampNN_CN { static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix) { Tout out; _TDemoteClampNN(pix.x, out.x); return out; }}; template struct __pixDemoteClampNN_CN { static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix) { Tout out; _TDemoteClampNN(pix.x, out.x); _TDemoteClampNN(pix.y, out.y); _TDemoteClampNN(pix.z, out.z); return out; }}; template struct __pixDemoteClampNN_CN { static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix) { Tout out; _TDemoteClampNN(pix.x, out.x); _TDemoteClampNN(pix.y, out.y); _TDemoteClampNN(pix.z, out.z); _TDemoteClampNN(pix.w, out.w); return out; }}; template inline __host__ __device__ Tout _pixDemoteClampNN(Tin &pix) { return __pixDemoteClampNN_CN::_pixDemoteClampNN_CN(pix); } template struct __pixScale_CN {static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w);}; template struct __pixScale_CN { static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w) { Tout out; typedef typename TConvVec2Base::TBase TBout; out.x = (TBout)(pix.x * w); return out; }}; template struct __pixScale_CN { static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w) { Tout out; typedef typename TConvVec2Base::TBase TBout; out.x = (TBout)(pix.x * w); out.y = (TBout)(pix.y * w); out.z = (TBout)(pix.z * w); return out; }}; template struct __pixScale_CN { static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w) { Tout out; typedef typename TConvVec2Base::TBase TBout; out.x = (TBout)(pix.x * w); out.y = (TBout)(pix.y * w); out.z = (TBout)(pix.z * w); out.w = (TBout)(pix.w * w); return out; }}; template static __host__ __device__ Tout _pixScale(Tin &pix, Tw w) { return __pixScale_CN::_pixScale_CN(pix, w); } template struct __pixAdd_CN {static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2);}; template struct __pixAdd_CN { static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2) { Tout out; out.x = pix1.x + pix2.x; return out; }}; template struct __pixAdd_CN { static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2) { Tout out; out.x = pix1.x + pix2.x; out.y = pix1.y + pix2.y; out.z = pix1.z + pix2.z; return out; }}; template struct __pixAdd_CN { static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2) { Tout out; out.x = pix1.x + pix2.x; out.y = pix1.y + pix2.y; out.z = pix1.z + pix2.z; out.w = pix1.w + pix2.w; return out; }}; template static __host__ __device__ Tout _pixAdd(Tout &pix1, Tin &pix2) { return __pixAdd_CN::_pixAdd_CN(pix1, pix2); } template struct __pixDist_CN {static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2);}; template struct __pixDist_CN { static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2) { return Tout(SQR(pix1.x - pix2.x)); }}; template struct __pixDist_CN { static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2) { return Tout(SQR(pix1.x - pix2.x) + SQR(pix1.y - pix2.y) + SQR(pix1.z - pix2.z)); }}; template struct __pixDist_CN { static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2) { return Tout(SQR(pix1.x - pix2.x) + SQR(pix1.y - pix2.y) + SQR(pix1.z - pix2.z) + SQR(pix1.w - pix2.w)); }}; template static __host__ __device__ Tout _pixDist(Tin &pix1, Tin &pix2) { return __pixDist_CN::_pixDist_CN(pix1, pix2); } template struct TAccPixWeighted; template<> struct TAccPixWeighted {typedef double1 type;}; template<> struct TAccPixWeighted {typedef double3 type;}; template<> struct TAccPixWeighted {typedef double4 type;}; template<> struct TAccPixWeighted {typedef double1 type;}; template<> struct TAccPixWeighted {typedef double3 type;}; template<> struct TAccPixWeighted {typedef double4 type;}; template<> struct TAccPixWeighted {typedef double1 type;}; template<> struct TAccPixWeighted {typedef double3 type;}; template<> struct TAccPixWeighted {typedef double4 type;}; template struct TAccPixDist {}; template<> struct TAccPixDist {typedef Ncv32u type;}; template<> struct TAccPixDist {typedef Ncv32u type;}; template<> struct TAccPixDist {typedef Ncv32u type;}; template<> struct TAccPixDist {typedef Ncv32u type;}; template<> struct TAccPixDist {typedef Ncv32u type;}; template<> struct TAccPixDist {typedef Ncv32u type;}; template<> struct TAccPixDist {typedef Ncv32f type;}; template<> struct TAccPixDist {typedef Ncv32f type;}; template<> struct TAccPixDist {typedef Ncv32f type;}; #endif //_ncv_pixel_operations_hpp_