/*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*/ #if !defined CUDA_DISABLER #include "opencv2/core/cuda/common.hpp" #include "opencv2/core/cuda/functional.hpp" #include "opencv2/core/cuda/transform.hpp" #include "opencv2/core/cuda/saturate_cast.hpp" #include "opencv2/core/cuda/simd_functions.hpp" #include "opencv2/core/cuda/limits.hpp" #include "opencv2/core/cuda/type_traits.hpp" #include "arithm_func_traits.hpp" using namespace cv::gpu; using namespace cv::gpu::cudev; ////////////////////////////////////////////////////////////////////////// // absMat namespace cv { namespace gpu { namespace cudev { template struct TransformFunctorTraits< abs_func > : arithm::ArithmFuncTraits { }; }}} namespace arithm { template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream) { cudev::transform((PtrStepSz) src, (PtrStepSz) dst, abs_func(), WithOutMask(), stream); } template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void absMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); } ////////////////////////////////////////////////////////////////////////// // sqrMat namespace arithm { template struct Sqr : unary_function { __device__ __forceinline__ T operator ()(T x) const { return saturate_cast(x * x); } __host__ __device__ __forceinline__ Sqr() {} __host__ __device__ __forceinline__ Sqr(const Sqr&) {} }; } namespace cv { namespace gpu { namespace cudev { template struct TransformFunctorTraits< arithm::Sqr > : arithm::ArithmFuncTraits { }; }}} namespace arithm { template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream) { cudev::transform((PtrStepSz) src, (PtrStepSz) dst, Sqr(), WithOutMask(), stream); } template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); } ////////////////////////////////////////////////////////////////////////// // sqrtMat namespace cv { namespace gpu { namespace cudev { template struct TransformFunctorTraits< sqrt_func > : arithm::ArithmFuncTraits { }; }}} namespace arithm { template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream) { cudev::transform((PtrStepSz) src, (PtrStepSz) dst, sqrt_func(), WithOutMask(), stream); } template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void sqrtMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); } ////////////////////////////////////////////////////////////////////////// // logMat namespace cv { namespace gpu { namespace cudev { template struct TransformFunctorTraits< log_func > : arithm::ArithmFuncTraits { }; }}} namespace arithm { template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream) { cudev::transform((PtrStepSz) src, (PtrStepSz) dst, log_func(), WithOutMask(), stream); } template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void logMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); } ////////////////////////////////////////////////////////////////////////// // expMat namespace arithm { template struct Exp : unary_function { __device__ __forceinline__ T operator ()(T x) const { exp_func f; return saturate_cast(f(x)); } __host__ __device__ __forceinline__ Exp() {} __host__ __device__ __forceinline__ Exp(const Exp&) {} }; } namespace cv { namespace gpu { namespace cudev { template struct TransformFunctorTraits< arithm::Exp > : arithm::ArithmFuncTraits { }; }}} namespace arithm { template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream) { cudev::transform((PtrStepSz) src, (PtrStepSz) dst, Exp(), WithOutMask(), stream); } template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); template void expMat(PtrStepSzb src, PtrStepSzb dst, cudaStream_t stream); } ////////////////////////////////////////////////////////////////////////// // pow namespace arithm { template::is_signed> struct PowOp : unary_function { float power; __host__ explicit PowOp(double power_) : power(static_cast(power_)) {} __device__ __forceinline__ T operator()(T e) const { return saturate_cast(__powf((float)e, power)); } }; template struct PowOp : unary_function { float power; __host__ explicit PowOp(double power_) : power(static_cast(power_)) {} __device__ __forceinline__ T operator()(T e) const { T res = saturate_cast(__powf((float)e, power)); if ((e < 0) && (1 & static_cast(power))) res *= -1; return res; } }; template<> struct PowOp : unary_function { float power; __host__ explicit PowOp(double power_) : power(static_cast(power_)) {} __device__ __forceinline__ float operator()(float e) const { return __powf(::fabs(e), power); } }; template<> struct PowOp : unary_function { double power; __host__ explicit PowOp(double power_) : power(power_) {} __device__ __forceinline__ double operator()(double e) const { return ::pow(::fabs(e), power); } }; } namespace cv { namespace gpu { namespace cudev { template struct TransformFunctorTraits< arithm::PowOp > : arithm::ArithmFuncTraits { }; }}} namespace arithm { template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream) { cudev::transform((PtrStepSz) src, (PtrStepSz) dst, PowOp(power), WithOutMask(), stream); } template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); template void pow(PtrStepSzb src, double power, PtrStepSzb dst, cudaStream_t stream); } #endif // CUDA_DISABLER