43 #ifndef OPENCV_CUDA_FILTERS_HPP
44 #define OPENCV_CUDA_FILTERS_HPP
46 #include "saturate_cast.hpp"
47 #include "vec_traits.hpp"
48 #include "vec_math.hpp"
49 #include "type_traits.hpp"
58 namespace cv {
namespace cuda {
namespace device
60 template <
typename Ptr2D>
struct PointFilter
62 typedef typename Ptr2D::elem_type elem_type;
63 typedef float index_type;
65 explicit __host__ __device__ __forceinline__ PointFilter(
const Ptr2D& src_,
float fx = 0.f,
float fy = 0.f)
72 __device__ __forceinline__ elem_type operator ()(
float y,
float x)
const
74 return src(__float2int_rz(
y), __float2int_rz(
x));
80 template <
typename Ptr2D>
struct LinearFilter
82 typedef typename Ptr2D::elem_type elem_type;
83 typedef float index_type;
85 explicit __host__ __device__ __forceinline__ LinearFilter(
const Ptr2D& src_,
float fx = 0.f,
float fy = 0.f)
91 __device__ __forceinline__ elem_type operator ()(
float y,
float x)
const
93 typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
95 work_type out = VecTraits<work_type>::all(0);
97 const int x1 = __float2int_rd(
x);
98 const int y1 = __float2int_rd(
y);
99 if (x1 <= NPP_MIN_32S || x1 >= NPP_MAX_32S || y1 <= NPP_MIN_32S || y1 >= NPP_MAX_32S)
101 elem_type src_reg = src(y1, x1);
102 out = out + src_reg * 1.0f;
103 return saturate_cast<elem_type>(out);
105 const int x2 = x1 + 1;
106 const int y2 = y1 + 1;
108 elem_type src_reg = src(y1, x1);
109 out = out + src_reg * ((x2 -
x) * (y2 -
y));
111 src_reg = src(y1, x2);
112 out = out + src_reg * ((
x - x1) * (y2 -
y));
114 src_reg = src(y2, x1);
115 out = out + src_reg * ((x2 -
x) * (
y - y1));
117 src_reg = src(y2, x2);
118 out = out + src_reg * ((
x - x1) * (
y - y1));
120 return saturate_cast<elem_type>(out);
126 template <
typename Ptr2D>
struct CubicFilter
128 typedef typename Ptr2D::elem_type elem_type;
129 typedef float index_type;
130 typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
132 explicit __host__ __device__ __forceinline__ CubicFilter(
const Ptr2D& src_,
float fx = 0.f,
float fy = 0.f)
139 static __device__ __forceinline__
float bicubicCoeff(
float x_)
144 return x *
x * (1.5f *
x - 2.5f) + 1.0f;
148 return x * (
x * (-0.5f *
x + 2.5f) - 4.0f) + 2.0f;
156 __device__ elem_type operator ()(
float y,
float x)
const
158 const float xmin = ::ceilf(
x - 2.0f);
159 const float xmax = ::floorf(
x + 2.0f);
161 const float ymin = ::ceilf(
y - 2.0f);
162 const float ymax = ::floorf(
y + 2.0f);
164 work_type
sum = VecTraits<work_type>::all(0);
167 for (
float cy = ymin; cy <= ymax; cy += 1.0f)
169 for (
float cx = xmin; cx <= xmax; cx += 1.0f)
171 const float w = bicubicCoeff(
x - cx) * bicubicCoeff(
y - cy);
172 sum =
sum + w * src(__float2int_rd(cy), __float2int_rd(cx));
177 work_type res = (!wsum)? VecTraits<work_type>::all(0) :
sum / wsum;
179 return saturate_cast<elem_type>(res);
185 template <
typename Ptr2D>
struct IntegerAreaFilter
187 typedef typename Ptr2D::elem_type elem_type;
188 typedef float index_type;
190 explicit __host__ __device__ __forceinline__ IntegerAreaFilter(
const Ptr2D& src_,
float scale_x_,
float scale_y_)
191 : src(src_), scale_x(scale_x_), scale_y(scale_y_),
scale(1.f / (scale_x * scale_y)) {}
193 __device__ __forceinline__ elem_type operator ()(
float y,
float x)
const
195 float fsx1 =
x * scale_x;
196 float fsx2 = fsx1 + scale_x;
198 int sx1 = __float2int_ru(fsx1);
199 int sx2 = __float2int_rd(fsx2);
201 float fsy1 =
y * scale_y;
202 float fsy2 = fsy1 + scale_y;
204 int sy1 = __float2int_ru(fsy1);
205 int sy2 = __float2int_rd(fsy2);
207 typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
208 work_type out = VecTraits<work_type>::all(0.f);
210 for(
int dy = sy1; dy < sy2; ++dy)
211 for(
int dx = sx1; dx < sx2; ++dx)
213 out = out + src(dy, dx) *
scale;
216 return saturate_cast<elem_type>(out);
220 float scale_x, scale_y ,
scale;
223 template <
typename Ptr2D>
struct AreaFilter
225 typedef typename Ptr2D::elem_type elem_type;
226 typedef float index_type;
228 explicit __host__ __device__ __forceinline__ AreaFilter(
const Ptr2D& src_,
float scale_x_,
float scale_y_)
229 : src(src_), scale_x(scale_x_), scale_y(scale_y_){}
231 __device__ __forceinline__ elem_type operator ()(
float y,
float x)
const
233 float fsx1 =
x * scale_x;
234 float fsx2 = fsx1 + scale_x;
236 int sx1 = __float2int_ru(fsx1);
237 int sx2 = __float2int_rd(fsx2);
239 float fsy1 =
y * scale_y;
240 float fsy2 = fsy1 + scale_y;
242 int sy1 = __float2int_ru(fsy1);
243 int sy2 = __float2int_rd(fsy2);
245 float scale = 1.f / (fminf(scale_x, src.width - fsx1) * fminf(scale_y, src.height - fsy1));
247 typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
248 work_type out = VecTraits<work_type>::all(0.f);
250 for (
int dy = sy1; dy < sy2; ++dy)
252 for (
int dx = sx1; dx < sx2; ++dx)
253 out = out + src(dy, dx) *
scale;
256 out = out + src(dy, (sx1 -1) ) * ((sx1 - fsx1) *
scale);
259 out = out + src(dy, sx2) * ((fsx2 -sx2) *
scale);
263 for (
int dx = sx1; dx < sx2; ++dx)
264 out = out + src( (sy1 - 1) , dx) * ((sy1 -fsy1) *
scale);
267 for (
int dx = sx1; dx < sx2; ++dx)
268 out = out + src(sy2, dx) * ((fsy2 -sy2) *
scale);
270 if ((sy1 > fsy1) && (sx1 > fsx1))
271 out = out + src( (sy1 - 1) , (sx1 - 1)) * ((sy1 -fsy1) * (sx1 -fsx1) *
scale);
273 if ((sy1 > fsy1) && (sx2 < fsx2))
274 out = out + src( (sy1 - 1) , sx2) * ((sy1 -fsy1) * (fsx2 -sx2) *
scale);
276 if ((sy2 < fsy2) && (sx2 < fsx2))
277 out = out + src(sy2, sx2) * ((fsy2 -sy2) * (fsx2 -sx2) *
scale);
279 if ((sy2 < fsy2) && (sx1 > fsx1))
280 out = out + src(sy2, (sx1 - 1)) * ((fsy2 -sy2) * (sx1 -fsx1) *
scale);
282 return saturate_cast<elem_type>(out);
286 float scale_x, scale_y;
CvScalar scale
Definition: core_c.h:1088
const CvArr CvArr * x
Definition: core_c.h:1195
const CvArr * y
Definition: core_c.h:1187
OutputArray sum
Definition: imgproc.hpp:2882
"black box" representation of the file storage associated with a file on disk.
Definition: calib3d.hpp:441