EstervQrCode 2.0.0
Library for qr code manipulation
Loading...
Searching...
No Matches
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
58namespace 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
CvArr * sum
Definition imgproc_c.h:61
"black box" representation of the file storage associated with a file on disk.
Definition calib3d.hpp:441