EstervQrCode 1.1.1
Library for qr code manipulation
filters.hpp
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 // By downloading, copying, installing or using the software you agree to this license.
6 // If you do not agree to this license, do not download, install,
7 // copy or use the software.
8 //
9 //
10 // License Agreement
11 // For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // Redistribution and use in source and binary forms, with or without modification,
18 // are permitted provided that the following conditions are met:
19 //
20 // * Redistribution's of source code must retain the above copyright notice,
21 // this list of conditions and the following disclaimer.
22 //
23 // * Redistribution's in binary form must reproduce the above copyright notice,
24 // this list of conditions and the following disclaimer in the documentation
25 // and/or other materials provided with the distribution.
26 //
27 // * The name of the copyright holders may not be used to endorse or promote products
28 // derived from this software without specific prior written permission.
29 //
30 // This software is provided by the copyright holders and contributors "as is" and
31 // any express or implied warranties, including, but not limited to, the implied
32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
33 // In no event shall the Intel Corporation or contributors be liable for any direct,
34 // indirect, incidental, special, exemplary, or consequential damages
35 // (including, but not limited to, procurement of substitute goods or services;
36 // loss of use, data, or profits; or business interruption) however caused
37 // and on any theory of liability, whether in contract, strict liability,
38 // or tort (including negligence or otherwise) arising in any way out of
39 // the use of this software, even if advised of the possibility of such damage.
40 //
41 //M*/
42 
43 #ifndef OPENCV_CUDA_FILTERS_HPP
44 #define OPENCV_CUDA_FILTERS_HPP
45 
46 #include "saturate_cast.hpp"
47 #include "vec_traits.hpp"
48 #include "vec_math.hpp"
49 #include "type_traits.hpp"
50 #include "nppdefs.h"
51 
57 
58 namespace cv { namespace cuda { namespace device
59 {
60  template <typename Ptr2D> struct PointFilter
61  {
62  typedef typename Ptr2D::elem_type elem_type;
63  typedef float index_type;
64 
65  explicit __host__ __device__ __forceinline__ PointFilter(const Ptr2D& src_, float fx = 0.f, float fy = 0.f)
66  : src(src_)
67  {
68  CV_UNUSED(fx);
69  CV_UNUSED(fy);
70  }
71 
72  __device__ __forceinline__ elem_type operator ()(float y, float x) const
73  {
74  return src(__float2int_rz(y), __float2int_rz(x));
75  }
76 
77  Ptr2D src;
78  };
79 
80  template <typename Ptr2D> struct LinearFilter
81  {
82  typedef typename Ptr2D::elem_type elem_type;
83  typedef float index_type;
84 
85  explicit __host__ __device__ __forceinline__ LinearFilter(const Ptr2D& src_, float fx = 0.f, float fy = 0.f)
86  : src(src_)
87  {
88  CV_UNUSED(fx);
89  CV_UNUSED(fy);
90  }
91  __device__ __forceinline__ elem_type operator ()(float y, float x) const
92  {
93  typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
94 
95  work_type out = VecTraits<work_type>::all(0);
96 
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)
100  {
101  elem_type src_reg = src(y1, x1);
102  out = out + src_reg * 1.0f;
103  return saturate_cast<elem_type>(out);
104  }
105  const int x2 = x1 + 1;
106  const int y2 = y1 + 1;
107 
108  elem_type src_reg = src(y1, x1);
109  out = out + src_reg * ((x2 - x) * (y2 - y));
110 
111  src_reg = src(y1, x2);
112  out = out + src_reg * ((x - x1) * (y2 - y));
113 
114  src_reg = src(y2, x1);
115  out = out + src_reg * ((x2 - x) * (y - y1));
116 
117  src_reg = src(y2, x2);
118  out = out + src_reg * ((x - x1) * (y - y1));
119 
120  return saturate_cast<elem_type>(out);
121  }
122 
123  Ptr2D src;
124  };
125 
126  template <typename Ptr2D> struct CubicFilter
127  {
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;
131 
132  explicit __host__ __device__ __forceinline__ CubicFilter(const Ptr2D& src_, float fx = 0.f, float fy = 0.f)
133  : src(src_)
134  {
135  CV_UNUSED(fx);
136  CV_UNUSED(fy);
137  }
138 
139  static __device__ __forceinline__ float bicubicCoeff(float x_)
140  {
141  float x = fabsf(x_);
142  if (x <= 1.0f)
143  {
144  return x * x * (1.5f * x - 2.5f) + 1.0f;
145  }
146  else if (x < 2.0f)
147  {
148  return x * (x * (-0.5f * x + 2.5f) - 4.0f) + 2.0f;
149  }
150  else
151  {
152  return 0.0f;
153  }
154  }
155 
156  __device__ elem_type operator ()(float y, float x) const
157  {
158  const float xmin = ::ceilf(x - 2.0f);
159  const float xmax = ::floorf(x + 2.0f);
160 
161  const float ymin = ::ceilf(y - 2.0f);
162  const float ymax = ::floorf(y + 2.0f);
163 
164  work_type sum = VecTraits<work_type>::all(0);
165  float wsum = 0.0f;
166 
167  for (float cy = ymin; cy <= ymax; cy += 1.0f)
168  {
169  for (float cx = xmin; cx <= xmax; cx += 1.0f)
170  {
171  const float w = bicubicCoeff(x - cx) * bicubicCoeff(y - cy);
172  sum = sum + w * src(__float2int_rd(cy), __float2int_rd(cx));
173  wsum += w;
174  }
175  }
176 
177  work_type res = (!wsum)? VecTraits<work_type>::all(0) : sum / wsum;
178 
179  return saturate_cast<elem_type>(res);
180  }
181 
182  Ptr2D src;
183  };
184  // for integer scaling
185  template <typename Ptr2D> struct IntegerAreaFilter
186  {
187  typedef typename Ptr2D::elem_type elem_type;
188  typedef float index_type;
189 
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)) {}
192 
193  __device__ __forceinline__ elem_type operator ()(float y, float x) const
194  {
195  float fsx1 = x * scale_x;
196  float fsx2 = fsx1 + scale_x;
197 
198  int sx1 = __float2int_ru(fsx1);
199  int sx2 = __float2int_rd(fsx2);
200 
201  float fsy1 = y * scale_y;
202  float fsy2 = fsy1 + scale_y;
203 
204  int sy1 = __float2int_ru(fsy1);
205  int sy2 = __float2int_rd(fsy2);
206 
207  typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
208  work_type out = VecTraits<work_type>::all(0.f);
209 
210  for(int dy = sy1; dy < sy2; ++dy)
211  for(int dx = sx1; dx < sx2; ++dx)
212  {
213  out = out + src(dy, dx) * scale;
214  }
215 
216  return saturate_cast<elem_type>(out);
217  }
218 
219  Ptr2D src;
220  float scale_x, scale_y ,scale;
221  };
222 
223  template <typename Ptr2D> struct AreaFilter
224  {
225  typedef typename Ptr2D::elem_type elem_type;
226  typedef float index_type;
227 
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_){}
230 
231  __device__ __forceinline__ elem_type operator ()(float y, float x) const
232  {
233  float fsx1 = x * scale_x;
234  float fsx2 = fsx1 + scale_x;
235 
236  int sx1 = __float2int_ru(fsx1);
237  int sx2 = __float2int_rd(fsx2);
238 
239  float fsy1 = y * scale_y;
240  float fsy2 = fsy1 + scale_y;
241 
242  int sy1 = __float2int_ru(fsy1);
243  int sy2 = __float2int_rd(fsy2);
244 
245  float scale = 1.f / (fminf(scale_x, src.width - fsx1) * fminf(scale_y, src.height - fsy1));
246 
247  typedef typename TypeVec<float, VecTraits<elem_type>::cn>::vec_type work_type;
248  work_type out = VecTraits<work_type>::all(0.f);
249 
250  for (int dy = sy1; dy < sy2; ++dy)
251  {
252  for (int dx = sx1; dx < sx2; ++dx)
253  out = out + src(dy, dx) * scale;
254 
255  if (sx1 > fsx1)
256  out = out + src(dy, (sx1 -1) ) * ((sx1 - fsx1) * scale);
257 
258  if (sx2 < fsx2)
259  out = out + src(dy, sx2) * ((fsx2 -sx2) * scale);
260  }
261 
262  if (sy1 > fsy1)
263  for (int dx = sx1; dx < sx2; ++dx)
264  out = out + src( (sy1 - 1) , dx) * ((sy1 -fsy1) * scale);
265 
266  if (sy2 < fsy2)
267  for (int dx = sx1; dx < sx2; ++dx)
268  out = out + src(sy2, dx) * ((fsy2 -sy2) * scale);
269 
270  if ((sy1 > fsy1) && (sx1 > fsx1))
271  out = out + src( (sy1 - 1) , (sx1 - 1)) * ((sy1 -fsy1) * (sx1 -fsx1) * scale);
272 
273  if ((sy1 > fsy1) && (sx2 < fsx2))
274  out = out + src( (sy1 - 1) , sx2) * ((sy1 -fsy1) * (fsx2 -sx2) * scale);
275 
276  if ((sy2 < fsy2) && (sx2 < fsx2))
277  out = out + src(sy2, sx2) * ((fsy2 -sy2) * (fsx2 -sx2) * scale);
278 
279  if ((sy2 < fsy2) && (sx1 > fsx1))
280  out = out + src(sy2, (sx1 - 1)) * ((fsy2 -sy2) * (sx1 -fsx1) * scale);
281 
282  return saturate_cast<elem_type>(out);
283  }
284 
285  Ptr2D src;
286  float scale_x, scale_y;
287  int width, haight;
288  };
289 }}} // namespace cv { namespace cuda { namespace cudev
290 
292 
293 #endif // OPENCV_CUDA_FILTERS_HPP
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