mirror of https://github.com/opencv/opencv.git
parent
fa0daa4809
commit
3ab2728da1
28 changed files with 4506 additions and 3766 deletions
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,221 @@ |
||||
/*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 bpied warranties, including, but not limited to, the bpied
|
||||
// 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 __OPENCV_GPU_COLOR_HPP__ |
||||
#define __OPENCV_GPU_COLOR_HPP__ |
||||
|
||||
#include "detail/color.hpp" |
||||
|
||||
namespace cv { namespace gpu { namespace device |
||||
{ |
||||
// All OPENCV_GPU_IMPLEMENT_*_TRAITS(ColorSpace1_to_ColorSpace2, ...) macros implements
|
||||
// template <typename T> class ColorSpace1_to_ColorSpace2_traits
|
||||
// {
|
||||
// typedef ... functor_type;
|
||||
// static __host__ __device__ functor_type create_functor();
|
||||
// };
|
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS(bgr_to_rgb, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS(bgr_to_bgra, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS(bgr_to_rgba, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS(bgra_to_bgr, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS(bgra_to_rgb, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS(bgra_to_rgba, 4, 4, 2) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(bgr_to_bgr555, 3, 0, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(bgr_to_bgr565, 3, 0, 6) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(rgb_to_bgr555, 3, 2, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(rgb_to_bgr565, 3, 2, 6) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(bgra_to_bgr555, 4, 0, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(bgra_to_bgr565, 4, 0, 6) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(rgba_to_bgr555, 4, 2, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS(rgba_to_bgr565, 4, 2, 6) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2RGB5x5_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_rgb, 3, 2, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_rgb, 3, 2, 6) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_bgr, 3, 0, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_bgr, 3, 0, 6) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_rgba, 4, 2, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_rgba, 4, 2, 6) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_bgra, 4, 0, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_bgra, 4, 0, 6) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB5x52RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_GRAY2RGB_TRAITS(gray_to_bgr, 3) |
||||
OPENCV_GPU_IMPLEMENT_GRAY2RGB_TRAITS(gray_to_bgra, 4) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_GRAY2RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_GRAY2RGB5x5_TRAITS(gray_to_bgr555, 5) |
||||
OPENCV_GPU_IMPLEMENT_GRAY2RGB5x5_TRAITS(gray_to_bgr565, 6) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_GRAY2RGB5x5_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB5x52GRAY_TRAITS(bgr555_to_gray, 5) |
||||
OPENCV_GPU_IMPLEMENT_RGB5x52GRAY_TRAITS(bgr565_to_gray, 6) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB5x52GRAY_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2GRAY_TRAITS(rgb_to_gray, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2GRAY_TRAITS(bgr_to_gray, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2GRAY_TRAITS(rgba_to_gray, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2GRAY_TRAITS(bgra_to_gray, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2GRAY_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv4, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv4, 4, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv4, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv4, 4, 4, 2) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgb, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgba, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgb, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgba, 4, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgr, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgra, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgr, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgra, 4, 4, 2) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(rgb_to_YCrCb, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(rgba_to_YCrCb, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(rgb_to_YCrCb4, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(rgba_to_YCrCb4, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(bgr_to_YCrCb, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(bgra_to_YCrCb, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(bgr_to_YCrCb4, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS(bgra_to_YCrCb4, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2YCrCb_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_rgb, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_rgba, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_rgb, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_rgba, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_bgr, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_bgra, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_bgr, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_bgra, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_YCrCb2RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(rgb_to_xyz, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(rgba_to_xyz, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(rgb_to_xyz4, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(rgba_to_xyz4, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(bgr_to_xyz, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(bgra_to_xyz, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(bgr_to_xyz4, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS(bgra_to_xyz4, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2XYZ_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_rgb, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_rgb, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_rgba, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_rgba, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_bgr, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_bgr, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_bgra, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_bgra, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_XYZ2RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(rgb_to_hsv, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(rgba_to_hsv, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(rgb_to_hsv4, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(rgba_to_hsv4, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(bgr_to_hsv, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(bgra_to_hsv, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(bgr_to_hsv4, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS(bgra_to_hsv4, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2HSV_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_rgb, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_rgba, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_rgb, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_rgba, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_bgr, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_bgra, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_bgr, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_bgra, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_HSV2RGB_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(rgb_to_hls, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(rgba_to_hls, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(rgb_to_hls4, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(rgba_to_hls4, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(bgr_to_hls, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(bgra_to_hls, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(bgr_to_hls4, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS(bgra_to_hls4, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2HLS_TRAITS |
||||
|
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls_to_rgb, 3, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls_to_rgba, 3, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_rgb, 4, 3, 2) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_rgba, 4, 4, 2) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls_to_bgr, 3, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls_to_bgra, 3, 4, 0) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_bgr, 4, 3, 0) |
||||
OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_bgra, 4, 4, 0) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_HLS2RGB_TRAITS |
||||
}}} |
||||
|
||||
#endif // __OPENCV_GPU_BORDER_INTERPOLATE_HPP__
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,429 @@ |
||||
/*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 __OPENCV_GPU_TRANSFORM_DETAIL_HPP__ |
||||
#define __OPENCV_GPU_TRANSFORM_DETAIL_HPP__ |
||||
|
||||
#include "internal_shared.hpp" |
||||
#include "vec_traits.hpp" |
||||
|
||||
namespace cv { namespace gpu { namespace device |
||||
{ |
||||
namespace detail |
||||
{ |
||||
//! Mask accessor
|
||||
|
||||
class MaskReader |
||||
{ |
||||
public: |
||||
explicit MaskReader(const PtrStep& mask_): mask(mask_) {} |
||||
|
||||
__device__ __forceinline__ bool operator()(int y, int x) const { return mask.ptr(y)[x]; } |
||||
|
||||
private: |
||||
PtrStep mask; |
||||
}; |
||||
|
||||
struct NoMask
|
||||
{ |
||||
__device__ __forceinline__ bool operator()(int y, int x) const { return true; }
|
||||
}; |
||||
|
||||
//! Read Write Traits
|
||||
|
||||
template <size_t src_elem_size, size_t dst_elem_size> |
||||
struct UnReadWriteTraits_ |
||||
{ |
||||
enum { shift = 1 }; |
||||
}; |
||||
template <size_t src_elem_size> |
||||
struct UnReadWriteTraits_<src_elem_size, 1> |
||||
{ |
||||
enum { shift = 4 }; |
||||
}; |
||||
template <size_t src_elem_size> |
||||
struct UnReadWriteTraits_<src_elem_size, 2> |
||||
{ |
||||
enum { shift = 2 }; |
||||
}; |
||||
template <typename T, typename D> struct UnReadWriteTraits |
||||
{ |
||||
enum { shift = UnReadWriteTraits_<sizeof(T), sizeof(D)>::shift }; |
||||
|
||||
typedef typename TypeVec<T, shift>::vec_type read_type; |
||||
typedef typename TypeVec<D, shift>::vec_type write_type; |
||||
}; |
||||
|
||||
template <size_t src_elem_size1, size_t src_elem_size2, size_t dst_elem_size> |
||||
struct BinReadWriteTraits_ |
||||
{ |
||||
enum { shift = 1 }; |
||||
}; |
||||
template <size_t src_elem_size1, size_t src_elem_size2> |
||||
struct BinReadWriteTraits_<src_elem_size1, src_elem_size2, 1> |
||||
{ |
||||
enum { shift = 4 }; |
||||
}; |
||||
template <size_t src_elem_size1, size_t src_elem_size2> |
||||
struct BinReadWriteTraits_<src_elem_size1, src_elem_size2, 2> |
||||
{ |
||||
enum { shift = 2 }; |
||||
}; |
||||
template <typename T1, typename T2, typename D> struct BinReadWriteTraits |
||||
{ |
||||
enum {shift = BinReadWriteTraits_<sizeof(T1), sizeof(T2), sizeof(D)>::shift}; |
||||
|
||||
typedef typename TypeVec<T1, shift>::vec_type read_type1; |
||||
typedef typename TypeVec<T2, shift>::vec_type read_type2; |
||||
typedef typename TypeVec<D , shift>::vec_type write_type; |
||||
}; |
||||
|
||||
//! Transform kernels
|
||||
|
||||
template <int shift> struct OpUnroller; |
||||
template <> struct OpUnroller<1> |
||||
{ |
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, UnOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src.x); |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, BinOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src1.x, src2.x); |
||||
} |
||||
}; |
||||
template <> struct OpUnroller<2> |
||||
{ |
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, UnOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src.x); |
||||
if (mask(y, x_shifted + 1)) |
||||
dst.y = op(src.y); |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, BinOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src1.x, src2.x); |
||||
if (mask(y, x_shifted + 1)) |
||||
dst.y = op(src1.y, src2.y); |
||||
} |
||||
}; |
||||
template <> struct OpUnroller<3> |
||||
{ |
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, UnOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src.x); |
||||
if (mask(y, x_shifted + 1)) |
||||
dst.y = op(src.y); |
||||
if (mask(y, x_shifted + 2)) |
||||
dst.z = op(src.z); |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, BinOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src1.x, src2.x); |
||||
if (mask(y, x_shifted + 1)) |
||||
dst.y = op(src1.y, src2.y); |
||||
if (mask(y, x_shifted + 2)) |
||||
dst.z = op(src1.z, src2.z); |
||||
} |
||||
}; |
||||
template <> struct OpUnroller<4> |
||||
{ |
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, UnOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src.x); |
||||
if (mask(y, x_shifted + 1)) |
||||
dst.y = op(src.y); |
||||
if (mask(y, x_shifted + 2)) |
||||
dst.z = op(src.z); |
||||
if (mask(y, x_shifted + 3)) |
||||
dst.w = op(src.w); |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, BinOp& op, int x_shifted, int y) |
||||
{ |
||||
if (mask(y, x_shifted)) |
||||
dst.x = op(src1.x, src2.x); |
||||
if (mask(y, x_shifted + 1)) |
||||
dst.y = op(src1.y, src2.y); |
||||
if (mask(y, x_shifted + 2)) |
||||
dst.z = op(src1.z, src2.z); |
||||
if (mask(y, x_shifted + 3)) |
||||
dst.w = op(src1.w, src2.w); |
||||
} |
||||
}; |
||||
|
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
__global__ static void transformSmart(const DevMem2D_<T> src_, PtrStep_<D> dst_, const Mask mask, UnOp op) |
||||
{ |
||||
typedef typename UnReadWriteTraits<T, D>::read_type read_type; |
||||
typedef typename UnReadWriteTraits<T, D>::write_type write_type; |
||||
const int shift = UnReadWriteTraits<T, D>::shift; |
||||
|
||||
const int x = threadIdx.x + blockIdx.x * blockDim.x; |
||||
const int y = threadIdx.y + blockIdx.y * blockDim.y; |
||||
const int x_shifted = x * shift; |
||||
|
||||
if (y < src_.rows) |
||||
{ |
||||
const T* src = src_.ptr(y); |
||||
D* dst = dst_.ptr(y); |
||||
|
||||
if (x_shifted + shift - 1 < src_.cols) |
||||
{ |
||||
read_type src_n_el = ((const read_type*)src)[x]; |
||||
write_type dst_n_el; |
||||
|
||||
OpUnroller<shift>::unroll(src_n_el, dst_n_el, mask, op, x_shifted, y); |
||||
|
||||
((write_type*)dst)[x] = dst_n_el; |
||||
} |
||||
else |
||||
{ |
||||
for (int real_x = x_shifted; real_x < src_.cols; ++real_x) |
||||
{ |
||||
if (mask(y, real_x)) |
||||
dst[real_x] = op(src[real_x]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static __global__ void transformSimple(const DevMem2D_<T> src, PtrStep_<D> dst, const Mask mask, UnOp op) |
||||
{ |
||||
const int x = blockDim.x * blockIdx.x + threadIdx.x; |
||||
const int y = blockDim.y * blockIdx.y + threadIdx.y; |
||||
|
||||
if (x < src.cols && y < src.rows && mask(y, x)) |
||||
{ |
||||
dst.ptr(y)[x] = op(src.ptr(y)[x]); |
||||
} |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
__global__ static void transformSmart(const DevMem2D_<T1> src1_, const PtrStep_<T2> src2_, PtrStep_<D> dst_,
|
||||
const Mask mask, BinOp op) |
||||
{ |
||||
typedef typename BinReadWriteTraits<T1, T2, D>::read_type1 read_type1; |
||||
typedef typename BinReadWriteTraits<T1, T2, D>::read_type2 read_type2; |
||||
typedef typename BinReadWriteTraits<T1, T2, D>::write_type write_type; |
||||
const int shift = BinReadWriteTraits<T1, T2, D>::shift; |
||||
|
||||
const int x = threadIdx.x + blockIdx.x * blockDim.x; |
||||
const int y = threadIdx.y + blockIdx.y * blockDim.y; |
||||
const int x_shifted = x * shift; |
||||
|
||||
if (y < src1_.rows) |
||||
{ |
||||
const T1* src1 = src1_.ptr(y); |
||||
const T2* src2 = src2_.ptr(y); |
||||
D* dst = dst_.ptr(y); |
||||
|
||||
if (x_shifted + shift - 1 < src1_.cols) |
||||
{ |
||||
read_type1 src1_n_el = ((const read_type1*)src1)[x]; |
||||
read_type2 src2_n_el = ((const read_type2*)src2)[x]; |
||||
write_type dst_n_el; |
||||
|
||||
OpUnroller<shift>::unroll(src1_n_el, src2_n_el, dst_n_el, mask, op, x_shifted, y); |
||||
|
||||
((write_type*)dst)[x] = dst_n_el; |
||||
} |
||||
else |
||||
{ |
||||
for (int real_x = x_shifted; real_x < src1_.cols; ++real_x) |
||||
{ |
||||
if (mask(y, real_x)) |
||||
dst[real_x] = op(src1[real_x], src2[real_x]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static __global__ void transformSimple(const DevMem2D_<T1> src1, const PtrStep_<T2> src2, PtrStep_<D> dst,
|
||||
const Mask mask, BinOp op) |
||||
{ |
||||
const int x = blockDim.x * blockIdx.x + threadIdx.x; |
||||
const int y = blockDim.y * blockIdx.y + threadIdx.y; |
||||
|
||||
if (x < src1.cols && y < src1.rows && mask(y, x)) |
||||
{ |
||||
T1 src1_data = src1.ptr(y)[x]; |
||||
T2 src2_data = src2.ptr(y)[x]; |
||||
dst.ptr(y)[x] = op(src1_data, src2_data); |
||||
} |
||||
}
|
||||
|
||||
template <bool UseSmart> struct TransformDispatcher; |
||||
template<> struct TransformDispatcher<false> |
||||
{ |
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static void call(const DevMem2D_<T>& src, const DevMem2D_<D>& dst, UnOp op, const Mask& mask, cudaStream_t stream) |
||||
{ |
||||
dim3 threads(16, 16, 1); |
||||
dim3 grid(1, 1, 1); |
||||
|
||||
grid.x = divUp(src.cols, threads.x); |
||||
grid.y = divUp(src.rows, threads.y);
|
||||
|
||||
transformSimple<T, D><<<grid, threads, 0, stream>>>(src, dst, mask, op); |
||||
cudaSafeCall( cudaGetLastError() ); |
||||
|
||||
if (stream == 0) |
||||
cudaSafeCall( cudaDeviceSynchronize() );
|
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static void call(const DevMem2D_<T1>& src1, const DevMem2D_<T2>& src2, const DevMem2D_<D>& dst, BinOp op, const Mask& mask, cudaStream_t stream) |
||||
{ |
||||
dim3 threads(16, 16, 1); |
||||
dim3 grid(1, 1, 1); |
||||
|
||||
grid.x = divUp(src1.cols, threads.x); |
||||
grid.y = divUp(src1.rows, threads.y);
|
||||
|
||||
transformSimple<T1, T2, D><<<grid, threads, 0, stream>>>(src1, src2, dst, mask, op); |
||||
cudaSafeCall( cudaGetLastError() ); |
||||
|
||||
if (stream == 0) |
||||
cudaSafeCall( cudaDeviceSynchronize() );
|
||||
} |
||||
}; |
||||
template<> struct TransformDispatcher<true> |
||||
{ |
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static void call(const DevMem2D_<T>& src, const DevMem2D_<D>& dst, UnOp op, const Mask& mask, cudaStream_t stream) |
||||
{ |
||||
const int shift = UnReadWriteTraits<T, D>::shift; |
||||
|
||||
dim3 threads(16, 16, 1); |
||||
dim3 grid(1, 1, 1);
|
||||
|
||||
grid.x = divUp(src.cols, threads.x * shift); |
||||
grid.y = divUp(src.rows, threads.y);
|
||||
|
||||
transformSmart<T, D><<<grid, threads, 0, stream>>>(src, dst, mask, op); |
||||
cudaSafeCall( cudaGetLastError() ); |
||||
|
||||
if (stream == 0) |
||||
cudaSafeCall( cudaDeviceSynchronize() ); |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static void call(const DevMem2D_<T1>& src1, const DevMem2D_<T2>& src2, const DevMem2D_<D>& dst, BinOp op, const Mask& mask, cudaStream_t stream) |
||||
{ |
||||
const int shift = BinReadWriteTraits<T1, T2, D>::shift; |
||||
|
||||
dim3 threads(16, 16, 1); |
||||
dim3 grid(1, 1, 1); |
||||
|
||||
grid.x = divUp(src1.cols, threads.x * shift); |
||||
grid.y = divUp(src1.rows, threads.y);
|
||||
|
||||
transformSmart<T1, T2, D><<<grid, threads, 0, stream>>>(src1, src2, dst, mask, op); |
||||
cudaSafeCall( cudaGetLastError() ); |
||||
|
||||
if (stream == 0) |
||||
cudaSafeCall( cudaDeviceSynchronize() );
|
||||
} |
||||
}; |
||||
|
||||
template <typename T, typename D, int scn, int dcn> struct UseSmartUn_ |
||||
{ |
||||
static const bool value = false; |
||||
}; |
||||
template <typename T, typename D> struct UseSmartUn_<T, D, 1, 1> |
||||
{ |
||||
static const bool value = UnReadWriteTraits<T, D>::shift != 1; |
||||
}; |
||||
template <typename T, typename D> struct UseSmartUn |
||||
{ |
||||
static const bool value = UseSmartUn_<T, D, VecTraits<T>::cn, VecTraits<D>::cn>::value; |
||||
}; |
||||
|
||||
template <typename T1, typename T2, typename D, int src1cn, int src2cn, int dstcn> struct UseSmartBin_ |
||||
{ |
||||
static const bool value = false; |
||||
}; |
||||
template <typename T1, typename T2, typename D> struct UseSmartBin_<T1, T2, D, 1, 1, 1> |
||||
{ |
||||
static const bool value = BinReadWriteTraits<T1, T2, D>::shift != 1; |
||||
}; |
||||
template <typename T1, typename T2, typename D> struct UseSmartBin |
||||
{ |
||||
static const bool value = UseSmartBin_<T1, T2, D, VecTraits<T1>::cn, VecTraits<T2>::cn, VecTraits<D>::cn>::value; |
||||
}; |
||||
|
||||
template <typename T, typename D, typename UnOp, typename Mask> |
||||
static void transform_caller(const DevMem2D_<T>& src, const DevMem2D_<D>& dst, UnOp op, const Mask& mask, cudaStream_t stream) |
||||
{ |
||||
TransformDispatcher< UseSmartUn<T, D>::value >::call(src, dst, op, mask, stream); |
||||
} |
||||
|
||||
template <typename T1, typename T2, typename D, typename BinOp, typename Mask> |
||||
static void transform_caller(const DevMem2D_<T1>& src1, const DevMem2D_<T2>& src2, const DevMem2D_<D>& dst, BinOp op, const Mask& mask, cudaStream_t stream) |
||||
{ |
||||
TransformDispatcher< UseSmartBin<T1, T2, D>::value >::call(src1, src2, dst, op, mask, stream); |
||||
} |
||||
} |
||||
}}} |
||||
|
||||
#endif // __OPENCV_GPU_TRANSFORM_DETAIL_HPP__
|
@ -0,0 +1,338 @@ |
||||
/*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 __OPENCV_GPU_FUNCTIONAL_HPP__ |
||||
#define __OPENCV_GPU_FUNCTIONAL_HPP__ |
||||
|
||||
#include <thrust/functional.h> |
||||
#include "internal_shared.hpp" |
||||
#include "saturate_cast.hpp" |
||||
|
||||
namespace cv { namespace gpu { namespace device |
||||
{ |
||||
using thrust::unary_function; |
||||
using thrust::binary_function; |
||||
|
||||
using thrust::plus; |
||||
using thrust::minus; |
||||
using thrust::multiplies; |
||||
using thrust::divides; |
||||
using thrust::modulus; |
||||
using thrust::negate; |
||||
|
||||
using thrust::equal_to; |
||||
using thrust::not_equal_to; |
||||
using thrust::greater; |
||||
using thrust::less; |
||||
using thrust::greater_equal; |
||||
using thrust::less_equal; |
||||
|
||||
using thrust::logical_and; |
||||
using thrust::logical_or; |
||||
using thrust::logical_not; |
||||
|
||||
using thrust::bit_and; |
||||
using thrust::bit_or; |
||||
using thrust::bit_xor; |
||||
template <typename T> struct bit_not : public unary_function<T, T> |
||||
{ |
||||
__forceinline__ __device__ T operator ()(const T& v) const {return ~v;} |
||||
}; |
||||
|
||||
using thrust::identity; |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_MINMAX(name, type, op) \ |
||||
template <> struct name<type> : public binary_function<type, type, type> \
|
||||
{ \
|
||||
__forceinline__ __device__ type operator()(type lhs, type rhs) const {return op(lhs, rhs);} \
|
||||
}; |
||||
|
||||
template <typename T> struct maximum : public binary_function<T, T, T> |
||||
{ |
||||
__forceinline__ __device__ T operator()(const T& lhs, const T& rhs) const {return lhs < rhs ? rhs : lhs;} |
||||
}; |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, uchar, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, schar, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, char, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, ushort, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, short, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, int, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, uint, max) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, float, fmax) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(maximum, double, fmax) |
||||
|
||||
template <typename T> struct minimum : public binary_function<T, T, T> |
||||
{ |
||||
__forceinline__ __device__ T operator()(const T &lhs, const T &rhs) const {return lhs < rhs ? lhs : rhs;} |
||||
}; |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, uchar, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, schar, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, char, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, ushort, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, short, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, int, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, uint, min) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, float, fmin) |
||||
OPENCV_GPU_IMPLEMENT_MINMAX(minimum, double, fmin) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_MINMAX |
||||
|
||||
using thrust::project1st; |
||||
using thrust::project2nd; |
||||
|
||||
using thrust::unary_negate; |
||||
using thrust::not1; |
||||
|
||||
using thrust::binary_negate; |
||||
using thrust::not2; |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(func) \ |
||||
template <typename T> struct func ## _func : public unary_function<T, float> \
|
||||
{ \
|
||||
__forceinline__ __device__ float operator ()(const T& v) \
|
||||
{ \
|
||||
return func ## f(v); \
|
||||
} \
|
||||
}; \
|
||||
template <> struct func ## _func<double> : public unary_function<double, double> \
|
||||
{ \
|
||||
__forceinline__ __device__ double operator ()(double v) \
|
||||
{ \
|
||||
return func(v); \
|
||||
} \
|
||||
}; |
||||
#define OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR(func) \ |
||||
template <typename T> struct func ## _func : public binary_function<T, T, float> \
|
||||
{ \
|
||||
__forceinline__ __device__ float operator ()(const T& v1, const T& v2) \
|
||||
{ \
|
||||
return func ## f(v1, v2); \
|
||||
} \
|
||||
}; \
|
||||
template <> struct func ## _func<double> : public binary_function<double, double, double> \
|
||||
{ \
|
||||
__forceinline__ __device__ double operator ()(double v1, double v2) \
|
||||
{ \
|
||||
return func(v1, v2); \
|
||||
} \
|
||||
}; |
||||
|
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(fabs) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(sqrt) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(exp) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(exp2) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(exp10) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(log) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(log2) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(log10) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(sin) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(cos) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(tan) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(asin) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(acos) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(atan) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(sinh) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(cosh) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(tanh) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(asinh) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(acosh) |
||||
OPENCV_GPU_IMPLEMENT_UN_FUNCTOR(atanh) |
||||
|
||||
OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR(hypot) |
||||
OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR(atan2) |
||||
OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR(pow) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_UN_FUNCTOR |
||||
#undef OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR |
||||
|
||||
template<typename T> struct hypot_sqr_func : public binary_function<T, T, float>
|
||||
{ |
||||
__forceinline__ __device__ T operator ()(T src1, T src2) const |
||||
{ |
||||
return src1 * src1 + src2 * src2; |
||||
} |
||||
}; |
||||
|
||||
template <typename T, typename D> struct saturate_cast_func : public unary_function<T, D> |
||||
{ |
||||
__forceinline__ __device__ D operator ()(const T& v) |
||||
{ |
||||
return saturate_cast<D>(v); |
||||
} |
||||
}; |
||||
|
||||
template <typename T> struct thresh_binary_func : public unary_function<T, T> |
||||
{ |
||||
__forceinline__ __host__ __device__ thresh_binary_func(T thresh_, T maxVal_) : thresh(thresh_), maxVal(maxVal_) {} |
||||
|
||||
__forceinline__ __device__ T operator()(const T& src) const |
||||
{ |
||||
return src > thresh ? maxVal : 0; |
||||
} |
||||
|
||||
T thresh; |
||||
T maxVal; |
||||
}; |
||||
template <typename T> struct thresh_binary_inv_func : public unary_function<T, T> |
||||
{ |
||||
__forceinline__ __host__ __device__ thresh_binary_inv_func(T thresh_, T maxVal_) : thresh(thresh_), maxVal(maxVal_) {} |
||||
|
||||
__forceinline__ __device__ T operator()(const T& src) const |
||||
{ |
||||
return src > thresh ? 0 : maxVal; |
||||
} |
||||
|
||||
T thresh; |
||||
T maxVal; |
||||
}; |
||||
template <typename T> struct thresh_trunc_func : public unary_function<T, T> |
||||
{ |
||||
explicit __forceinline__ __host__ __device__ thresh_trunc_func(T thresh_, T maxVal_ = 0) : thresh(thresh_) {} |
||||
|
||||
__forceinline__ __device__ T operator()(const T& src) const |
||||
{ |
||||
return minimum<T>()(src, thresh); |
||||
} |
||||
|
||||
T thresh; |
||||
}; |
||||
template <typename T> struct thresh_to_zero_func : public unary_function<T, T> |
||||
{ |
||||
public: |
||||
explicit __forceinline__ __host__ __device__ thresh_to_zero_func(T thresh_, T maxVal_ = 0) : thresh(thresh_) {} |
||||
|
||||
__forceinline__ __device__ T operator()(const T& src) const |
||||
{ |
||||
return src > thresh ? src : 0; |
||||
} |
||||
|
||||
T thresh; |
||||
}; |
||||
template <typename T> struct thresh_to_zero_inv_func : public unary_function<T, T> |
||||
{ |
||||
public: |
||||
explicit __forceinline__ __host__ __device__ thresh_to_zero_inv_func(T thresh_, T maxVal_ = 0) : thresh(thresh_) {} |
||||
|
||||
__forceinline__ __device__ T operator()(const T& src) const |
||||
{ |
||||
return src > thresh ? 0 : src; |
||||
} |
||||
|
||||
T thresh; |
||||
}; |
||||
|
||||
template <typename Op> struct binder1st : public unary_function<typename Op::second_argument_type, typename Op::result_type>
|
||||
{ |
||||
__forceinline__ __host__ __device__ binder1st(const Op& op_, const typename Op::first_argument_type& arg1_) : op(op_), arg1(arg1_) {} |
||||
|
||||
__forceinline__ __device__ typename Op::result_type operator ()(const typename Op::second_argument_type& a) |
||||
{ |
||||
return op(arg1, a); |
||||
} |
||||
|
||||
Op op; |
||||
typename Op::first_argument_type arg1; |
||||
}; |
||||
template <typename Op, typename T> static __forceinline__ __host__ __device__ binder1st<Op> bind1st(const Op& op, const T& x) |
||||
{ |
||||
return binder1st<Op>(op, typename Op::first_argument_type(x)); |
||||
} |
||||
template <typename Op> struct binder2nd : public unary_function<typename Op::first_argument_type, typename Op::result_type>
|
||||
{ |
||||
__forceinline__ __host__ __device__ binder2nd(const Op& op_, const typename Op::second_argument_type& arg2_) : op(op_), arg2(arg2_) {} |
||||
|
||||
__forceinline__ __device__ typename Op::result_type operator ()(const typename Op::first_argument_type& a) |
||||
{ |
||||
return op(a, arg2); |
||||
} |
||||
|
||||
Op op; |
||||
typename Op::second_argument_type arg2; |
||||
}; |
||||
template <typename Op, typename T> static __forceinline__ __host__ __device__ binder2nd<Op> bind2nd(const Op& op, const T& x) |
||||
{ |
||||
return binder2nd<Op>(op, typename Op::second_argument_type(x)); |
||||
} |
||||
|
||||
template <typename T1, typename T2> struct BinOpTraits |
||||
{ |
||||
typedef int argument_type; |
||||
}; |
||||
template <typename T> struct BinOpTraits<T, T> |
||||
{ |
||||
typedef T argument_type; |
||||
}; |
||||
template <typename T> struct BinOpTraits<T, double> |
||||
{ |
||||
typedef double argument_type; |
||||
}; |
||||
template <typename T> struct BinOpTraits<double, T> |
||||
{ |
||||
typedef double argument_type; |
||||
}; |
||||
template <> struct BinOpTraits<double, double> |
||||
{ |
||||
typedef double argument_type; |
||||
}; |
||||
template <typename T> struct BinOpTraits<T, float> |
||||
{ |
||||
typedef float argument_type; |
||||
}; |
||||
template <typename T> struct BinOpTraits<float, T> |
||||
{ |
||||
typedef float argument_type; |
||||
}; |
||||
template <> struct BinOpTraits<float, float> |
||||
{ |
||||
typedef float argument_type; |
||||
}; |
||||
template <> struct BinOpTraits<double, float> |
||||
{ |
||||
typedef double argument_type; |
||||
}; |
||||
template <> struct BinOpTraits<float, double> |
||||
{ |
||||
typedef double argument_type; |
||||
}; |
||||
}}} |
||||
|
||||
#endif // __OPENCV_GPU_FUNCTIONAL_HPP__
|
@ -0,0 +1,206 @@ |
||||
/*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 __OPENCV_GPU_UTILITY_HPP__ |
||||
#define __OPENCV_GPU_UTILITY_HPP__ |
||||
|
||||
#include "internal_shared.hpp" |
||||
#include "saturate_cast.hpp" |
||||
|
||||
#ifndef __CUDA_ARCH__ |
||||
#define __CUDA_ARCH__ 0 |
||||
#endif |
||||
|
||||
#define OPENCV_GPU_LOG_WARP_SIZE (5) |
||||
#define OPENCV_GPU_WARP_SIZE (1 << OPENCV_GPU_LOG_WARP_SIZE) |
||||
#define OPENCV_GPU_LOG_MEM_BANKS ((__CUDA_ARCH__ >= 200) ? 5 : 4) // 32 banks on fermi, 16 on tesla
|
||||
#define OPENCV_GPU_MEM_BANKS (1 << OPENCV_GPU_LOG_MEM_BANKS) |
||||
|
||||
#if defined(_WIN64) || defined(__LP64__) |
||||
// 64-bit register modifier for inlined asm
|
||||
#define OPENCV_GPU_ASM_PTR "l" |
||||
#else |
||||
// 32-bit register modifier for inlined asm
|
||||
#define OPENCV_GPU_ASM_PTR "r" |
||||
#endif |
||||
|
||||
namespace cv { namespace gpu { namespace device |
||||
{ |
||||
template <typename T> void __host__ __device__ __forceinline__ swap(T &a, T &b)
|
||||
{ |
||||
T temp = a; |
||||
a = b; |
||||
b = temp; |
||||
} |
||||
|
||||
// warp-synchronous 32 elements reduction
|
||||
template <typename T, typename Op> __device__ __forceinline__ void warpReduce32(volatile T* data, volatile T& partial_reduction, int tid, Op op) |
||||
{ |
||||
data[tid] = partial_reduction; |
||||
|
||||
if (tid < 16) |
||||
{ |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 16]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 8 ]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 4 ]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 2 ]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 1 ]); |
||||
} |
||||
} |
||||
|
||||
// warp-synchronous 16 elements reduction
|
||||
template <typename T, typename Op> __device__ __forceinline__ void warpReduce16(volatile T* data, volatile T& partial_reduction, int tid, Op op) |
||||
{ |
||||
data[tid] = partial_reduction; |
||||
|
||||
if (tid < 8) |
||||
{ |
||||
data[tid] = partial_reduction = op(partial_reduction, (T)data[tid + 8 ]); |
||||
data[tid] = partial_reduction = op(partial_reduction, (T)data[tid + 4 ]); |
||||
data[tid] = partial_reduction = op(partial_reduction, (T)data[tid + 2 ]); |
||||
data[tid] = partial_reduction = op(partial_reduction, (T)data[tid + 1 ]); |
||||
} |
||||
} |
||||
|
||||
// warp-synchronous reduction
|
||||
template <int n, typename T, typename Op> __device__ __forceinline__ void warpReduce(volatile T* data, volatile T& partial_reduction, int tid, Op op) |
||||
{ |
||||
if (tid < n) |
||||
data[tid] = partial_reduction; |
||||
|
||||
if (n > 16) |
||||
{ |
||||
if (tid < n - 16)
|
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 16]); |
||||
if (tid < 8) |
||||
{ |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 8]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 4]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 2]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 1]); |
||||
} |
||||
} |
||||
else if (n > 8) |
||||
{ |
||||
if (tid < n - 8)
|
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 8]); |
||||
if (tid < 4) |
||||
{ |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 4]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 2]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 1]); |
||||
} |
||||
} |
||||
else if (n > 4) |
||||
{ |
||||
if (tid < n - 4)
|
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 4]); |
||||
if (tid < 2) |
||||
{ |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 2]); |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 1]); |
||||
} |
||||
}
|
||||
else if (n > 2) |
||||
{ |
||||
if (tid < n - 2)
|
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 2]); |
||||
if (tid < 2) |
||||
{ |
||||
data[tid] = partial_reduction = op(partial_reduction, data[tid + 1]); |
||||
} |
||||
}
|
||||
} |
||||
|
||||
// solve 2x2 linear system Ax=b
|
||||
template <typename T> __device__ __forceinline__ bool solve2x2(const T A[2][2], const T b[2], T x[2]) |
||||
{ |
||||
T det = A[0][0] * A[1][1] - A[1][0] * A[0][1]; |
||||
|
||||
if (det != 0) |
||||
{ |
||||
double invdet = 1.0 / det; |
||||
|
||||
x[0] = saturate_cast<T>(invdet * (b[0] * A[1][1] - b[1] * A[0][1])); |
||||
|
||||
x[1] = saturate_cast<T>(invdet * (A[0][0] * b[1] - A[1][0] * b[0])); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
// solve 3x3 linear system Ax=b
|
||||
template <typename T> __device__ __forceinline__ bool solve3x3(const T A[3][3], const T b[3], T x[3]) |
||||
{ |
||||
T det = A[0][0] * (A[1][1] * A[2][2] - A[1][2] * A[2][1]) |
||||
- A[0][1] * (A[1][0] * A[2][2] - A[1][2] * A[2][0]) |
||||
+ A[0][2] * (A[1][0] * A[2][1] - A[1][1] * A[2][0]); |
||||
|
||||
if (det != 0) |
||||
{ |
||||
double invdet = 1.0 / det; |
||||
|
||||
x[0] = saturate_cast<T>(invdet *
|
||||
(b[0] * (A[1][1] * A[2][2] - A[1][2] * A[2][1]) - |
||||
A[0][1] * (b[1] * A[2][2] - A[1][2] * b[2] ) + |
||||
A[0][2] * (b[1] * A[2][1] - A[1][1] * b[2] ))); |
||||
|
||||
x[1] = saturate_cast<T>(invdet *
|
||||
(A[0][0] * (b[1] * A[2][2] - A[1][2] * b[2] ) - |
||||
b[0] * (A[1][0] * A[2][2] - A[1][2] * A[2][0]) + |
||||
A[0][2] * (A[1][0] * b[2] - b[1] * A[2][0]))); |
||||
|
||||
x[2] = saturate_cast<T>(invdet *
|
||||
(A[0][0] * (A[1][1] * b[2] - b[1] * A[2][1]) - |
||||
A[0][1] * (A[1][0] * b[2] - b[1] * A[2][0]) + |
||||
b[0] * (A[1][0] * A[2][1] - A[1][1] * A[2][0]))); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
}}} |
||||
|
||||
#endif // __OPENCV_GPU_UTILITY_HPP__
|
@ -0,0 +1,287 @@ |
||||
/*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 __OPENCV_GPU_VECMATH_HPP__ |
||||
#define __OPENCV_GPU_VECMATH_HPP__ |
||||
|
||||
#include "internal_shared.hpp" |
||||
#include "saturate_cast.hpp" |
||||
#include "vec_traits.hpp" |
||||
#include "functional.hpp" |
||||
|
||||
namespace cv { namespace gpu { namespace device |
||||
{ |
||||
namespace detail |
||||
{ |
||||
template <int cn, typename VecD> struct SatCastHelper; |
||||
template <typename VecD> struct SatCastHelper<1, VecD> |
||||
{ |
||||
template <typename VecS> static __device__ VecD cast(const VecS& v) |
||||
{ |
||||
typedef typename VecTraits<VecD>::elem_type D; |
||||
return VecTraits<VecD>::make(saturate_cast<D>(v.x)); |
||||
} |
||||
}; |
||||
template <typename VecD> struct SatCastHelper<2, VecD> |
||||
{ |
||||
template <typename VecS> static __device__ VecD cast(const VecS& v) |
||||
{ |
||||
typedef typename VecTraits<VecD>::elem_type D; |
||||
return VecTraits<VecD>::make(saturate_cast<D>(v.x), saturate_cast<D>(v.y)); |
||||
} |
||||
}; |
||||
template <typename VecD> struct SatCastHelper<3, VecD> |
||||
{ |
||||
template <typename VecS> static __device__ VecD cast(const VecS& v) |
||||
{ |
||||
typedef typename VecTraits<VecD>::elem_type D; |
||||
return VecTraits<VecD>::make(saturate_cast<D>(v.x), saturate_cast<D>(v.y), saturate_cast<D>(v.z)); |
||||
} |
||||
}; |
||||
template <typename VecD> struct SatCastHelper<4, VecD> |
||||
{ |
||||
template <typename VecS> static __device__ VecD cast(const VecS& v) |
||||
{ |
||||
typedef typename VecTraits<VecD>::elem_type D; |
||||
return VecTraits<VecD>::make(saturate_cast<D>(v.x), saturate_cast<D>(v.y), saturate_cast<D>(v.z), saturate_cast<D>(v.w)); |
||||
} |
||||
}; |
||||
|
||||
template <typename VecD, typename VecS> static __device__ VecD saturate_cast_caller(const VecS& v) |
||||
{ |
||||
return SatCastHelper<VecTraits<VecD>::cn, VecD>::cast(v); |
||||
} |
||||
} |
||||
|
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uchar1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const char1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const ushort1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const short1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uint1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const int1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const float1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const double1& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
|
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uchar2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const char2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const ushort2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const short2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uint2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const int2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const float2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const double2& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
|
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uchar3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const char3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const ushort3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const short3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uint3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const int3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const float3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const double3& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
|
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uchar4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const char4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const ushort4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const short4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const uint4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const int4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const float4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
template<typename _Tp> static __device__ _Tp saturate_cast(const double4& v) {return detail::saturate_cast_caller<_Tp>(v);} |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, op, func) \ |
||||
static __device__ TypeVec<func<type>::result_type, 1>::vec_type op(const type ## 1 & a) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 1>::vec_type>::make(f(a.x)); \
|
||||
} \
|
||||
static __device__ TypeVec<func<type>::result_type, 2>::vec_type op(const type ## 2 & a) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 2>::vec_type>::make(f(a.x), f(a.y)); \
|
||||
} \
|
||||
static __device__ TypeVec<func<type>::result_type, 3>::vec_type op(const type ## 3 & a) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 3>::vec_type>::make(f(a.x), f(a.y), f(a.z)); \
|
||||
} \
|
||||
static __device__ TypeVec<func<type>::result_type, 4>::vec_type op(const type ## 4 & a) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 4>::vec_type>::make(f(a.x), f(a.y), f(a.z), f(a.w)); \
|
||||
} |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, op, func) \ |
||||
static __device__ TypeVec<func<type>::result_type, 1>::vec_type op(const type ## 1 & a, const type ## 1 & b) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 1>::vec_type>::make(f(a.x, b.x)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 1>::vec_type op(const type ## 1 & v, T s) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 1>::vec_type>::make(f(v.x, s)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 1>::vec_type op(T s, const type ## 1 & v) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 1>::vec_type>::make(f(s, v.x)); \
|
||||
} \
|
||||
static __device__ TypeVec<func<type>::result_type, 2>::vec_type op(const type ## 2 & a, const type ## 2 & b) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 2>::vec_type>::make(f(a.x, b.x), f(a.y, b.y)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 2>::vec_type op(const type ## 2 & v, T s) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 2>::vec_type>::make(f(v.x, s), f(v.y, s)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 2>::vec_type op(T s, const type ## 2 & v) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 2>::vec_type>::make(f(s, v.x), f(s, v.y)); \
|
||||
} \
|
||||
static __device__ TypeVec<func<type>::result_type, 3>::vec_type op(const type ## 3 & a, const type ## 3 & b) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 3>::vec_type>::make(f(a.x, b.x), f(a.y, b.y), f(a.z, b.z)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 3>::vec_type op(const type ## 3 & v, T s) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 3>::vec_type>::make(f(v.x, s), f(v.y, s), f(v.z, s)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 3>::vec_type op(T s, const type ## 3 & v) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 3>::vec_type>::make(f(s, v.x), f(s, v.y), f(s, v.z)); \
|
||||
} \
|
||||
static __device__ TypeVec<func<type>::result_type, 4>::vec_type op(const type ## 4 & a, const type ## 4 & b) \
|
||||
{ \
|
||||
func<type> f; \
|
||||
return VecTraits<TypeVec<func<type>::result_type, 4>::vec_type>::make(f(a.x, b.x), f(a.y, b.y), f(a.z, b.z), f(a.w, b.w)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 4>::vec_type op(const type ## 4 & v, T s) \
|
||||
{ \
|
||||
func<typename BinOpTraits<type, T>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 4>::vec_type>::make(f(v.x, s), f(v.y, s), f(v.z, s), f(v.w, s)); \
|
||||
} \
|
||||
template <typename T> \
|
||||
static __device__ typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 4>::vec_type op(T s, const type ## 4 & v) \
|
||||
{ \
|
||||
func<typename BinOpTraits<T, type>::argument_type> f; \
|
||||
return VecTraits<typename TypeVec<typename func<typename BinOpTraits<type, T>::argument_type>::result_type, 4>::vec_type>::make(f(s, v.x), f(s, v.y), f(s, v.z), f(s, v.w)); \
|
||||
} |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_VEC_OP(type) \ |
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator +, plus) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator -, minus) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator *, multiplies) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator /, divides) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP (type, operator -, negate) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator ==, equal_to) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator !=, not_equal_to) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator > , greater) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator < , less) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator >=, greater_equal) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator <=, less_equal) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator &&, logical_and) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator ||, logical_or) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP (type, operator ! , logical_not) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, max, maximum) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, min, minimum) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, fabs, fabs_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, sqrt, sqrt_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, exp, exp_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, exp2, exp2_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, exp10, exp10_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, log, log_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, log2, log2_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, log10, log10_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, sin, sin_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, cos, cos_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, tan, tan_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, asin, asin_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, acos, acos_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, atan, atan_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, sinh, sinh_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, cosh, cosh_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, tanh, tanh_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, asinh, asinh_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, acosh, acosh_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP(type, atanh, atanh_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, hypot, hypot_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, atan2, atan2_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, pow, pow_func) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, hypot_sqr, hypot_sqr_func) |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_VEC_INT_OP(type) \ |
||||
OPENCV_GPU_IMPLEMENT_VEC_OP(type) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator &, bit_and) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator |, bit_or) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_BINOP(type, operator ^, bit_xor) \
|
||||
OPENCV_GPU_IMPLEMENT_VEC_UNOP (type, operator ~, bit_not) |
||||
|
||||
OPENCV_GPU_IMPLEMENT_VEC_INT_OP(uchar) |
||||
OPENCV_GPU_IMPLEMENT_VEC_INT_OP(char) |
||||
OPENCV_GPU_IMPLEMENT_VEC_INT_OP(ushort) |
||||
OPENCV_GPU_IMPLEMENT_VEC_INT_OP(short) |
||||
OPENCV_GPU_IMPLEMENT_VEC_INT_OP(int) |
||||
OPENCV_GPU_IMPLEMENT_VEC_INT_OP(uint) |
||||
OPENCV_GPU_IMPLEMENT_VEC_OP(float) |
||||
OPENCV_GPU_IMPLEMENT_VEC_OP(double) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_VEC_UNOP |
||||
#undef OPENCV_GPU_IMPLEMENT_VEC_BINOP |
||||
#undef OPENCV_GPU_IMPLEMENT_VEC_OP |
||||
#undef OPENCV_GPU_IMPLEMENT_VEC_INT_OP |
||||
}}} |
||||
|
||||
#endif // __OPENCV_GPU_VECMATH_HPP__
|
@ -0,0 +1,142 @@ |
||||
/*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 __OPENCV_GPU_VEC_TRAITS_HPP__ |
||||
#define __OPENCV_GPU_VEC_TRAITS_HPP__ |
||||
|
||||
#include "internal_shared.hpp" |
||||
|
||||
namespace cv { namespace gpu { namespace device |
||||
{ |
||||
template<typename T, int N> struct TypeVec; |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_TYPE_VEC(type) \ |
||||
template<> struct TypeVec<type, 1> { typedef type vec_type; }; \
|
||||
template<> struct TypeVec<type ## 1, 1> { typedef type ## 1 vec_type; }; \
|
||||
template<> struct TypeVec<type, 2> { typedef type ## 2 vec_type; }; \
|
||||
template<> struct TypeVec<type ## 2, 2> { typedef type ## 2 vec_type; }; \
|
||||
template<> struct TypeVec<type, 3> { typedef type ## 3 vec_type; }; \
|
||||
template<> struct TypeVec<type ## 3, 3> { typedef type ## 3 vec_type; }; \
|
||||
template<> struct TypeVec<type, 4> { typedef type ## 4 vec_type; }; \
|
||||
template<> struct TypeVec<type ## 4, 4> { typedef type ## 4 vec_type; }; |
||||
|
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(uchar) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(char) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(ushort) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(short) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(int) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(uint) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(float) |
||||
OPENCV_GPU_IMPLEMENT_TYPE_VEC(double) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_TYPE_VEC |
||||
|
||||
template<> struct TypeVec<schar, 1> { typedef schar vec_type; }; |
||||
template<> struct TypeVec<schar, 2> { typedef char2 vec_type; }; |
||||
template<> struct TypeVec<schar, 3> { typedef char3 vec_type; }; |
||||
template<> struct TypeVec<schar, 4> { typedef char4 vec_type; }; |
||||
|
||||
template<> struct TypeVec<bool, 1> { typedef uchar vec_type; }; |
||||
template<> struct TypeVec<bool, 2> { typedef uchar2 vec_type; }; |
||||
template<> struct TypeVec<bool, 3> { typedef uchar3 vec_type; }; |
||||
template<> struct TypeVec<bool, 4> { typedef uchar4 vec_type; }; |
||||
|
||||
template<typename T> struct VecTraits; |
||||
|
||||
#define OPENCV_GPU_IMPLEMENT_VEC_TRAITS(type) \ |
||||
template<> struct VecTraits<type> \
|
||||
{ \
|
||||
typedef type elem_type; \
|
||||
enum {cn=1}; \
|
||||
static __device__ __host__ type all(type v) {return v;} \
|
||||
static __device__ __host__ type make(type x) {return x;} \
|
||||
}; \
|
||||
template<> struct VecTraits<type ## 1> \
|
||||
{ \
|
||||
typedef type elem_type; \
|
||||
enum {cn=1}; \
|
||||
static __device__ __host__ type ## 1 all(type v) {return make_ ## type ## 1(v);} \
|
||||
static __device__ __host__ type ## 1 make(type x) {return make_ ## type ## 1(x);} \
|
||||
}; \
|
||||
template<> struct VecTraits<type ## 2> \
|
||||
{ \
|
||||
typedef type elem_type; \
|
||||
enum {cn=2}; \
|
||||
static __device__ __host__ type ## 2 all(type v) {return make_ ## type ## 2(v, v);} \
|
||||
static __device__ __host__ type ## 2 make(type x, type y) {return make_ ## type ## 2(x, y);} \
|
||||
}; \
|
||||
template<> struct VecTraits<type ## 3> \
|
||||
{ \
|
||||
typedef type elem_type; \
|
||||
enum {cn=3}; \
|
||||
static __device__ __host__ type ## 3 all(type v) {return make_ ## type ## 3(v, v, v);} \
|
||||
static __device__ __host__ type ## 3 make(type x, type y, type z) {return make_ ## type ## 3(x, y, z);} \
|
||||
}; \
|
||||
template<> struct VecTraits<type ## 4> \
|
||||
{ \
|
||||
typedef type elem_type; \
|
||||
enum {cn=4}; \
|
||||
static __device__ __host__ type ## 4 all(type v) {return make_ ## type ## 4(v, v, v, v);} \
|
||||
static __device__ __host__ type ## 4 make(type x, type y, type z, type w) {return make_ ## type ## 4(x, y, z, w);} \
|
||||
}; |
||||
|
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(uchar) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(char) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(ushort) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(short) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(int) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(uint) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(float) |
||||
OPENCV_GPU_IMPLEMENT_VEC_TRAITS(double) |
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_VEC_TRAITS |
||||
|
||||
template<> struct VecTraits<schar>
|
||||
{
|
||||
typedef schar elem_type;
|
||||
enum {cn=1};
|
||||
static __device__ __host__ schar all(schar v) {return v;} |
||||
static __device__ __host__ schar make(schar x) {return x;} |
||||
}; |
||||
}}} |
||||
|
||||
#endif // __OPENCV_GPU_VEC_TRAITS_HPP__
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue