• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * By downloading, copying, installing or using the software you agree to this license.
3  * If you do not agree to this license, do not download, install,
4  * copy or use the software.
5  *
6  *
7  *                           License Agreement
8  *                For Open Source Computer Vision Library
9  *                        (3-clause BSD License)
10  *
11  * Copyright (C) 2014-2015, NVIDIA Corporation, all rights reserved.
12  * Third party copyrights are property of their respective owners.
13  *
14  * Redistribution and use in source and binary forms, with or without modification,
15  * are permitted provided that the following conditions are met:
16  *
17  *   * Redistributions of source code must retain the above copyright notice,
18  *     this list of conditions and the following disclaimer.
19  *
20  *   * Redistributions in binary form must reproduce the above copyright notice,
21  *     this list of conditions and the following disclaimer in the documentation
22  *     and/or other materials provided with the distribution.
23  *
24  *   * Neither the names of the copyright holders nor the names of the contributors
25  *     may be used to endorse or promote products derived from this software
26  *     without specific prior written permission.
27  *
28  * This software is provided by the copyright holders and contributors "as is" and
29  * any express or implied warranties, including, but not limited to, the implied
30  * warranties of merchantability and fitness for a particular purpose are disclaimed.
31  * In no event shall copyright holders or contributors be liable for any direct,
32  * indirect, incidental, special, exemplary, or consequential damages
33  * (including, but not limited to, procurement of substitute goods or services;
34  * loss of use, data, or profits; or business interruption) however caused
35  * and on any theory of liability, whether in contract, strict liability,
36  * or tort (including negligence or otherwise) arising in any way out of
37  * the use of this software, even if advised of the possibility of such damage.
38  */
39 
40 #ifndef CAROTENE_FUNCTIONS_HPP
41 #define CAROTENE_FUNCTIONS_HPP
42 
43 #include <carotene/definitions.hpp>
44 #include <carotene/types.hpp>
45 
46 namespace CAROTENE_NS {
47     /* If this returns false, none of the functions will work. */
48     bool isSupportedConfiguration();
49 
50     /*
51         For each point `p` within `size`, do:
52         dst[p] = src0[p] + src1[p]
53     */
54     void add(const Size2D &size,
55              const u8 *src0Base, ptrdiff_t src0Stride,
56              const u8 *src1Base, ptrdiff_t src1Stride,
57              u8 *dstBase, ptrdiff_t dstStride,
58              CONVERT_POLICY policy);
59 
60     void add(const Size2D &size,
61              const u8 *src0Base, ptrdiff_t src0Stride,
62              const u8 *src1Base, ptrdiff_t src1Stride,
63              s16 *dstBase, ptrdiff_t dstStride,
64              CONVERT_POLICY policy);
65 
66     void add(const Size2D &size,
67              const u8 *src0Base, ptrdiff_t src0Stride,
68              const s16 *src1Base, ptrdiff_t src1Stride,
69              s16 *dstBase, ptrdiff_t dstStride,
70              CONVERT_POLICY policy);
71 
72     void add(const Size2D &size,
73              const s8 *src0Base, ptrdiff_t src0Stride,
74              const s8 *src1Base, ptrdiff_t src1Stride,
75              s8 *dstBase, ptrdiff_t dstStride,
76              CONVERT_POLICY policy);
77 
78     void add(const Size2D &size,
79              const s16 *src0Base, ptrdiff_t src0Stride,
80              const s16 *src1Base, ptrdiff_t src1Stride,
81              s16 *dstBase, ptrdiff_t dstStride,
82              CONVERT_POLICY policy);
83 
84     void add(const Size2D &size,
85              const u16 * src0Base, ptrdiff_t src0Stride,
86              const u16 * src1Base, ptrdiff_t src1Stride,
87              u16 * dstBase, ptrdiff_t dstStride,
88              CONVERT_POLICY policy);
89 
90     void add(const Size2D &size,
91              const s32 * src0Base, ptrdiff_t src0Stride,
92              const s32 * src1Base, ptrdiff_t src1Stride,
93              s32 * dstBase, ptrdiff_t dstStride,
94              CONVERT_POLICY policy);
95 
96     void add(const Size2D &size,
97              const u32 * src0Base, ptrdiff_t src0Stride,
98              const u32 * src1Base, ptrdiff_t src1Stride,
99              u32 * dstBase, ptrdiff_t dstStride,
100              CONVERT_POLICY policy);
101 
102     void add(const Size2D &size,
103              const f32 * src0Base, ptrdiff_t src0Stride,
104              const f32 * src1Base, ptrdiff_t src1Stride,
105              f32 * dstBase, ptrdiff_t dstStride);
106 
107     /*
108         For each point `p` within `size`, do:
109         dst[p] = src0[p] - src1[p]
110     */
111     void sub(const Size2D &size,
112              const u8 *src0Base, ptrdiff_t src0Stride,
113              const u8 *src1Base, ptrdiff_t src1Stride,
114              u8 *dstBase, ptrdiff_t dstStride,
115              CONVERT_POLICY policy);
116 
117     void sub(const Size2D &size,
118              const u8 *src0Base, ptrdiff_t src0Stride,
119              const u8 *src1Base, ptrdiff_t src1Stride,
120              s16 *dstBase, ptrdiff_t dstStride,
121              CONVERT_POLICY policy);
122 
123     void sub(const Size2D &size,
124              const u8 *src0Base, ptrdiff_t src0Stride,
125              const u8 *src1Base, ptrdiff_t src1Stride,
126              f32 *dstBase, ptrdiff_t dstStride);
127 
128     void sub(const Size2D &size,
129              const u8 *src0Base, ptrdiff_t src0Stride,
130              const s16 *src1Base, ptrdiff_t src1Stride,
131              s16 *dstBase, ptrdiff_t dstStride,
132              CONVERT_POLICY policy);
133 
134     void sub(const Size2D &size,
135              const s16 *src0Base, ptrdiff_t src0Stride,
136              const u8 *src1Base, ptrdiff_t src1Stride,
137              s16 *dstBase, ptrdiff_t dstStride,
138              CONVERT_POLICY policy);
139 
140     void sub(const Size2D &size,
141              const s16 *src0Base, ptrdiff_t src0Stride,
142              const s16 *src1Base, ptrdiff_t src1Stride,
143              s16 *dstBase, ptrdiff_t dstStride,
144              CONVERT_POLICY policy);
145 
146     void sub(const Size2D &size,
147              const s8 *src0Base, ptrdiff_t src0Stride,
148              const s8 *src1Base, ptrdiff_t src1Stride,
149              s8 *dstBase, ptrdiff_t dstStride,
150              CONVERT_POLICY policy);
151 
152     void sub(const Size2D &size,
153              const u16 * src0Base, ptrdiff_t src0Stride,
154              const u16 * src1Base, ptrdiff_t src1Stride,
155              u16 * dstBase, ptrdiff_t dstStride,
156              CONVERT_POLICY policy);
157 
158     void sub(const Size2D &size,
159              const s32 * src0Base, ptrdiff_t src0Stride,
160              const s32 * src1Base, ptrdiff_t src1Stride,
161              s32 * dstBase, ptrdiff_t dstStride,
162              CONVERT_POLICY policy);
163 
164     void sub(const Size2D &size,
165              const u32 * src0Base, ptrdiff_t src0Stride,
166              const u32 * src1Base, ptrdiff_t src1Stride,
167              u32 * dstBase, ptrdiff_t dstStride,
168              CONVERT_POLICY policy);
169 
170     void sub(const Size2D &size,
171              const f32 * src0Base, ptrdiff_t src0Stride,
172              const f32 * src1Base, ptrdiff_t src1Stride,
173              f32 * dstBase, ptrdiff_t dstStride);
174 
175     /*
176         For each point `p` within `size`, do:
177         dst[p] = src0[p] * alpha + src1[p] * beta + gamma
178     */
179     void addWeighted(const Size2D &size,
180                      const u8 * src0Base, ptrdiff_t src0Stride,
181                      const u8 * src1Base, ptrdiff_t src1Stride,
182                      u8 * dstBase, ptrdiff_t dstStride,
183                      f32 alpha, f32 beta, f32 gamma);
184 
185     void addWeighted(const Size2D &size,
186                      const s8 * src0Base, ptrdiff_t src0Stride,
187                      const s8 * src1Base, ptrdiff_t src1Stride,
188                      s8 * dstBase, ptrdiff_t dstStride,
189                      f32 alpha, f32 beta, f32 gamma);
190 
191     void addWeighted(const Size2D &size,
192                      const u16 * src0Base, ptrdiff_t src0Stride,
193                      const u16 * src1Base, ptrdiff_t src1Stride,
194                      u16 * dstBase, ptrdiff_t dstStride,
195                      f32 alpha, f32 beta, f32 gamma);
196 
197     void addWeighted(const Size2D &size,
198                      const s16 * src0Base, ptrdiff_t src0Stride,
199                      const s16 * src1Base, ptrdiff_t src1Stride,
200                      s16 * dstBase, ptrdiff_t dstStride,
201                      f32 alpha, f32 beta, f32 gamma);
202 
203     void addWeighted(const Size2D &size,
204                      const u32 * src0Base, ptrdiff_t src0Stride,
205                      const u32 * src1Base, ptrdiff_t src1Stride,
206                      u32 * dstBase, ptrdiff_t dstStride,
207                      f32 alpha, f32 beta, f32 gamma);
208 
209     void addWeighted(const Size2D &size,
210                      const s32 * src0Base, ptrdiff_t src0Stride,
211                      const s32 * src1Base, ptrdiff_t src1Stride,
212                      s32 * dstBase, ptrdiff_t dstStride,
213                      f32 alpha, f32 beta, f32 gamma);
214 
215     void addWeighted(const Size2D &size,
216                      const f32 * src0Base, ptrdiff_t src0Stride,
217                      const f32 * src1Base, ptrdiff_t src1Stride,
218                      f32 * dstBase, ptrdiff_t dstStride,
219                      f32 alpha, f32 beta, f32 gamma);
220 
221     /*
222         For each point `p` within `size`, do:
223         dst[p] = min(src0[p], src1[p])
224     */
225     void min(const Size2D &size,
226              const u8 *src0Base, ptrdiff_t src0Stride,
227              const u8 *src1Base, ptrdiff_t src1Stride,
228              u8 *dstBase, ptrdiff_t dstStride);
229 
230     void min(const Size2D &size,
231              const s8 *src0Base, ptrdiff_t src0Stride,
232              const s8 *src1Base, ptrdiff_t src1Stride,
233              s8 *dstBase, ptrdiff_t dstStride);
234 
235     void min(const Size2D &size,
236              const u16 * src0Base, ptrdiff_t src0Stride,
237              const u16 * src1Base, ptrdiff_t src1Stride,
238              u16 * dstBase, ptrdiff_t dstStride);
239 
240     void min(const Size2D &size,
241              const s16 *src0Base, ptrdiff_t src0Stride,
242              const s16 *src1Base, ptrdiff_t src1Stride,
243              s16 *dstBase, ptrdiff_t dstStride);
244 
245     void min(const Size2D &size,
246              const s32 * src0Base, ptrdiff_t src0Stride,
247              const s32 * src1Base, ptrdiff_t src1Stride,
248              s32 * dstBase, ptrdiff_t dstStride);
249 
250     void min(const Size2D &size,
251              const u32 * src0Base, ptrdiff_t src0Stride,
252              const u32 * src1Base, ptrdiff_t src1Stride,
253              u32 * dstBase, ptrdiff_t dstStride);
254 
255     void min(const Size2D &size,
256              const f32 * src0Base, ptrdiff_t src0Stride,
257              const f32 * src1Base, ptrdiff_t src1Stride,
258              f32 * dstBase, ptrdiff_t dstStride);
259 
260     /*
261         For each point `p` within `size`, do:
262         dst[p] = max(src0[p], src1[p])
263     */
264     void max(const Size2D &size,
265              const u8 *src0Base, ptrdiff_t src0Stride,
266              const u8 *src1Base, ptrdiff_t src1Stride,
267              u8 *dstBase, ptrdiff_t dstStride);
268 
269     void max(const Size2D &size,
270              const s8 *src0Base, ptrdiff_t src0Stride,
271              const s8 *src1Base, ptrdiff_t src1Stride,
272              s8 *dstBase, ptrdiff_t dstStride);
273 
274     void max(const Size2D &size,
275              const u16 * src0Base, ptrdiff_t src0Stride,
276              const u16 * src1Base, ptrdiff_t src1Stride,
277              u16 * dstBase, ptrdiff_t dstStride);
278 
279     void max(const Size2D &size,
280              const s16 *src0Base, ptrdiff_t src0Stride,
281              const s16 *src1Base, ptrdiff_t src1Stride,
282              s16 *dstBase, ptrdiff_t dstStride);
283 
284     void max(const Size2D &size,
285              const s32 * src0Base, ptrdiff_t src0Stride,
286              const s32 * src1Base, ptrdiff_t src1Stride,
287              s32 * dstBase, ptrdiff_t dstStride);
288 
289     void max(const Size2D &size,
290              const u32 * src0Base, ptrdiff_t src0Stride,
291              const u32 * src1Base, ptrdiff_t src1Stride,
292              u32 * dstBase, ptrdiff_t dstStride);
293 
294     void max(const Size2D &size,
295              const f32 * src0Base, ptrdiff_t src0Stride,
296              const f32 * src1Base, ptrdiff_t src1Stride,
297              f32 * dstBase, ptrdiff_t dstStride);
298 
299     /*
300         For each point `p` within `size`, do:
301         dst[p] = src0[p] * src1[p] * scale
302 
303         NOTE: ROUND_TO_ZERO convert policy is used
304     */
305     void mul(const Size2D &size,
306              const u8 * src0Base, ptrdiff_t src0Stride,
307              const u8 * src1Base, ptrdiff_t src1Stride,
308              u8 * dstBase, ptrdiff_t dstStride,
309              f32 scale,
310              CONVERT_POLICY cpolicy);
311 
312     void mul(const Size2D &size,
313              const u8 * src0Base, ptrdiff_t src0Stride,
314              const u8 * src1Base, ptrdiff_t src1Stride,
315              s16 * dstBase, ptrdiff_t dstStride,
316              f32 scale,
317              CONVERT_POLICY cpolicy);
318 
319     void mul(const Size2D &size,
320              const u8 * src0Base, ptrdiff_t src0Stride,
321              const s16 * src1Base, ptrdiff_t src1Stride,
322              s16 * dstBase, ptrdiff_t dstStride,
323              f32 scale,
324              CONVERT_POLICY cpolicy);
325 
326     void mul(const Size2D &size,
327              const s8 * src0Base, ptrdiff_t src0Stride,
328              const s8 * src1Base, ptrdiff_t src1Stride,
329              s8 * dstBase, ptrdiff_t dstStride,
330              f32 scale,
331              CONVERT_POLICY cpolicy);
332 
333     void mul(const Size2D &size,
334              const u16 * src0Base, ptrdiff_t src0Stride,
335              const u16 * src1Base, ptrdiff_t src1Stride,
336              u16 * dstBase, ptrdiff_t dstStride,
337              f32 scale,
338              CONVERT_POLICY cpolicy);
339 
340     void mul(const Size2D &size,
341              const s16 * src0Base, ptrdiff_t src0Stride,
342              const s16 * src1Base, ptrdiff_t src1Stride,
343              s16 * dstBase, ptrdiff_t dstStride,
344              f32 scale,
345              CONVERT_POLICY cpolicy);
346 
347     void mul(const Size2D &size,
348              const s32 * src0Base, ptrdiff_t src0Stride,
349              const s32 * src1Base, ptrdiff_t src1Stride,
350              s32 * dstBase, ptrdiff_t dstStride,
351              f64 scale,
352              CONVERT_POLICY cpolicy);
353 
354     void mul(const Size2D &size,
355              const f32 * src0Base, ptrdiff_t src0Stride,
356              const f32 * src1Base, ptrdiff_t src1Stride,
357              f32 * dstBase, ptrdiff_t dstStride,
358              f32 scale);
359 
360     /*
361         For each point `p` within `size`, do:
362         dst[p] = src0[p] * scale / src1[p]
363 
364         NOTE: ROUND_TO_ZERO convert policy is used
365     */
366     void div(const Size2D &size,
367              const u8 * src0Base, ptrdiff_t src0Stride,
368              const u8 * src1Base, ptrdiff_t src1Stride,
369              u8 * dstBase, ptrdiff_t dstStride,
370              f32 scale,
371              CONVERT_POLICY cpolicy);
372 
373     void div(const Size2D &size,
374              const u8 * src0Base, ptrdiff_t src0Stride,
375              const u8 * src1Base, ptrdiff_t src1Stride,
376              s16 * dstBase, ptrdiff_t dstStride,
377              f32 scale,
378              CONVERT_POLICY cpolicy);
379 
380     void div(const Size2D &size,
381              const u8 * src0Base, ptrdiff_t src0Stride,
382              const s16 * src1Base, ptrdiff_t src1Stride,
383              s16 * dstBase, ptrdiff_t dstStride,
384              f32 scale,
385              CONVERT_POLICY cpolicy);
386 
387     void div(const Size2D &size,
388              const s8 * src0Base, ptrdiff_t src0Stride,
389              const s8 * src1Base, ptrdiff_t src1Stride,
390              s8 * dstBase, ptrdiff_t dstStride,
391              f32 scale,
392              CONVERT_POLICY cpolicy);
393 
394     void div(const Size2D &size,
395              const u16 * src0Base, ptrdiff_t src0Stride,
396              const u16 * src1Base, ptrdiff_t src1Stride,
397              u16 * dstBase, ptrdiff_t dstStride,
398              f32 scale,
399              CONVERT_POLICY cpolicy);
400 
401     void div(const Size2D &size,
402              const s16 * src0Base, ptrdiff_t src0Stride,
403              const s16 * src1Base, ptrdiff_t src1Stride,
404              s16 * dstBase, ptrdiff_t dstStride,
405              f32 scale,
406              CONVERT_POLICY cpolicy);
407 
408     void div(const Size2D &size,
409              const s32 * src0Base, ptrdiff_t src0Stride,
410              const s32 * src1Base, ptrdiff_t src1Stride,
411              s32 * dstBase, ptrdiff_t dstStride,
412              f32 scale,
413              CONVERT_POLICY cpolicy);
414 
415     void div(const Size2D &size,
416              const f32 * src0Base, ptrdiff_t src0Stride,
417              const f32 * src1Base, ptrdiff_t src1Stride,
418              f32 * dstBase, ptrdiff_t dstStride,
419              f32 scale);
420 
421     /*
422         For each point `p` within `size`, do:
423         dst[p] = scale / src[p]
424 
425         NOTE: ROUND_TO_ZERO convert policy is used
426     */
427     void reciprocal(const Size2D &size,
428                     const u8 * srcBase, ptrdiff_t srcStride,
429                     u8 * dstBase, ptrdiff_t dstStride,
430                     f32 scale,
431                     CONVERT_POLICY cpolicy);
432 
433     void reciprocal(const Size2D &size,
434                     const s8 * srcBase, ptrdiff_t srcStride,
435                     s8 * dstBase, ptrdiff_t dstStride,
436                     f32 scale,
437                     CONVERT_POLICY cpolicy);
438 
439     void reciprocal(const Size2D &size,
440                     const u16 * srcBase, ptrdiff_t srcStride,
441                     u16 * dstBase, ptrdiff_t dstStride,
442                     f32 scale,
443                     CONVERT_POLICY cpolicy);
444 
445     void reciprocal(const Size2D &size,
446                     const s16 * srcBase, ptrdiff_t srcStride,
447                     s16 * dstBase, ptrdiff_t dstStride,
448                     f32 scale,
449                     CONVERT_POLICY cpolicy);
450 
451     void reciprocal(const Size2D &size,
452                     const s32 * srcBase, ptrdiff_t srcStride,
453                     s32 * dstBase, ptrdiff_t dstStride,
454                     f32 scale,
455                     CONVERT_POLICY cpolicy);
456 
457     void reciprocal(const Size2D &size,
458                     const f32 * srcBase, ptrdiff_t srcStride,
459                     f32 * dstBase, ptrdiff_t dstStride,
460                     f32 scale);
461 
462     /*
463         For each point `p` within `size`, set `dst[p]` to the median
464         of `src[p]` and the 8 points around it. If `srcMargin` is
465         zero on any side, get the neighbors on that side by replicating
466         the edge.
467     */
468     bool isMedianFilter3x3Supported(const Size2D &size, u32 numChannels);
469     void medianFilter3x3(const Size2D &size, u32 numChannels,
470                          const u8 *srcBase, ptrdiff_t srcStride,
471                          const Margin &srcMargin,
472                          u8 *dstBase, ptrdiff_t dstStride);
473 
474     /*
475         Apply a half Gaussian filter + half Scale, as one level of a Gaussian
476         pyramid. For all `p` within `dstSize`, set `dst[p]` to `f[2 * p]`, where
477         `f` is an image of size srcSize obtained by filtering src with the 5x5
478         Gaussian kernel ([1 4 6 4 1]'*[1 4 6 4 1]/256) using the border mode
479         passed in, and round-to-zero rounding.
480         dstSize must be (srcSize.width / 2, srcSize.height / 2), rounded by any method.
481      */
482     bool isGaussianPyramidDownRTZSupported(const Size2D &srcSize, const Size2D &dstSize, BORDER_MODE border);
483     void gaussianPyramidDownRTZ(const Size2D &srcSize,
484                          const u8 *srcBase, ptrdiff_t srcStride,
485                          const Size2D &dstSize,
486                          u8 *dstBase, ptrdiff_t dstStride,
487                          BORDER_MODE border, u8 borderValue);
488 
489     /* Same as above, but uses round-half-up rounding. */
490 
491     bool isGaussianPyramidDownU8Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn);
492     void gaussianPyramidDown(const Size2D &srcSize,
493                              const u8 *srcBase, ptrdiff_t srcStride,
494                              const Size2D &dstSize,
495                              u8 *dstBase, ptrdiff_t dstStride, u8 cn);
496 
497 
498     bool isGaussianPyramidDownS16Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn);
499     void gaussianPyramidDown(const Size2D &srcSize,
500                              const s16 *srcBase, ptrdiff_t srcStride,
501                              const Size2D &dstSize,
502                              s16 *dstBase, ptrdiff_t dstStride, u8 cn);
503 
504     bool isGaussianPyramidDownF32Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn);
505     void gaussianPyramidDown(const Size2D &srcSize,
506                              const f32 *srcBase, ptrdiff_t srcStride,
507                              const Size2D &dstSize,
508                              f32 *dstBase, ptrdiff_t dstStride, u8 cn);
509 
510     bool isGaussianPyramidUpU8Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn);
511     void gaussianPyramidUp(const Size2D &srcSize,
512                            const u8 *srcBase, ptrdiff_t srcStride,
513                            const Size2D &dstSize,
514                            u8 *dstBase, ptrdiff_t dstStride, u8 cn);
515 
516     bool isGaussianPyramidUpS16Supported(const Size2D &srcSize, const Size2D &dstSize, u8 cn);
517     void gaussianPyramidUp(const Size2D &srcSize,
518                            const s16 *srcBase, ptrdiff_t srcStride,
519                            const Size2D &dstSize,
520                            s16 *dstBase, ptrdiff_t dstStride, u8 cn);
521 
522     /*
523         For each point `p` within `size`, do:
524         dst[p] = src[p] > threshold ? trueValue : falseValue
525     */
526     void thresholdBinary(const Size2D &size,
527                          const u8 *srcBase, ptrdiff_t srcStride,
528                          u8 *dstBase, ptrdiff_t dstStride,
529                          u8 threshold, u8 trueValue = 255, u8 falseValue = 0);
530 
531     /*
532         For each point `p` within `size`, do:
533         dst[p] = lower <= src[p] && src[p] <= upper ? trueValue : falseValue
534     */
535     void thresholdRange(const Size2D &size,
536                         const u8 *srcBase, ptrdiff_t srcStride,
537                         u8 *dstBase, ptrdiff_t dstStride,
538                         u8 lowerThreshold, u8 upperThreshold,
539                         u8 trueValue = 255, u8 falseValue = 0);
540 
541     /*
542         For each point `p` within `size`, do:
543         dst[p] = src[p] > threshold ? value : 0
544     */
545     void thresholdBinary(const Size2D &size,
546                          const u8 *srcBase, ptrdiff_t srcStride,
547                          u8 *dstBase, ptrdiff_t dstStride,
548                          u8 threshold, u8 value);
549 
550     void thresholdBinary(const Size2D &size,
551                          const s8 *srcBase, ptrdiff_t srcStride,
552                          s8 *dstBase, ptrdiff_t dstStride,
553                          s8 threshold, s8 value);
554 
555     void thresholdBinary(const Size2D &size,
556                          const u16 *srcBase, ptrdiff_t srcStride,
557                          u16 *dstBase, ptrdiff_t dstStride,
558                          u16 threshold, u16 value);
559 
560     void thresholdBinary(const Size2D &size,
561                          const s16 *srcBase, ptrdiff_t srcStride,
562                          s16 *dstBase, ptrdiff_t dstStride,
563                          s16 threshold, s16 value);
564 
565     void thresholdBinary(const Size2D &size,
566                          const s32 *srcBase, ptrdiff_t srcStride,
567                          s32 *dstBase, ptrdiff_t dstStride,
568                          s32 threshold, s32 value);
569 
570     void thresholdBinary(const Size2D &size,
571                          const f32 *srcBase, ptrdiff_t srcStride,
572                          f32 *dstBase, ptrdiff_t dstStride,
573                          f32 threshold, f32 value);
574 
575     /*
576         For each point `p` within `size`, do:
577         dst[p] = src[p] > threshold ? 0 : value
578     */
579     void thresholdBinaryInv(const Size2D &size,
580                             const u8 *srcBase, ptrdiff_t srcStride,
581                             u8 *dstBase, ptrdiff_t dstStride,
582                             u8 threshold, u8 value);
583 
584     void thresholdBinaryInv(const Size2D &size,
585                             const s8 *srcBase, ptrdiff_t srcStride,
586                             s8 *dstBase, ptrdiff_t dstStride,
587                             s8 threshold, s8 value);
588 
589     void thresholdBinaryInv(const Size2D &size,
590                             const u16 *srcBase, ptrdiff_t srcStride,
591                             u16 *dstBase, ptrdiff_t dstStride,
592                             u16 threshold, u16 value);
593 
594     void thresholdBinaryInv(const Size2D &size,
595                             const s16 *srcBase, ptrdiff_t srcStride,
596                             s16 *dstBase, ptrdiff_t dstStride,
597                             s16 threshold, s16 value);
598 
599     void thresholdBinaryInv(const Size2D &size,
600                             const s32 *srcBase, ptrdiff_t srcStride,
601                             s32 *dstBase, ptrdiff_t dstStride,
602                             s32 threshold, s32 value);
603 
604     void thresholdBinaryInv(const Size2D &size,
605                             const f32 *srcBase, ptrdiff_t srcStride,
606                             f32 *dstBase, ptrdiff_t dstStride,
607                             f32 threshold, f32 value);
608 
609     /*
610         For each point `p` within `size`, do:
611         dst[p] = src[p] > threshold ? threshold : src[p]
612     */
613     void thresholdTruncate(const Size2D &size,
614                            const u8 *srcBase, ptrdiff_t srcStride,
615                            u8 *dstBase, ptrdiff_t dstStride,
616                            u8 threshold);
617 
618     void thresholdTruncate(const Size2D &size,
619                            const s8 *srcBase, ptrdiff_t srcStride,
620                            s8 *dstBase, ptrdiff_t dstStride,
621                            s8 threshold);
622 
623     void thresholdTruncate(const Size2D &size,
624                            const u16 *srcBase, ptrdiff_t srcStride,
625                            u16 *dstBase, ptrdiff_t dstStride,
626                            u16 threshold);
627 
628     void thresholdTruncate(const Size2D &size,
629                            const s16 *srcBase, ptrdiff_t srcStride,
630                            s16 *dstBase, ptrdiff_t dstStride,
631                            s16 threshold);
632 
633     void thresholdTruncate(const Size2D &size,
634                            const s32 *srcBase, ptrdiff_t srcStride,
635                            s32 *dstBase, ptrdiff_t dstStride,
636                            s32 threshold);
637 
638     void thresholdTruncate(const Size2D &size,
639                            const f32 *srcBase, ptrdiff_t srcStride,
640                            f32 *dstBase, ptrdiff_t dstStride,
641                            f32 threshold);
642 
643     /*
644         For each point `p` within `size`, do:
645         dst[p] = src[p] > threshold ? src[p] : 0
646     */
647     void thresholdToZero(const Size2D &size,
648                          const u8 *srcBase, ptrdiff_t srcStride,
649                          u8 *dstBase, ptrdiff_t dstStride,
650                          u8 threshold);
651 
652     void thresholdToZero(const Size2D &size,
653                          const s8 *srcBase, ptrdiff_t srcStride,
654                          s8 *dstBase, ptrdiff_t dstStride,
655                          s8 threshold);
656 
657     void thresholdToZero(const Size2D &size,
658                          const u16 *srcBase, ptrdiff_t srcStride,
659                          u16 *dstBase, ptrdiff_t dstStride,
660                          u16 threshold);
661 
662     void thresholdToZero(const Size2D &size,
663                          const s16 *srcBase, ptrdiff_t srcStride,
664                          s16 *dstBase, ptrdiff_t dstStride,
665                          s16 threshold);
666 
667     void thresholdToZero(const Size2D &size,
668                          const s32 *srcBase, ptrdiff_t srcStride,
669                          s32 *dstBase, ptrdiff_t dstStride,
670                          s32 threshold);
671 
672     void thresholdToZero(const Size2D &size,
673                          const f32 *srcBase, ptrdiff_t srcStride,
674                          f32 *dstBase, ptrdiff_t dstStride,
675                          f32 threshold);
676 
677     /*
678         For each point `p` within `size`, do:
679         dst[p] = src[p] > threshold ? 0 : src[p]
680     */
681     void thresholdToZeroInv(const Size2D &size,
682                             const u8 *srcBase, ptrdiff_t srcStride,
683                             u8 *dstBase, ptrdiff_t dstStride,
684                             u8 threshold);
685 
686     void thresholdToZeroInv(const Size2D &size,
687                             const s8 *srcBase, ptrdiff_t srcStride,
688                             s8 *dstBase, ptrdiff_t dstStride,
689                             s8 threshold);
690 
691     void thresholdToZeroInv(const Size2D &size,
692                             const u16 *srcBase, ptrdiff_t srcStride,
693                             u16 *dstBase, ptrdiff_t dstStride,
694                             u16 threshold);
695 
696     void thresholdToZeroInv(const Size2D &size,
697                             const s16 *srcBase, ptrdiff_t srcStride,
698                             s16 *dstBase, ptrdiff_t dstStride,
699                             s16 threshold);
700 
701     void thresholdToZeroInv(const Size2D &size,
702                             const s32 *srcBase, ptrdiff_t srcStride,
703                             s32 *dstBase, ptrdiff_t dstStride,
704                             s32 threshold);
705 
706     void thresholdToZeroInv(const Size2D &size,
707                             const f32 *srcBase, ptrdiff_t srcStride,
708                             f32 *dstBase, ptrdiff_t dstStride,
709                             f32 threshold);
710 
711     /*
712         For each point `p` within `size`, do:
713         dst[p] = abs(src0[p] - src1[p])
714     */
715     void absDiff(const Size2D &size,
716                  const u8 *src0Base, ptrdiff_t src0Stride,
717                  const u8 *src1Base, ptrdiff_t src1Stride,
718                  u8 *dstBase, ptrdiff_t dstStride);
719 
720     void absDiff(const Size2D &size,
721                  const u16 *src0Base, ptrdiff_t src0Stride,
722                  const u16 *src1Base, ptrdiff_t src1Stride,
723                  u16 *dstBase, ptrdiff_t dstStride);
724 
725     void absDiff(const Size2D &size,
726                  const s8 *src0Base, ptrdiff_t src0Stride,
727                  const s8 *src1Base, ptrdiff_t src1Stride,
728                  s8 *dstBase, ptrdiff_t dstStride);
729 
730     void absDiff(const Size2D &size,
731                  const s16 *src0Base, ptrdiff_t src0Stride,
732                  const s16 *src1Base, ptrdiff_t src1Stride,
733                  s16 *dstBase, ptrdiff_t dstStride);
734 
735     void absDiff(const Size2D &size,
736                  const s32 * src0Base, ptrdiff_t src0Stride,
737                  const s32 * src1Base, ptrdiff_t src1Stride,
738                  s32 * dstBase, ptrdiff_t dstStride);
739 
740     void absDiff(const Size2D &size,
741                  const f32 * src0Base, ptrdiff_t src0Stride,
742                  const f32 * src1Base, ptrdiff_t src1Stride,
743                  f32 * dstBase, ptrdiff_t dstStride);
744 
745     /*
746         For each point `p` within `size`, do:
747         dst[p] = ~src[p]
748     */
749     void bitwiseNot(const Size2D &size,
750                     const u8 *srcBase, ptrdiff_t srcStride,
751                     u8 *dstBase, ptrdiff_t dstStride);
752 
753     /*
754         For each point `p` within `size`, do:
755         dst[p] = src0[p] & src1[p]
756     */
757     void bitwiseAnd(const Size2D &size,
758                     const u8 *src0Base, ptrdiff_t src0Stride,
759                     const u8 *src1Base, ptrdiff_t src1Stride,
760                     u8 *dstBase, ptrdiff_t dstStride);
761 
762     /*
763         For each point `p` within `size`, do:
764         dst[p] = src0[p] | src1[p]
765     */
766     void bitwiseOr(const Size2D &size,
767                    const u8 *src0Base, ptrdiff_t src0Stride,
768                    const u8 *src1Base, ptrdiff_t src1Stride,
769                    u8 *dstBase, ptrdiff_t dstStride);
770 
771     /*
772         For each point `p` within `size`, do:
773         dst[p] = src0[p] ^ src1[p]
774     */
775     void bitwiseXor(const Size2D &size,
776                     const u8 *src0Base, ptrdiff_t src0Stride,
777                     const u8 *src1Base, ptrdiff_t src1Stride,
778                     u8 *dstBase, ptrdiff_t dstStride);
779 
780     /*
781         For each point `p` within `size`, do:
782         dst[p] = src0[p] == src1[p] ? 255 : 0
783     */
784     void cmpEQ(const Size2D &size,
785                const u8 *src0Base, ptrdiff_t src0Stride,
786                const u8 *src1Base, ptrdiff_t src1Stride,
787                u8 *dstBase, ptrdiff_t dstStride);
788 
789     void cmpEQ(const Size2D &size,
790                const s8 *src0Base, ptrdiff_t src0Stride,
791                const s8 *src1Base, ptrdiff_t src1Stride,
792                u8 *dstBase, ptrdiff_t dstStride);
793 
794     void cmpEQ(const Size2D &size,
795                const u16 *src0Base, ptrdiff_t src0Stride,
796                const u16 *src1Base, ptrdiff_t src1Stride,
797                u8 *dstBase, ptrdiff_t dstStride);
798 
799     void cmpEQ(const Size2D &size,
800                const s16 *src0Base, ptrdiff_t src0Stride,
801                const s16 *src1Base, ptrdiff_t src1Stride,
802                u8 *dstBase, ptrdiff_t dstStride);
803 
804     void cmpEQ(const Size2D &size,
805                const u32 *src0Base, ptrdiff_t src0Stride,
806                const u32 *src1Base, ptrdiff_t src1Stride,
807                u8 *dstBase, ptrdiff_t dstStride);
808 
809     void cmpEQ(const Size2D &size,
810                const s32 *src0Base, ptrdiff_t src0Stride,
811                const s32 *src1Base, ptrdiff_t src1Stride,
812                u8 *dstBase, ptrdiff_t dstStride);
813 
814     void cmpEQ(const Size2D &size,
815                const f32 *src0Base, ptrdiff_t src0Stride,
816                const f32 *src1Base, ptrdiff_t src1Stride,
817                u8 *dstBase, ptrdiff_t dstStride);
818 
819     /*
820         For each point `p` within `size`, do:
821         dst[p] = src0[p] != src1[p] ? 255 : 0
822     */
823     void cmpNE(const Size2D &size,
824                const u8 *src0Base, ptrdiff_t src0Stride,
825                const u8 *src1Base, ptrdiff_t src1Stride,
826                u8 *dstBase, ptrdiff_t dstStride);
827 
828     void cmpNE(const Size2D &size,
829                const s8 *src0Base, ptrdiff_t src0Stride,
830                const s8 *src1Base, ptrdiff_t src1Stride,
831                u8 *dstBase, ptrdiff_t dstStride);
832 
833     void cmpNE(const Size2D &size,
834                const u16 *src0Base, ptrdiff_t src0Stride,
835                const u16 *src1Base, ptrdiff_t src1Stride,
836                u8 *dstBase, ptrdiff_t dstStride);
837 
838     void cmpNE(const Size2D &size,
839                const s16 *src0Base, ptrdiff_t src0Stride,
840                const s16 *src1Base, ptrdiff_t src1Stride,
841                u8 *dstBase, ptrdiff_t dstStride);
842 
843     void cmpNE(const Size2D &size,
844                const u32 *src0Base, ptrdiff_t src0Stride,
845                const u32 *src1Base, ptrdiff_t src1Stride,
846                u8 *dstBase, ptrdiff_t dstStride);
847 
848     void cmpNE(const Size2D &size,
849                const s32 *src0Base, ptrdiff_t src0Stride,
850                const s32 *src1Base, ptrdiff_t src1Stride,
851                u8 *dstBase, ptrdiff_t dstStride);
852 
853     void cmpNE(const Size2D &size,
854                const f32 *src0Base, ptrdiff_t src0Stride,
855                const f32 *src1Base, ptrdiff_t src1Stride,
856                u8 *dstBase, ptrdiff_t dstStride);
857 
858     /*
859         For each point `p` within `size`, do:
860         dst[p] = src0[p] > src1[p] ? 255 : 0
861     */
862     void cmpGT(const Size2D &size,
863                const u8 *src0Base, ptrdiff_t src0Stride,
864                const u8 *src1Base, ptrdiff_t src1Stride,
865                u8 *dstBase, ptrdiff_t dstStride);
866 
867     void cmpGT(const Size2D &size,
868                const s8 *src0Base, ptrdiff_t src0Stride,
869                const s8 *src1Base, ptrdiff_t src1Stride,
870                u8 *dstBase, ptrdiff_t dstStride);
871 
872     void cmpGT(const Size2D &size,
873                const u16 *src0Base, ptrdiff_t src0Stride,
874                const u16 *src1Base, ptrdiff_t src1Stride,
875                u8 *dstBase, ptrdiff_t dstStride);
876 
877     void cmpGT(const Size2D &size,
878                const s16 *src0Base, ptrdiff_t src0Stride,
879                const s16 *src1Base, ptrdiff_t src1Stride,
880                u8 *dstBase, ptrdiff_t dstStride);
881 
882     void cmpGT(const Size2D &size,
883                const u32 *src0Base, ptrdiff_t src0Stride,
884                const u32 *src1Base, ptrdiff_t src1Stride,
885                u8 *dstBase, ptrdiff_t dstStride);
886 
887     void cmpGT(const Size2D &size,
888                const s32 *src0Base, ptrdiff_t src0Stride,
889                const s32 *src1Base, ptrdiff_t src1Stride,
890                u8 *dstBase, ptrdiff_t dstStride);
891 
892     void cmpGT(const Size2D &size,
893                const f32 *src0Base, ptrdiff_t src0Stride,
894                const f32 *src1Base, ptrdiff_t src1Stride,
895                u8 *dstBase, ptrdiff_t dstStride);
896 
897     /*
898         For each point `p` within `size`, do:
899         dst[p] = src0[p] >= src1[p] ? 255 : 0
900     */
901     void cmpGE(const Size2D &size,
902                const u8 *src0Base, ptrdiff_t src0Stride,
903                const u8 *src1Base, ptrdiff_t src1Stride,
904                u8 *dstBase, ptrdiff_t dstStride);
905 
906     void cmpGE(const Size2D &size,
907                const s8 *src0Base, ptrdiff_t src0Stride,
908                const s8 *src1Base, ptrdiff_t src1Stride,
909                u8 *dstBase, ptrdiff_t dstStride);
910 
911     void cmpGE(const Size2D &size,
912                const u16 *src0Base, ptrdiff_t src0Stride,
913                const u16 *src1Base, ptrdiff_t src1Stride,
914                u8 *dstBase, ptrdiff_t dstStride);
915 
916     void cmpGE(const Size2D &size,
917                const s16 *src0Base, ptrdiff_t src0Stride,
918                const s16 *src1Base, ptrdiff_t src1Stride,
919                u8 *dstBase, ptrdiff_t dstStride);
920 
921     void cmpGE(const Size2D &size,
922                const u32 *src0Base, ptrdiff_t src0Stride,
923                const u32 *src1Base, ptrdiff_t src1Stride,
924                u8 *dstBase, ptrdiff_t dstStride);
925 
926     void cmpGE(const Size2D &size,
927                const s32 *src0Base, ptrdiff_t src0Stride,
928                const s32 *src1Base, ptrdiff_t src1Stride,
929                u8 *dstBase, ptrdiff_t dstStride);
930 
931     void cmpGE(const Size2D &size,
932                const f32 *src0Base, ptrdiff_t src0Stride,
933                const f32 *src1Base, ptrdiff_t src1Stride,
934                u8 *dstBase, ptrdiff_t dstStride);
935 
936     /*
937         Calculates dot product
938     */
939     f64 dotProduct(const Size2D &size,
940                    const u8 * src0Base, ptrdiff_t src0Stride,
941                    const u8 * src1Base, ptrdiff_t src1Stride);
942 
943     f64 dotProduct(const Size2D &size,
944                    const s8 * src0Base, ptrdiff_t src0Stride,
945                    const s8 * src1Base, ptrdiff_t src1Stride);
946 
947     f64 dotProduct(const Size2D &size,
948                    const f32 * src0Base, ptrdiff_t src0Stride,
949                    const f32 * src1Base, ptrdiff_t src1Stride);
950 
951     /*
952         Calculates mean and stddev
953     */
954     void meanStdDev(const Size2D &size,
955                     const u8 * srcBase, ptrdiff_t srcStride,
956                     f32 * pMean, f32 * pStdDev);
957 
958     void meanStdDev(const Size2D &size,
959                 const u16 * srcBase, ptrdiff_t srcStride,
960                 f32 * pMean, f32 * pStdDev);
961 
962     /*
963         For each point `p` within `size`, do:
964         dst[p] = sqrt(src0[p] ^ 2 + src1[p] ^ 2)
965     */
966     void magnitude(const Size2D &size,
967                    const s16 *src0Base, ptrdiff_t src0Stride,
968                    const s16 *src1Base, ptrdiff_t src1Stride,
969                    s16 *dstBase, ptrdiff_t dstStride);
970 
971     void magnitude(const Size2D &size,
972                    const f32 *src0Base, ptrdiff_t src0Stride,
973                    const f32 *src1Base, ptrdiff_t src1Stride,
974                    f32 *dstBase, ptrdiff_t dstStride);
975 
976     /*
977         Compute an integral image
978     */
979     void integral(const Size2D &size,
980                   const u8 * srcBase, ptrdiff_t srcStride,
981                   u32 * sumBase, ptrdiff_t sumStride);
982 
983     /*
984         Compute an integral of squared image values
985     */
986     void sqrIntegral(const Size2D &size,
987                      const u8 * srcBase, ptrdiff_t srcStride,
988                      f64 * sqsumBase, ptrdiff_t sqsumStride);
989 
990     /*
991         Among each pixel `p` within `src` find min and max values
992     */
993     void minMaxVals(const Size2D &size,
994                     const u8 *srcBase, ptrdiff_t srcStride,
995                     u8 * minVal, u8 * maxVal);
996 
997     void minMaxVals(const Size2D &size,
998                     const s16 *srcBase, ptrdiff_t srcStride,
999                     s16 * minVal, s16 * maxVal);
1000 
1001     void minMaxVals(const Size2D &size,
1002                     const u16 *srcBase, ptrdiff_t srcStride,
1003                     u16 * minVal, u16 * maxVal);
1004 
1005     void minMaxVals(const Size2D &size,
1006                     const s32 *srcBase, ptrdiff_t srcStride,
1007                     s32 * minVal, s32 * maxVal);
1008 
1009     void minMaxVals(const Size2D &size,
1010                     const u32 *srcBase, ptrdiff_t srcStride,
1011                     u32 * minVal, u32 * maxVal);
1012 
1013     /*
1014         Fill the arrays `minLocPtr`, `maxLocPtr` with locations of
1015         given values `minVal`, `maxVal`
1016     */
1017     void fillMinMaxLocs(const Size2D & size,
1018                         const u8 *srcBase, ptrdiff_t srcStride,
1019                         u8 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity,
1020                         u8 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity);
1021 
1022     void fillMinMaxLocs(const Size2D & size,
1023                         const u16 *srcBase, ptrdiff_t srcStride,
1024                         u16 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity,
1025                         u16 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity);
1026 
1027     void fillMinMaxLocs(const Size2D & size,
1028                         const s16 *srcBase, ptrdiff_t srcStride,
1029                         s16 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity,
1030                         s16 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity);
1031 
1032     void fillMinMaxLocs(const Size2D & size,
1033                         const u32 *srcBase, ptrdiff_t srcStride,
1034                         u32 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity,
1035                         u32 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity);
1036 
1037     void fillMinMaxLocs(const Size2D & size,
1038                         const s32 *srcBase, ptrdiff_t srcStride,
1039                         s32 minVal, size_t * minLocPtr, s32 & minLocCount, s32 minLocCapacity,
1040                         s32 maxVal, size_t * maxLocPtr, s32 & maxLocCount, s32 maxLocCapacity);
1041 
1042     /*
1043         Among each pixel `p` within `src` find min and max values and its first occurences
1044     */
1045     void minMaxLoc(const Size2D &size,
1046                    const s8 * srcBase, ptrdiff_t srcStride,
1047                    s8 &minVal, size_t &minCol, size_t &minRow,
1048                    s8 &maxVal, size_t &maxCol, size_t &maxRow);
1049 
1050     void minMaxLoc(const Size2D &size,
1051                    const u8 * srcBase, ptrdiff_t srcStride,
1052                    u8 &minVal, size_t &minCol, size_t &minRow,
1053                    u8 &maxVal, size_t &maxCol, size_t &maxRow);
1054 
1055     void minMaxLoc(const Size2D &size,
1056                    const s16 * srcBase, ptrdiff_t srcStride,
1057                    s16 &minVal, size_t &minCol, size_t &minRow,
1058                    s16 &maxVal, size_t &maxCol, size_t &maxRow);
1059 
1060     void minMaxLoc(const Size2D &size,
1061                    const u16 * srcBase, ptrdiff_t srcStride,
1062                    u16 &minVal, size_t &minCol, size_t &minRow,
1063                    u16 &maxVal, size_t &maxCol, size_t &maxRow);
1064 
1065     void minMaxLoc(const Size2D &size,
1066                    const s32 * srcBase, ptrdiff_t srcStride,
1067                    s32 &minVal, size_t &minCol, size_t &minRow,
1068                    s32 &maxVal, size_t &maxCol, size_t &maxRow);
1069 
1070     void minMaxLoc(const Size2D &size,
1071                    const f32 * srcBase, ptrdiff_t srcStride,
1072                    f32 &minVal, size_t &minCol, size_t &minRow,
1073                    f32 &maxVal, size_t &maxCol, size_t &maxRow);
1074 
1075     void minMaxLoc(const Size2D &size,
1076                    const f32 * srcBase, ptrdiff_t srcStride,
1077                    const u8 * maskBase, ptrdiff_t maskStride,
1078                    f32 &minVal, size_t &minCol, size_t &minRow,
1079                    f32 &maxVal, size_t &maxCol, size_t &maxRow);
1080 
1081     /*
1082         For each point `p` within `size`, do:
1083         dst[p] += src[p]
1084     */
1085     void accumulate(const Size2D &size,
1086                     const u8 *srcBase, ptrdiff_t srcStride,
1087                     s16 *dstBase, ptrdiff_t dstStride);
1088 
1089     /*
1090         For each point `p` within `size`, do:
1091         dst[p] = (dst[p] + ((src[p] ^ 2) >> shift))
1092     */
1093     void accumulateSquare(const Size2D &size,
1094                           const u8 *srcBase, ptrdiff_t srcStride,
1095                           s16 *dstBase, ptrdiff_t dstStride,
1096                           u32 shift);
1097 
1098     /*
1099         For each point `p` within `size`, do:
1100         dst[p] = (1 - alpha) * dst[p] + alpha * src[p]
1101     */
1102     void accumulateWeighted(const Size2D &size,
1103                             const u8 *srcBase, ptrdiff_t srcStride,
1104                             u8 *dstBase, ptrdiff_t dstStride,
1105                             f32 alpha);
1106 
1107     /*
1108         orient[p] = atan2(src0[p], src1[p])
1109     */
1110     void phase(const Size2D &size,
1111                const s16 * src0Base, ptrdiff_t src0Stride,
1112                const s16 * src1Base, ptrdiff_t src1Stride,
1113                u8 * orientBase, ptrdiff_t orientStride);
1114 
1115     void phase(const Size2D &size,
1116                const f32 * src0Base, ptrdiff_t src0Stride,
1117                const f32 * src1Base, ptrdiff_t src1Stride,
1118                f32 * orientBase, ptrdiff_t orientStride,
1119                f32 scale);
1120 
1121     /*
1122         Combine 2 planes to a single one
1123     */
1124     void combine2(const Size2D &size,
1125                   const u8 * src0Base, ptrdiff_t src0Stride,
1126                   const u8 * src1Base, ptrdiff_t src1Stride,
1127                   u8 * dstBase, ptrdiff_t dstStride);
1128 
1129     void combine2(const Size2D &size,
1130                   const u16 * src0Base, ptrdiff_t src0Stride,
1131                   const u16 * src1Base, ptrdiff_t src1Stride,
1132                   u16 * dstBase, ptrdiff_t dstStride);
1133 
1134     void combine2(const Size2D &size,
1135                   const s32 * src0Base, ptrdiff_t src0Stride,
1136                   const s32 * src1Base, ptrdiff_t src1Stride,
1137                   s32 * dstBase, ptrdiff_t dstStride);
1138 
1139     void combine2(const Size2D &size,
1140                   const s64 * src0Base, ptrdiff_t src0Stride,
1141                   const s64 * src1Base, ptrdiff_t src1Stride,
1142                   s64 * dstBase, ptrdiff_t dstStride);
1143 
1144     /*
1145         Combine 3 planes to a single one
1146     */
1147     void combine3(const Size2D &size,
1148                   const u8 * src0Base, ptrdiff_t src0Stride,
1149                   const u8 * src1Base, ptrdiff_t src1Stride,
1150                   const u8 * src2Base, ptrdiff_t src2Stride,
1151                   u8 * dstBase, ptrdiff_t dstStride);
1152 
1153     void combine3(const Size2D &size,
1154                   const u16 * src0Base, ptrdiff_t src0Stride,
1155                   const u16 * src1Base, ptrdiff_t src1Stride,
1156                   const u16 * src2Base, ptrdiff_t src2Stride,
1157                   u16 * dstBase, ptrdiff_t dstStride);
1158 
1159     void combine3(const Size2D &size,
1160                   const s32 * src0Base, ptrdiff_t src0Stride,
1161                   const s32 * src1Base, ptrdiff_t src1Stride,
1162                   const s32 * src2Base, ptrdiff_t src2Stride,
1163                   s32 * dstBase, ptrdiff_t dstStride);
1164 
1165     void combine3(const Size2D &size,
1166                   const s64 * src0Base, ptrdiff_t src0Stride,
1167                   const s64 * src1Base, ptrdiff_t src1Stride,
1168                   const s64 * src2Base, ptrdiff_t src2Stride,
1169                   s64 * dstBase, ptrdiff_t dstStride);
1170 
1171     /*
1172         Combine 4 planes to a single one
1173     */
1174     void combine4(const Size2D &size,
1175                   const u8 * src0Base, ptrdiff_t src0Stride,
1176                   const u8 * src1Base, ptrdiff_t src1Stride,
1177                   const u8 * src2Base, ptrdiff_t src2Stride,
1178                   const u8 * src3Base, ptrdiff_t src3Stride,
1179                   u8 * dstBase, ptrdiff_t dstStride);
1180 
1181     void combine4(const Size2D &size,
1182                   const u16 * src0Base, ptrdiff_t src0Stride,
1183                   const u16 * src1Base, ptrdiff_t src1Stride,
1184                   const u16 * src2Base, ptrdiff_t src2Stride,
1185                   const u16 * src3Base, ptrdiff_t src3Stride,
1186                   u16 * dstBase, ptrdiff_t dstStride);
1187 
1188     void combine4(const Size2D &size,
1189                   const s32 * src0Base, ptrdiff_t src0Stride,
1190                   const s32 * src1Base, ptrdiff_t src1Stride,
1191                   const s32 * src2Base, ptrdiff_t src2Stride,
1192                   const s32 * src3Base, ptrdiff_t src3Stride,
1193                   s32 * dstBase, ptrdiff_t dstStride);
1194 
1195     void combine4(const Size2D &size,
1196                   const s64 * src0Base, ptrdiff_t src0Stride,
1197                   const s64 * src1Base, ptrdiff_t src1Stride,
1198                   const s64 * src2Base, ptrdiff_t src2Stride,
1199                   const s64 * src3Base, ptrdiff_t src3Stride,
1200                   s64 * dstBase, ptrdiff_t dstStride);
1201 
1202     /*
1203         Combine 3 planes to YUYV one
1204     */
1205     void combineYUYV(const Size2D &size,
1206                      const u8 * srcyBase, ptrdiff_t srcyStride,
1207                      const u8 * srcuBase, ptrdiff_t srcuStride,
1208                      const u8 * srcvBase, ptrdiff_t srcvStride,
1209                      u8 * dstBase, ptrdiff_t dstStride);
1210 
1211     /*
1212         Combine 3 planes to UYVY one
1213     */
1214     void combineUYVY(const Size2D &size,
1215                      const u8 * srcyBase, ptrdiff_t srcyStride,
1216                      const u8 * srcuBase, ptrdiff_t srcuStride,
1217                      const u8 * srcvBase, ptrdiff_t srcvStride,
1218                      u8 * dstBase, ptrdiff_t dstStride);
1219 
1220     /*
1221         Convert RGB image to grayscale one
1222     */
1223     void rgb2gray(const Size2D &size, COLOR_SPACE color_space,
1224                   const u8 * srcBase, ptrdiff_t srcStride,
1225                   u8 * dstBase, ptrdiff_t dstStride);
1226 
1227     /*
1228         Convert RGBX image to grayscale one
1229     */
1230     void rgbx2gray(const Size2D &size, COLOR_SPACE color_space,
1231                    const u8 * srcBase, ptrdiff_t srcStride,
1232                    u8 * dstBase, ptrdiff_t dstStride);
1233 
1234     /*
1235         Convert BGR image to grayscale one
1236     */
1237     void bgr2gray(const Size2D &size, COLOR_SPACE color_space,
1238                   const u8 * srcBase, ptrdiff_t srcStride,
1239                   u8 * dstBase, ptrdiff_t dstStride);
1240 
1241     /*
1242         Convert BGRX image to grayscale one
1243     */
1244     void bgrx2gray(const Size2D &size, COLOR_SPACE color_space,
1245                    const u8 * srcBase, ptrdiff_t srcStride,
1246                    u8 * dstBase, ptrdiff_t dstStride);
1247 
1248     /*
1249         Convert grayscale image to RGB one
1250     */
1251     void gray2rgb(const Size2D &size,
1252                   const u8 * srcBase, ptrdiff_t srcStride,
1253                   u8 * dstBase, ptrdiff_t dstStride);
1254 
1255     /*
1256         Convert grayscale image to RGBX one
1257     */
1258     void gray2rgbx(const Size2D &size,
1259                    const u8 * srcBase, ptrdiff_t srcStride,
1260                    u8 * dstBase, ptrdiff_t dstStride);
1261 
1262     /*
1263         Convert RGB image to RGBX
1264     */
1265     void rgb2rgbx(const Size2D &size,
1266                   const u8 * srcBase, ptrdiff_t srcStride,
1267                   u8 * dstBase, ptrdiff_t dstStride);
1268 
1269     /*
1270         Convert RGBX image to RGB
1271     */
1272     void rgbx2rgb(const Size2D &size,
1273                   const u8 * srcBase, ptrdiff_t srcStride,
1274                   u8 * dstBase, ptrdiff_t dstStride);
1275 
1276     /*
1277         Convert RGB image to BGR
1278     */
1279     void rgb2bgr(const Size2D &size,
1280                  const u8 * srcBase, ptrdiff_t srcStride,
1281                  u8 * dstBase, ptrdiff_t dstStride);
1282 
1283     /*
1284         Convert RGBX image to BGRX
1285     */
1286     void rgbx2bgrx(const Size2D &size,
1287                    const u8 * srcBase, ptrdiff_t srcStride,
1288                    u8 * dstBase, ptrdiff_t dstStride);
1289 
1290     /*
1291         Convert RGBX image to BGR
1292     */
1293     void rgbx2bgr(const Size2D &size,
1294                   const u8 * srcBase, ptrdiff_t srcStride,
1295                   u8 * dstBase, ptrdiff_t dstStride);
1296 
1297     /*
1298         Convert RGB image to BGRX
1299     */
1300     void rgb2bgrx(const Size2D &size,
1301                   const u8 * srcBase, ptrdiff_t srcStride,
1302                   u8 * dstBase, ptrdiff_t dstStride);
1303 
1304     /*
1305         Convert RGB image to HSV
1306     */
1307     void rgb2hsv(const Size2D &size,
1308                  const u8 * srcBase, ptrdiff_t srcStride,
1309                  u8 * dstBase, ptrdiff_t dstStride,
1310                  s32 hrange);
1311 
1312     /*
1313         Convert RGBX image to HSV
1314     */
1315     void rgbx2hsv(const Size2D &size,
1316                   const u8 * srcBase, ptrdiff_t srcStride,
1317                   u8 * dstBase, ptrdiff_t dstStride,
1318                   s32 hrange);
1319 
1320     /*
1321         Convert BGR image to HSV
1322     */
1323     void bgr2hsv(const Size2D &size,
1324                  const u8 * srcBase, ptrdiff_t srcStride,
1325                  u8 * dstBase, ptrdiff_t dstStride,
1326                  s32 hrange);
1327 
1328     /*
1329         Convert BGRX image to HSV
1330     */
1331     void bgrx2hsv(const Size2D &size,
1332                   const u8 * srcBase, ptrdiff_t srcStride,
1333                   u8 * dstBase, ptrdiff_t dstStride,
1334                   s32 hrange);
1335 
1336     /*
1337         Convert RGBX image to BGR565
1338         RRRRrrrr GGGGgggg BBBBbbbb XXXXxxxx -> GggBBBBb RRRRrGGG
1339     */
1340     void rgbx2bgr565(const Size2D &size,
1341                      const u8 * srcBase, ptrdiff_t srcStride,
1342                      u8 * dstBase, ptrdiff_t dstStride);
1343 
1344     /*
1345         Convert RGB image to BGR565
1346         RRRRrrrr GGGGgggg BBBBbbbb -> GggBBBBb RRRRrGGG
1347     */
1348     void rgb2bgr565(const Size2D &size,
1349                      const u8 * srcBase, ptrdiff_t srcStride,
1350                      u8 * dstBase, ptrdiff_t dstStride);
1351 
1352     /*
1353         Convert RGBX image to RGB565
1354         RRRRrrrr GGGGgggg BBBBbbbb XXXXxxxx -> GggRRRRr BBBBbGGG
1355     */
1356     void rgbx2rgb565(const Size2D &size,
1357                      const u8 * srcBase, ptrdiff_t srcStride,
1358                      u8 * dstBase, ptrdiff_t dstStride);
1359 
1360     /*
1361         Convert RGB image to RGB565
1362         RRRRrrrr GGGGgggg BBBBbbbb -> GggRRRRr BBBBbGGG
1363     */
1364     void rgb2rgb565(const Size2D &size,
1365                      const u8 * srcBase, ptrdiff_t srcStride,
1366                      u8 * dstBase, ptrdiff_t dstStride);
1367 
1368     /*
1369         Convert RGB image to YCrCb
1370     */
1371     void rgb2ycrcb(const Size2D &size,
1372                    const u8 * srcBase, ptrdiff_t srcStride,
1373                    u8 * dstBase, ptrdiff_t dstStride);
1374 
1375     /*
1376         Convert RGBX image to YCrCb
1377     */
1378     void rgbx2ycrcb(const Size2D &size,
1379                     const u8 * srcBase, ptrdiff_t srcStride,
1380                     u8 * dstBase, ptrdiff_t dstStride);
1381 
1382     /*
1383         Convert BGR image to YCrCb
1384     */
1385     void bgr2ycrcb(const Size2D &size,
1386                    const u8 * srcBase, ptrdiff_t srcStride,
1387                    u8 * dstBase, ptrdiff_t dstStride);
1388 
1389     /*
1390         Convert BGRX image to YCrCb
1391     */
1392     void bgrx2ycrcb(const Size2D &size,
1393                     const u8 * srcBase, ptrdiff_t srcStride,
1394                     u8 * dstBase, ptrdiff_t dstStride);
1395 
1396     /*
1397         Convert YUV420sp image to RGB
1398     */
1399     void yuv420sp2rgb(const Size2D &size,
1400                       const u8 *  yBase, ptrdiff_t  yStride,
1401                       const u8 * uvBase, ptrdiff_t uvStride,
1402                       u8 * dstBase, ptrdiff_t dstStride);
1403 
1404     /*
1405         Convert YUV420sp image to RGBX
1406     */
1407     void yuv420sp2rgbx(const Size2D &size,
1408                        const u8 *  yBase, ptrdiff_t  yStride,
1409                        const u8 * uvBase, ptrdiff_t uvStride,
1410                        u8 * dstBase, ptrdiff_t dstStride);
1411 
1412     /*
1413         Convert YUV420i image to RGB
1414     */
1415     void yuv420i2rgb(const Size2D &size,
1416                      const u8 *  yBase, ptrdiff_t  yStride,
1417                      const u8 * uvBase, ptrdiff_t uvStride,
1418                      u8 * dstBase, ptrdiff_t dstStride);
1419 
1420     /*
1421         Convert YUV420i image to RGBX
1422     */
1423     void yuv420i2rgbx(const Size2D &size,
1424                       const u8 *  yBase, ptrdiff_t  yStride,
1425                       const u8 * uvBase, ptrdiff_t uvStride,
1426                       u8 * dstBase, ptrdiff_t dstStride);
1427 
1428     /*
1429         Convert YUV420sp image to BGR
1430     */
1431     void yuv420sp2bgr(const Size2D &size,
1432                       const u8 *  yBase, ptrdiff_t  yStride,
1433                       const u8 * uvBase, ptrdiff_t uvStride,
1434                       u8 * dstBase, ptrdiff_t dstStride);
1435 
1436     /*
1437         Convert YUV420sp image to BGRX
1438     */
1439     void yuv420sp2bgrx(const Size2D &size,
1440                        const u8 *  yBase, ptrdiff_t  yStride,
1441                        const u8 * uvBase, ptrdiff_t uvStride,
1442                        u8 * dstBase, ptrdiff_t dstStride);
1443 
1444     /*
1445         Convert YUV420i image to BGR
1446     */
1447     void yuv420i2bgr(const Size2D &size,
1448                      const u8 *  yBase, ptrdiff_t  yStride,
1449                      const u8 * uvBase, ptrdiff_t uvStride,
1450                      u8 * dstBase, ptrdiff_t dstStride);
1451 
1452     /*
1453         Convert YUV420i image to BGRX
1454     */
1455     void yuv420i2bgrx(const Size2D &size,
1456                       const u8 *  yBase, ptrdiff_t  yStride,
1457                       const u8 * uvBase, ptrdiff_t uvStride,
1458                       u8 * dstBase, ptrdiff_t dstStride);
1459 
1460     /*
1461         For each point `p` within `size`, do:
1462         dst[p] = src[p] << shift
1463     */
1464     void lshift(const Size2D &size,
1465                 const u8 * srcBase, ptrdiff_t srcStride,
1466                 s16 * dstBase, ptrdiff_t dstStride,
1467                 u32 shift);
1468 
1469     /*
1470         For each point `p` within `size`, do sign-extending shift:
1471         dst[p] = src[p] >> shift
1472     */
1473     void rshift(const Size2D &size,
1474                 const s16 * srcBase, ptrdiff_t srcStride,
1475                 u8 * dstBase, ptrdiff_t dstStride,
1476                 u32 shift, CONVERT_POLICY cpolicy);
1477 
1478     /*
1479         For each point `p` within `size`, set `dst[p]` to the average
1480         of `src[p]` and the 8 (or 24 for blur5x5) points around it
1481         NOTE: the function cannot operate inplace
1482     */
1483     bool isBlur3x3Supported(const Size2D &size, BORDER_MODE border);
1484     void blur3x3(const Size2D &size,
1485                  const u8 * srcBase, ptrdiff_t srcStride,
1486                  u8 * dstBase, ptrdiff_t dstStride,
1487                  BORDER_MODE border, u8 borderValue);
1488 
1489     bool isBlurU8Supported(const Size2D &size, s32 cn, BORDER_MODE border);
1490     void blur3x3(const Size2D &size, s32 cn,
1491                  const u8 * srcBase, ptrdiff_t srcStride,
1492                  u8 * dstBase, ptrdiff_t dstStride,
1493                  BORDER_MODE borderType, u8 borderValue);
1494 
1495     void blur5x5(const Size2D &size, s32 cn,
1496                  const u8 * srcBase, ptrdiff_t srcStride,
1497                  u8 * dstBase, ptrdiff_t dstStride,
1498                  BORDER_MODE borderType, u8 borderValue);
1499 
1500     /*
1501         For each point `p` within `size`, set `dst[p]` to the average
1502         of `src[p]` and the 8 points around it
1503         NOTE: the function can operate inplace
1504     */
1505     bool isBlurF32Supported(const Size2D &size, s32 cn, BORDER_MODE border);
1506     void blur3x3(const Size2D &size, s32 cn,
1507                  const f32 * srcBase, ptrdiff_t srcStride,
1508                  f32 * dstBase, ptrdiff_t dstStride,
1509                  BORDER_MODE borderType, f32 borderValue, Margin borderMargin);
1510 
1511     bool isBlurS32Supported(const Size2D &size, s32 cn, BORDER_MODE border);
1512     void blur3x3(const Size2D &size, s32 cn,
1513                  const s32 * srcBase, ptrdiff_t srcStride,
1514                  s32 * dstBase, ptrdiff_t dstStride,
1515                  BORDER_MODE borderType, s32 borderValue, Margin borderMargin);
1516 
1517     /*
1518         For each point `p` within `size`, set `dst[p]` to gaussian smooth
1519         of `src[p]` and the 8(24 for 5x5 version) points around it
1520         NOTE: the function cannot operate inplace
1521     */
1522     bool isGaussianBlur3x3Supported(const Size2D &size, BORDER_MODE border);
1523     void gaussianBlur3x3(const Size2D &size,
1524                          const u8 * srcBase, ptrdiff_t srcStride,
1525                          u8 * dstBase, ptrdiff_t dstStride,
1526                          BORDER_MODE border, u8 borderValue);
1527     bool isGaussianBlur3x3MarginSupported(const Size2D &size, BORDER_MODE border, Margin borderMargin = Margin());
1528     void gaussianBlur3x3Margin(const Size2D &size,
1529                                const u8 * srcBase, ptrdiff_t srcStride,
1530                                u8 * dstBase, ptrdiff_t dstStride,
1531                                BORDER_MODE border, u8 borderValue, Margin borderMargin = Margin());
1532 
1533     bool isGaussianBlur5x5Supported(const Size2D &size, s32 cn, BORDER_MODE border);
1534     void gaussianBlur5x5(const Size2D &size, s32 cn,
1535                          const u8 * srcBase, ptrdiff_t srcStride,
1536                          u8 * dstBase, ptrdiff_t dstStride,
1537                          BORDER_MODE borderType, u8 borderValue, Margin borderMargin);
1538 
1539     void gaussianBlur5x5(const Size2D &size, s32 cn,
1540                          const u16 * srcBase, ptrdiff_t srcStride,
1541                          u16 * dstBase, ptrdiff_t dstStride,
1542                          BORDER_MODE borderType, u16 borderValue, Margin borderMargin);
1543 
1544     void gaussianBlur5x5(const Size2D &size, s32 cn,
1545                          const s16 * srcBase, ptrdiff_t srcStride,
1546                          s16 * dstBase, ptrdiff_t dstStride,
1547                          BORDER_MODE borderType, s16 borderValue, Margin borderMargin);
1548 
1549     void gaussianBlur5x5(const Size2D &size, s32 cn,
1550                          const s32 * srcBase, ptrdiff_t srcStride,
1551                          s32 * dstBase, ptrdiff_t dstStride,
1552                          BORDER_MODE borderType, s32 borderValue, Margin borderMargin);
1553 
1554     /*
1555         Calculation of Sobel operator
1556         NOTE: the function cannot operate inplace
1557     */
1558     bool isSobel3x3Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy, Margin borderMargin = Margin());
1559     void Sobel3x3(const Size2D &size,
1560                   const u8 * srcBase, ptrdiff_t srcStride,
1561                   s16 * dstBase, ptrdiff_t dstStride,
1562                   s32 dx, s32 dy,
1563                   BORDER_MODE border, u8 borderValue, Margin borderMargin = Margin());
1564 
1565     /*
1566         Calculation of Sobel operator for f32 data
1567         NOTE: the function can operate inplace
1568     */
1569     bool isSobel3x3f32Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy);
1570     void Sobel3x3(const Size2D &size,
1571                   const f32 * srcBase, ptrdiff_t srcStride,
1572                   f32 * dstBase, ptrdiff_t dstStride,
1573                   s32 dx, s32 dy,
1574                   BORDER_MODE borderType, f32 borderValue);
1575 
1576     /*
1577         Calculation of Scharr operator
1578         NOTE: the function cannot operate inplace
1579     */
1580     bool isScharr3x3Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy, Margin borderMargin = Margin());
1581     void Scharr3x3(const Size2D &size,
1582                    const u8 * srcBase, ptrdiff_t srcStride,
1583                    s16 * dstBase, ptrdiff_t dstStride,
1584                    s32 dx, s32 dy,
1585                    BORDER_MODE borderType, u8 borderValue, Margin borderMargin = Margin());
1586 
1587     void ScharrDeriv(const Size2D &size, s32 cn,
1588                      const u8 * srcBase, ptrdiff_t srcStride,
1589                      s16 * dstBase, ptrdiff_t dstStride);
1590 
1591     /*
1592         Calculation of generic separable filtering operator
1593         rowFilter/colFilter define filter weights
1594         0 - predefined  1  2  1
1595         1 - predefined -1  0  1
1596         2 - predefined  1 -2  1
1597         3 - weights provided as xw/yw
1598     */
1599     bool isSeparableFilter3x3Supported(const Size2D &size, BORDER_MODE border, s32 dx, s32 dy, Margin borderMargin = Margin());
1600     void SeparableFilter3x3(const Size2D &size,
1601                             const u8 * srcBase, ptrdiff_t srcStride,
1602                             s16 * dstBase, ptrdiff_t dstStride,
1603                             const u8 rowFilter, const u8 colFilter, const s16 *xw, const s16 *yw,
1604                             BORDER_MODE border, u8 borderValue, Margin borderMargin = Margin());
1605 
1606     /*
1607         Extract a single plane from 2 channel image
1608     */
1609     void extract2(const Size2D &size,
1610                   const u8 * srcBase, ptrdiff_t srcStride,
1611                   u8 * dstBase, ptrdiff_t dstStride,
1612                   u32 coi);
1613 
1614     /*
1615         Extract a single plane from 3 channel image
1616     */
1617     void extract3(const Size2D &size,
1618                   const u8 * srcBase, ptrdiff_t srcStride,
1619                   u8 * dstBase, ptrdiff_t dstStride,
1620                   u32 coi);
1621 
1622     /*
1623         Extract a single plane from 4 channel image
1624     */
1625     void extract4(const Size2D &size,
1626                   const u8 * srcBase, ptrdiff_t srcStride,
1627                   u8 * dstBase, ptrdiff_t dstStride,
1628                   u32 coi);
1629 
1630     /*
1631         Split 2 channel image to separate planes
1632     */
1633     void split2(const Size2D &size,
1634                 const u8 * srcBase, ptrdiff_t srcStride,
1635                 u8 * dst0Base, ptrdiff_t dst0Stride,
1636                 u8 * dst1Base, ptrdiff_t dst1Stride);
1637 
1638     void split2(const Size2D &size,
1639                 const u16* srcBase, ptrdiff_t srcStride,
1640                 u16 * dst0Base, ptrdiff_t dst0Stride,
1641                 u16 * dst1Base, ptrdiff_t dst1Stride);
1642 
1643     void split2(const Size2D &size,
1644                 const s32 * srcBase, ptrdiff_t srcStride,
1645                 s32 * dst0Base, ptrdiff_t dst0Stride,
1646                 s32 * dst1Base, ptrdiff_t dst1Stride);
1647 
1648     void split2(const Size2D &size,
1649                 const s64 * srcBase, ptrdiff_t srcStride,
1650                 s64 * dst0Base, ptrdiff_t dst0Stride,
1651                 s64 * dst1Base, ptrdiff_t dst1Stride);
1652 
1653     /*
1654         Split 3 channel image to separate planes
1655     */
1656     void split3(const Size2D &size,
1657                 const u8 * srcBase, ptrdiff_t srcStride,
1658                 u8 * dst0Base, ptrdiff_t dst0Stride,
1659                 u8 * dst1Base, ptrdiff_t dst1Stride,
1660                 u8 * dst2Base, ptrdiff_t dst2Stride);
1661 
1662     void split3(const Size2D &size,
1663                 const u16* srcBase, ptrdiff_t srcStride,
1664                 u16 * dst0Base, ptrdiff_t dst0Stride,
1665                 u16 * dst1Base, ptrdiff_t dst1Stride,
1666                 u16 * dst2Base, ptrdiff_t dst2Stride);
1667 
1668     void split3(const Size2D &size,
1669                 const s32 * srcBase, ptrdiff_t srcStride,
1670                 s32 * dst0Base, ptrdiff_t dst0Stride,
1671                 s32 * dst1Base, ptrdiff_t dst1Stride,
1672                 s32 * dst2Base, ptrdiff_t dst2Stride);
1673 
1674     void split3(const Size2D &size,
1675                 const s64 * srcBase, ptrdiff_t srcStride,
1676                 s64 * dst0Base, ptrdiff_t dst0Stride,
1677                 s64 * dst1Base, ptrdiff_t dst1Stride,
1678                 s64 * dst2Base, ptrdiff_t dst2Stride);
1679 
1680     /*
1681         Split 4 channel image to separate planes
1682     */
1683     void split4(const Size2D &size,
1684                 const u8 * srcBase, ptrdiff_t srcStride,
1685                 u8 * dst0Base, ptrdiff_t dst0Stride,
1686                 u8 * dst1Base, ptrdiff_t dst1Stride,
1687                 u8 * dst2Base, ptrdiff_t dst2Stride,
1688                 u8 * dst3Base, ptrdiff_t dst3Stride);
1689 
1690     void split4(const Size2D &size,
1691                 const u16* srcBase, ptrdiff_t srcStride,
1692                 u16 * dst0Base, ptrdiff_t dst0Stride,
1693                 u16 * dst1Base, ptrdiff_t dst1Stride,
1694                 u16 * dst2Base, ptrdiff_t dst2Stride,
1695                 u16 * dst3Base, ptrdiff_t dst3Stride);
1696 
1697     void split4(const Size2D &size,
1698                 const s32 * srcBase, ptrdiff_t srcStride,
1699                 s32 * dst0Base, ptrdiff_t dst0Stride,
1700                 s32 * dst1Base, ptrdiff_t dst1Stride,
1701                 s32 * dst2Base, ptrdiff_t dst2Stride,
1702                 s32 * dst3Base, ptrdiff_t dst3Stride);
1703 
1704     void split4(const Size2D &size,
1705                 const s64 * srcBase, ptrdiff_t srcStride,
1706                 s64 * dst0Base, ptrdiff_t dst0Stride,
1707                 s64 * dst1Base, ptrdiff_t dst1Stride,
1708                 s64 * dst2Base, ptrdiff_t dst2Stride,
1709                 s64 * dst3Base, ptrdiff_t dst3Stride);
1710 
1711     /*
1712         Split 4 channel image to 3 channel image and 1 channel image
1713     */
1714     void split4(const Size2D &size,
1715                 const u8 * srcBase, ptrdiff_t srcStride,
1716                 u8 * dst3Base, ptrdiff_t dst3Stride,
1717                 u8 * dst1Base, ptrdiff_t dst1Stride);
1718 
1719     /*
1720         Flip image using specified flip mode
1721     */
1722     bool isFlipSupported(FLIP_MODE flipMode, u32 elemSize);
1723     void flip(const Size2D &size,
1724               const u8 * srcBase, ptrdiff_t srcStride,
1725               u8 * dstBase, ptrdiff_t dstStride,
1726               FLIP_MODE flipMode, u32 elemSize);
1727 
1728     /*
1729         For each point `p` within `size`, set `dst[p]` to the maximum
1730         of `src[p]` and the 8 points around it
1731         NOTE: the function cannot operate inplace
1732     */
1733     bool isMorph3x3Supported(const Size2D &size, BORDER_MODE border);
1734 
1735     void erode3x3(const Size2D &size,
1736                   const u8 * srcBase, ptrdiff_t srcStride,
1737                   u8 * dstBase, ptrdiff_t dstStride,
1738                   BORDER_MODE border, u8 borderValue);
1739 
1740     void dilate3x3(const Size2D &size,
1741                    const u8 * srcBase, ptrdiff_t srcStride,
1742                    u8 * dstBase, ptrdiff_t dstStride,
1743                    BORDER_MODE border, u8 borderValue);
1744 
1745     void erode(const Size2D &ssize, u32 cn,
1746                const u8 * srcBase, ptrdiff_t srcStride,
1747                u8 * dstBase, ptrdiff_t dstStride,
1748                const Size2D &ksize,
1749                size_t anchorX, size_t anchorY,
1750                BORDER_MODE rowBorderType, BORDER_MODE columnBorderType,
1751                const u8 * borderValues, Margin borderMargin);
1752 
1753     void dilate(const Size2D &ssize, u32 cn,
1754                 const u8 * srcBase, ptrdiff_t srcStride,
1755                 u8 * dstBase, ptrdiff_t dstStride,
1756                 const Size2D &ksize,
1757                 size_t anchorX, size_t anchorY,
1758                 BORDER_MODE rowBorderType, BORDER_MODE columnBorderType,
1759                 const u8 * borderValues, Margin borderMargin);
1760 
1761     /*
1762         Resize a source image using "nearest neighbor" interpolation type
1763 
1764         wr = src_width / dst_width
1765         hr = src_height / dst_height
1766     */
1767     bool isResizeNearestNeighborSupported(const Size2D &ssize, u32 elemSize);
1768     void resizeNearestNeighbor(const Size2D &ssize, const Size2D &dsize,
1769                                const void * srcBase, ptrdiff_t srcStride,
1770                                void * dstBase, ptrdiff_t dstStride,
1771                                f32 wr, f32 hr, u32 elemSize);
1772 
1773     /*
1774         Resize a source image using "area" interpolation type
1775 
1776         wr = src_width / dst_width
1777         hr = src_height / dst_height
1778     */
1779     bool isResizeAreaSupported(f32 wr, f32 hr, u32 channels);
1780     void resizeAreaOpenCV(const Size2D &ssize, const Size2D &dsize,
1781                           const u8 * srcBase, ptrdiff_t srcStride,
1782                           u8 * dstBase, ptrdiff_t dstStride,
1783                           f32 wr, f32 hr, u32 channels);
1784     void resizeArea(const Size2D &ssize, const Size2D &dsize,
1785                     const u8 * srcBase, ptrdiff_t srcStride,
1786                     u8 * dstBase, ptrdiff_t dstStride,
1787                     f32 wr, f32 hr, u32 channels);
1788 
1789     /*
1790         Resize a source image using "linear" interpolation type
1791 
1792         wr = src_width / dst_width
1793         hr = src_height / dst_height
1794     */
1795     bool isResizeLinearOpenCVSupported(const Size2D &ssize, const Size2D &dsize, u32 channels);
1796     bool isResizeLinearSupported(const Size2D &ssize, const Size2D &dsize,
1797                                  f32 wr, f32 hr, u32 channels);
1798     void resizeLinearOpenCV(const Size2D &ssize, const Size2D &dsize,
1799                             const u8 * srcBase, ptrdiff_t srcStride,
1800                             u8 * dstBase, ptrdiff_t dstStride,
1801                             f32 wr, f32 hr, u32 channels);
1802     void resizeLinear(const Size2D &ssize, const Size2D &dsize,
1803                       const u8 * srcBase, ptrdiff_t srcStride,
1804                       u8 * dstBase, ptrdiff_t dstStride,
1805                       f32 wr, f32 hr, u32 channels);
1806 
1807     /*
1808         For each point `p` within `size`, set `dst[p]` to convolution
1809         of `src[p]` and the (ksize * ksize - 1) points around it
1810         The function uses OpenVX semantic (so, in order to use this function
1811         in OpenCV you should flip kernel in both directions)
1812         NOTE: the function cannot operate inplace
1813     */
1814     bool isConvolutionSupported(const Size2D &size, const Size2D &ksize, BORDER_MODE border);
1815     void convolution(const Size2D &size,
1816                      const u8 * srcBase, ptrdiff_t srcStride,
1817                      u8 * dstBase, ptrdiff_t dstStride,
1818                      BORDER_MODE border, u8 borderValue,
1819                      const Size2D & ksize, s16 * kernelBase, u32 scale);
1820 
1821     /*
1822         For each point `p` within `dstSize`, does convolution
1823         of tmpl points and size*size square of src points starting with `src[p]`.
1824         Src should be of size (dstSize+size-1)*(dstSize+size-1)
1825         NOTE: the function cannot operate inplace
1826     */
1827     bool isMatchTemplateSupported(const Size2D &tmplSize);
1828     void matchTemplate(const Size2D &srcSize,
1829                        const u8 * srcBase, ptrdiff_t srcStride,
1830                        const Size2D &tmplSize,
1831                        const u8 * tmplBase, ptrdiff_t tmplStride,
1832                        f32 * dstBase, ptrdiff_t dstStride,
1833                        bool normalize);
1834 
1835     /*
1836         Calculation of Laplacian operator
1837 
1838         1  1  1
1839         1 -8  1
1840         1  1  1
1841 
1842         NOTE: the function cannot operate inplace
1843     */
1844     bool isLaplacian3x3Supported(const Size2D &size, BORDER_MODE border);
1845     void Laplacian3x3(const Size2D &size,
1846                       const u8 * srcBase, ptrdiff_t srcStride,
1847                       u8 * dstBase, ptrdiff_t dstStride,
1848                       BORDER_MODE border, u8 borderValue);
1849 
1850     /*
1851         OpenCV like calculation of Laplacian operator
1852 
1853         kernel 1    kernel 3    kernel 5
1854         0  1  0     2  0  2     1   2   2   2   1
1855         1 -4  1     0 -8  0     2   0  -4   0   2
1856         0  1  0     2  0  2     2  -4 -12  -4   2
1857                                 2   0  -4   0   2
1858                                 1   2   2   2   1
1859 
1860         NOTE: the function cannot operate inplace
1861     */
1862     bool isLaplacianOpenCVSupported(const Size2D &size, BORDER_MODE border);
1863     void Laplacian1OpenCV(const Size2D &size,
1864                           const u8 * srcBase, ptrdiff_t srcStride,
1865                           s16 * dstBase, ptrdiff_t dstStride,
1866                           BORDER_MODE border, u8 borderValue);
1867     void Laplacian3OpenCV(const Size2D &size,
1868                           const u8 * srcBase, ptrdiff_t srcStride,
1869                           s16 * dstBase, ptrdiff_t dstStride,
1870                           BORDER_MODE border, u8 borderValue);
1871     void Laplacian5OpenCV(const Size2D &size,
1872                           const u8 * srcBase, ptrdiff_t srcStride,
1873                           s16 * dstBase, ptrdiff_t dstStride,
1874                           BORDER_MODE border, u8 borderValue);
1875 
1876     /*
1877         Detect image edges using Canny algorithm
1878         These functions perform derivatives estimation using sobel algorithm
1879     */
1880     bool isCanny3x3Supported(const Size2D &size);
1881     void Canny3x3L1(const Size2D &size,
1882                     const u8 * srcBase, ptrdiff_t srcStride,
1883                     u8 * dstBase, ptrdiff_t dstStride,
1884                     f64 low_thresh, f64 high_thresh,
1885                     Margin borderMargin);
1886 
1887     void Canny3x3L2(const Size2D &size,
1888                     const u8 * srcBase, ptrdiff_t srcStride,
1889                     u8 * dstBase, ptrdiff_t dstStride,
1890                     f64 low_thresh, f64 high_thresh,
1891                     Margin borderMargin);
1892 
1893     /*
1894         Detect image edges using Canny algorithm
1895         These functions don't estimate derivatives and thus require
1896         precomputed derivatives estimation instead of source image
1897     */
1898     void Canny3x3L1(const Size2D &size, s32 cn,
1899                     s16 * dxBase, ptrdiff_t dxStride,
1900                     s16 * dyBase, ptrdiff_t dyStride,
1901                     u8 * dstBase, ptrdiff_t dstStride,
1902                     f64 low_thresh, f64 high_thresh);
1903 
1904     void Canny3x3L2(const Size2D &size, s32 cn,
1905                     s16 * dxBase, ptrdiff_t dxStride,
1906                     s16 * dyBase, ptrdiff_t dyStride,
1907                     u8 * dstBase, ptrdiff_t dstStride,
1908                     f64 low_thresh, f64 high_thresh);
1909 
1910     /*
1911         Performs detection of FAST features
1912     */
1913     void FAST(const Size2D &size,
1914               u8 *srcBase, ptrdiff_t srcStride,
1915               KeypointStore *keypoints,
1916               u8 threshold, bool nonmax_suppression);
1917 
1918     /*
1919         Remap a source image using table and specified
1920         extrapolation method
1921     */
1922     bool isRemapNearestNeighborSupported(const Size2D &ssize);
1923     void remapNearestNeighbor(const Size2D &ssize, const Size2D &dsize,
1924                               const u8 * srcBase, ptrdiff_t srcStride,
1925                               const f32 * tableBase, ptrdiff_t tableStride,
1926                               u8 * dstBase, ptrdiff_t dstStride,
1927                               BORDER_MODE borderMode, u8 borderValue);
1928 
1929     bool isRemapLinearSupported(const Size2D &ssize);
1930     void remapLinear(const Size2D &ssize, const Size2D &dsize,
1931                      const u8 * srcBase, ptrdiff_t srcStride,
1932                      const f32 * tableBase, ptrdiff_t tableStride,
1933                      u8 * dstBase, ptrdiff_t dstStride,
1934                      BORDER_MODE borderMode, u8 borderValue);
1935 
1936     /*
1937         Perform an affine transform on an input image
1938 
1939         src_x = dst_x * m[0] + dst_y * m[2] + m[4]
1940         src_y = dst_x * m[1] + dst_y * m[3] + m[5]
1941     */
1942     bool isWarpAffineNearestNeighborSupported(const Size2D &ssize);
1943     void warpAffineNearestNeighbor(const Size2D &ssize, const Size2D &dsize,
1944                                    const u8 * srcBase, ptrdiff_t srcStride,
1945                                    const f32 * m,
1946                                    u8 * dstBase, ptrdiff_t dstStride,
1947                                    BORDER_MODE borderMode, u8 borderValue);
1948 
1949     bool isWarpAffineLinearSupported(const Size2D &ssize);
1950     void warpAffineLinear(const Size2D &ssize, const Size2D &dsize,
1951                           const u8 * srcBase, ptrdiff_t srcStride,
1952                           const f32 * m,
1953                           u8 * dstBase, ptrdiff_t dstStride,
1954                           BORDER_MODE borderMode, u8 borderValue);
1955 
1956     /*
1957         Perform a perspective transform on an input image
1958 
1959         src_x = dst_x * m[0] + dst_y * m[3] + m[6]
1960         src_y = dst_x * m[1] + dst_y * m[4] + m[7]
1961         w     = dst_x * m[2] + dst_y * m[5] + m[8]
1962 
1963         src_x = w == 0 ? 0 : src_x / w
1964         src_y = w == 0 ? 0 : src_y / w
1965     */
1966     bool isWarpPerspectiveNearestNeighborSupported(const Size2D &ssize);
1967     void warpPerspectiveNearestNeighbor(const Size2D &ssize, const Size2D &dsize,
1968                                         const u8 * srcBase, ptrdiff_t srcStride,
1969                                         const f32 * m,
1970                                         u8 * dstBase, ptrdiff_t dstStride,
1971                                         BORDER_MODE borderMode, u8 borderValue);
1972 
1973     bool isWarpPerspectiveLinearSupported(const Size2D &ssize);
1974     void warpPerspectiveLinear(const Size2D &ssize, const Size2D &dsize,
1975                                const u8 * srcBase, ptrdiff_t srcStride,
1976                                const f32 * m,
1977                                u8 * dstBase, ptrdiff_t dstStride,
1978                                BORDER_MODE borderMode, u8 borderValue);
1979 
1980     /*
1981         Convert data from source to destination type
1982     */
1983     void convert(const Size2D &_size,
1984                  const u8 * srcBase, ptrdiff_t srcStride,
1985                  s8 * dstBase, ptrdiff_t dstStride);
1986 
1987     void convert(const Size2D &_size,
1988                  const u8 * srcBase, ptrdiff_t srcStride,
1989                  u16 * dstBase, ptrdiff_t dstStride);
1990 
1991     void convert(const Size2D &_size,
1992                  const u8 * srcBase, ptrdiff_t srcStride,
1993                  s16 * dstBase, ptrdiff_t dstStride);
1994 
1995     void convert(const Size2D &_size,
1996                  const u8 * srcBase, ptrdiff_t srcStride,
1997                  s32 * dstBase, ptrdiff_t dstStride);
1998 
1999     void convert(const Size2D &_size,
2000                  const u8 * srcBase, ptrdiff_t srcStride,
2001                  f32 * dstBase, ptrdiff_t dstStride);
2002 
2003     void convert(const Size2D &_size,
2004                  const s8 * srcBase, ptrdiff_t srcStride,
2005                  u8 * dstBase, ptrdiff_t dstStride);
2006 
2007     void convert(const Size2D &_size,
2008                  const s8 * srcBase, ptrdiff_t srcStride,
2009                  u16 * dstBase, ptrdiff_t dstStride);
2010 
2011     void convert(const Size2D &_size,
2012                  const s8 * srcBase, ptrdiff_t srcStride,
2013                  s16 * dstBase, ptrdiff_t dstStride);
2014 
2015     void convert(const Size2D &_size,
2016                  const s8 * srcBase, ptrdiff_t srcStride,
2017                  s32 * dstBase, ptrdiff_t dstStride);
2018 
2019     void convert(const Size2D &_size,
2020                  const s8 * srcBase, ptrdiff_t srcStride,
2021                  f32 * dstBase, ptrdiff_t dstStride);
2022 
2023     void convert(const Size2D &_size,
2024                  const u16 * srcBase, ptrdiff_t srcStride,
2025                  u8 * dstBase, ptrdiff_t dstStride);
2026 
2027     void convert(const Size2D &_size,
2028                  const u16 * srcBase, ptrdiff_t srcStride,
2029                  s8 * dstBase, ptrdiff_t dstStride);
2030 
2031     void convert(const Size2D &_size,
2032                  const u16 * srcBase, ptrdiff_t srcStride,
2033                  s16 * dstBase, ptrdiff_t dstStride);
2034 
2035     void convert(const Size2D &_size,
2036                  const u16 * srcBase, ptrdiff_t srcStride,
2037                  s32 * dstBase, ptrdiff_t dstStride);
2038 
2039     void convert(const Size2D &_size,
2040                  const u16 * srcBase, ptrdiff_t srcStride,
2041                  f32 * dstBase, ptrdiff_t dstStride);
2042 
2043     void convert(const Size2D &_size,
2044                  const s16 * srcBase, ptrdiff_t srcStride,
2045                  u8 * dstBase, ptrdiff_t dstStride);
2046 
2047     void convert(const Size2D &_size,
2048                  const s16 * srcBase, ptrdiff_t srcStride,
2049                  s8 * dstBase, ptrdiff_t dstStride);
2050 
2051     void convert(const Size2D &_size,
2052                  const s16 * srcBase, ptrdiff_t srcStride,
2053                  u16 * dstBase, ptrdiff_t dstStride);
2054 
2055     void convert(const Size2D &_size,
2056                  const s16 * srcBase, ptrdiff_t srcStride,
2057                  s32 * dstBase, ptrdiff_t dstStride);
2058 
2059     void convert(const Size2D &_size,
2060                  const s16 * srcBase, ptrdiff_t srcStride,
2061                  f32 * dstBase, ptrdiff_t dstStride);
2062 
2063     void convert(const Size2D &_size,
2064                  const s32 * srcBase, ptrdiff_t srcStride,
2065                  u8 * dstBase, ptrdiff_t dstStride);
2066 
2067     void convert(const Size2D &_size,
2068                  const s32 * srcBase, ptrdiff_t srcStride,
2069                  s8 * dstBase, ptrdiff_t dstStride);
2070 
2071     void convert(const Size2D &_size,
2072                  const s32 * srcBase, ptrdiff_t srcStride,
2073                  u16 * dstBase, ptrdiff_t dstStride);
2074 
2075     void convert(const Size2D &_size,
2076                  const s32 * srcBase, ptrdiff_t srcStride,
2077                  s16 * dstBase, ptrdiff_t dstStride);
2078 
2079     void convert(const Size2D &_size,
2080                  const s32 * srcBase, ptrdiff_t srcStride,
2081                  f32 * dstBase, ptrdiff_t dstStride);
2082 
2083     void convert(const Size2D &_size,
2084                  const f32 * srcBase, ptrdiff_t srcStride,
2085                  u8 * dstBase, ptrdiff_t dstStride);
2086 
2087     void convert(const Size2D &_size,
2088                  const f32 * srcBase, ptrdiff_t srcStride,
2089                  s8 * dstBase, ptrdiff_t dstStride);
2090 
2091     void convert(const Size2D &_size,
2092                  const f32 * srcBase, ptrdiff_t srcStride,
2093                  u16 * dstBase, ptrdiff_t dstStride);
2094 
2095     void convert(const Size2D &_size,
2096                  const f32 * srcBase, ptrdiff_t srcStride,
2097                  s16 * dstBase, ptrdiff_t dstStride);
2098 
2099     void convert(const Size2D &_size,
2100                  const f32 * srcBase, ptrdiff_t srcStride,
2101                  s32 * dstBase, ptrdiff_t dstStride);
2102 
2103     /*
2104         Convert data from source to destination type with scaling
2105         dst = saturate_cast<dst_type>(src * alpha + beta)
2106     */
2107     void convertScale(const Size2D &_size,
2108                       const u8 * srcBase, ptrdiff_t srcStride,
2109                       u8 * dstBase, ptrdiff_t dstStride,
2110                       f64 alpha, f64 beta);
2111 
2112     void convertScale(const Size2D &_size,
2113                       const u8 * srcBase, ptrdiff_t srcStride,
2114                       s8 * dstBase, ptrdiff_t dstStride,
2115                       f64 alpha, f64 beta);
2116 
2117     void convertScale(const Size2D &_size,
2118                       const u8 * srcBase, ptrdiff_t srcStride,
2119                       u16 * dstBase, ptrdiff_t dstStride,
2120                       f64 alpha, f64 beta);
2121 
2122     void convertScale(const Size2D &_size,
2123                       const u8 * srcBase, ptrdiff_t srcStride,
2124                       s16 * dstBase, ptrdiff_t dstStride,
2125                       f64 alpha, f64 beta);
2126 
2127     void convertScale(const Size2D &_size,
2128                       const u8 * srcBase, ptrdiff_t srcStride,
2129                       s32 * dstBase, ptrdiff_t dstStride,
2130                       f64 alpha, f64 beta);
2131 
2132     void convertScale(const Size2D &_size,
2133                       const u8 * srcBase, ptrdiff_t srcStride,
2134                       f32 * dstBase, ptrdiff_t dstStride,
2135                       f64 alpha, f64 beta);
2136 
2137     void convertScale(const Size2D &_size,
2138                       const s8 * srcBase, ptrdiff_t srcStride,
2139                       u8 * dstBase, ptrdiff_t dstStride,
2140                       f64 alpha, f64 beta);
2141 
2142     void convertScale(const Size2D &_size,
2143                       const s8 * srcBase, ptrdiff_t srcStride,
2144                       s8 * dstBase, ptrdiff_t dstStride,
2145                       f64 alpha, f64 beta);
2146 
2147     void convertScale(const Size2D &_size,
2148                       const s8 * srcBase, ptrdiff_t srcStride,
2149                       u16 * dstBase, ptrdiff_t dstStride,
2150                       f64 alpha, f64 beta);
2151 
2152     void convertScale(const Size2D &_size,
2153                       const s8 * srcBase, ptrdiff_t srcStride,
2154                       s16 * dstBase, ptrdiff_t dstStride,
2155                       f64 alpha, f64 beta);
2156 
2157     void convertScale(const Size2D &_size,
2158                       const s8 * srcBase, ptrdiff_t srcStride,
2159                       s32 * dstBase, ptrdiff_t dstStride,
2160                       f64 alpha, f64 beta);
2161 
2162     void convertScale(const Size2D &_size,
2163                       const s8 * srcBase, ptrdiff_t srcStride,
2164                       f32 * dstBase, ptrdiff_t dstStride,
2165                       f64 alpha, f64 beta);
2166 
2167     void convertScale(const Size2D &_size,
2168                       const u16 * srcBase, ptrdiff_t srcStride,
2169                       u8 * dstBase, ptrdiff_t dstStride,
2170                       f64 alpha, f64 beta);
2171 
2172     void convertScale(const Size2D &_size,
2173                       const u16 * srcBase, ptrdiff_t srcStride,
2174                       s8 * dstBase, ptrdiff_t dstStride,
2175                       f64 alpha, f64 beta);
2176 
2177     void convertScale(const Size2D &_size,
2178                       const u16 * srcBase, ptrdiff_t srcStride,
2179                       u16 * dstBase, ptrdiff_t dstStride,
2180                       f64 alpha, f64 beta);
2181 
2182     void convertScale(const Size2D &_size,
2183                       const u16 * srcBase, ptrdiff_t srcStride,
2184                       s16 * dstBase, ptrdiff_t dstStride,
2185                       f64 alpha, f64 beta);
2186 
2187     void convertScale(const Size2D &_size,
2188                       const u16 * srcBase, ptrdiff_t srcStride,
2189                       s32 * dstBase, ptrdiff_t dstStride,
2190                       f64 alpha, f64 beta);
2191 
2192     void convertScale(const Size2D &_size,
2193                       const u16 * srcBase, ptrdiff_t srcStride,
2194                       f32 * dstBase, ptrdiff_t dstStride,
2195                       f64 alpha, f64 beta);
2196 
2197     void convertScale(const Size2D &_size,
2198                       const s16 * srcBase, ptrdiff_t srcStride,
2199                       u8 * dstBase, ptrdiff_t dstStride,
2200                       f64 alpha, f64 beta);
2201 
2202     void convertScale(const Size2D &_size,
2203                       const s16 * srcBase, ptrdiff_t srcStride,
2204                       s8 * dstBase, ptrdiff_t dstStride,
2205                       f64 alpha, f64 beta);
2206 
2207     void convertScale(const Size2D &_size,
2208                       const s16 * srcBase, ptrdiff_t srcStride,
2209                       u16 * dstBase, ptrdiff_t dstStride,
2210                       f64 alpha, f64 beta);
2211 
2212     void convertScale(const Size2D &_size,
2213                       const s16 * srcBase, ptrdiff_t srcStride,
2214                       s16 * dstBase, ptrdiff_t dstStride,
2215                       f64 alpha, f64 beta);
2216 
2217     void convertScale(const Size2D &_size,
2218                       const s16 * srcBase, ptrdiff_t srcStride,
2219                       s32 * dstBase, ptrdiff_t dstStride,
2220                       f64 alpha, f64 beta);
2221 
2222     void convertScale(const Size2D &_size,
2223                       const s16 * srcBase, ptrdiff_t srcStride,
2224                       f32 * dstBase, ptrdiff_t dstStride,
2225                       f64 alpha, f64 beta);
2226 
2227     void convertScale(const Size2D &_size,
2228                       const s32 * srcBase, ptrdiff_t srcStride,
2229                       u8 * dstBase, ptrdiff_t dstStride,
2230                       f64 alpha, f64 beta);
2231 
2232     void convertScale(const Size2D &_size,
2233                       const s32 * srcBase, ptrdiff_t srcStride,
2234                       s8 * dstBase, ptrdiff_t dstStride,
2235                       f64 alpha, f64 beta);
2236 
2237     void convertScale(const Size2D &_size,
2238                       const s32 * srcBase, ptrdiff_t srcStride,
2239                       u16 * dstBase, ptrdiff_t dstStride,
2240                       f64 alpha, f64 beta);
2241 
2242     void convertScale(const Size2D &_size,
2243                       const s32 * srcBase, ptrdiff_t srcStride,
2244                       s16 * dstBase, ptrdiff_t dstStride,
2245                       f64 alpha, f64 beta);
2246 
2247     void convertScale(const Size2D &_size,
2248                       const s32 * srcBase, ptrdiff_t srcStride,
2249                       s32 * dstBase, ptrdiff_t dstStride,
2250                       f64 alpha, f64 beta);
2251 
2252     void convertScale(const Size2D &_size,
2253                       const s32 * srcBase, ptrdiff_t srcStride,
2254                       f32 * dstBase, ptrdiff_t dstStride,
2255                       f64 alpha, f64 beta);
2256 
2257     void convertScale(const Size2D &_size,
2258                       const f32 * srcBase, ptrdiff_t srcStride,
2259                       u8 * dstBase, ptrdiff_t dstStride,
2260                       f64 alpha, f64 beta);
2261 
2262     void convertScale(const Size2D &_size,
2263                       const f32 * srcBase, ptrdiff_t srcStride,
2264                       s8 * dstBase, ptrdiff_t dstStride,
2265                       f64 alpha, f64 beta);
2266 
2267     void convertScale(const Size2D &_size,
2268                       const f32 * srcBase, ptrdiff_t srcStride,
2269                       u16 * dstBase, ptrdiff_t dstStride,
2270                       f64 alpha, f64 beta);
2271 
2272     void convertScale(const Size2D &_size,
2273                       const f32 * srcBase, ptrdiff_t srcStride,
2274                       s16 * dstBase, ptrdiff_t dstStride,
2275                       f64 alpha, f64 beta);
2276 
2277     void convertScale(const Size2D &_size,
2278                       const f32 * srcBase, ptrdiff_t srcStride,
2279                       s32 * dstBase, ptrdiff_t dstStride,
2280                       f64 alpha, f64 beta);
2281 
2282     void convertScale(const Size2D &_size,
2283                       const f32 * srcBase, ptrdiff_t srcStride,
2284                       f32 * dstBase, ptrdiff_t dstStride,
2285                       f64 alpha, f64 beta);
2286 
2287     /*
2288         Reduce matrix to a vector by calculatin given operation for each column
2289     */
2290     void reduceColSum(const Size2D &size,
2291                       const u8 * srcBase, ptrdiff_t srcStride,
2292                       s32 * dstBase);
2293 
2294     void reduceColMax(const Size2D &size,
2295                       const u8 * srcBase, ptrdiff_t srcStride,
2296                       u8 * dstBase);
2297 
2298     void reduceColMin(const Size2D &size,
2299                       const u8 * srcBase, ptrdiff_t srcStride,
2300                       u8 * dstBase);
2301 
2302     void reduceColSum(const Size2D &size,
2303                       const f32 * srcBase, ptrdiff_t srcStride,
2304                       f32 * dstBase);
2305 
2306     void reduceColMax(const Size2D &size,
2307                       const f32 * srcBase, ptrdiff_t srcStride,
2308                       f32 * dstBase);
2309 
2310     void reduceColMin(const Size2D &size,
2311                       const f32 * srcBase, ptrdiff_t srcStride,
2312                       f32 * dstBase);
2313 
2314     /*
2315         For each point `p` within `size`, do:
2316         dst[p] = (rng1[p] <= src[p] && src[p] <= rng2[p]) ? 255 : 0
2317     */
2318 
2319     void inRange(const Size2D &_size,
2320                  const u8 * srcBase, ptrdiff_t srcStride,
2321                  const u8 * rng1Base, ptrdiff_t rng1Stride,
2322                  const u8 * rng2Base, ptrdiff_t rng2Stride,
2323                  u8 * dstBase, ptrdiff_t dstStride);
2324 
2325     void inRange(const Size2D &_size,
2326                  const s8 * srcBase, ptrdiff_t srcStride,
2327                  const s8 * rng1Base, ptrdiff_t rng1Stride,
2328                  const s8 * rng2Base, ptrdiff_t rng2Stride,
2329                  u8 * dstBase, ptrdiff_t dstStride);
2330 
2331     void inRange(const Size2D &_size,
2332                  const u16 * srcBase, ptrdiff_t srcStride,
2333                  const u16 * rng1Base, ptrdiff_t rng1Stride,
2334                  const u16 * rng2Base, ptrdiff_t rng2Stride,
2335                  u8 * dstBase, ptrdiff_t dstStride);
2336 
2337     void inRange(const Size2D &_size,
2338                  const s16 * srcBase, ptrdiff_t srcStride,
2339                  const s16 * rng1Base, ptrdiff_t rng1Stride,
2340                  const s16 * rng2Base, ptrdiff_t rng2Stride,
2341                  u8 * dstBase, ptrdiff_t dstStride);
2342 
2343     void inRange(const Size2D &_size,
2344                  const s32 * srcBase, ptrdiff_t srcStride,
2345                  const s32 * rng1Base, ptrdiff_t rng1Stride,
2346                  const s32 * rng2Base, ptrdiff_t rng2Stride,
2347                  u8 * dstBase, ptrdiff_t dstStride);
2348 
2349     void inRange(const Size2D &_size,
2350                  const f32 * srcBase, ptrdiff_t srcStride,
2351                  const f32 * rng1Base, ptrdiff_t rng1Stride,
2352                  const f32 * rng2Base, ptrdiff_t rng2Stride,
2353                  u8 * dstBase, ptrdiff_t dstStride);
2354 
2355     /*
2356         Estimate amount of non zero elements
2357     */
2358     s32 countNonZero(const Size2D &_size,
2359                      const u8 * srcBase, ptrdiff_t srcStride);
2360 
2361     s32 countNonZero(const Size2D &_size,
2362                      const u16 * srcBase, ptrdiff_t srcStride);
2363 
2364     s32 countNonZero(const Size2D &_size,
2365                      const s32 * srcBase, ptrdiff_t srcStride);
2366 
2367     s32 countNonZero(const Size2D &_size,
2368                      const f32 * srcBase, ptrdiff_t srcStride);
2369 
2370     s32 countNonZero(const Size2D &_size,
2371                      const f64 * srcBase, ptrdiff_t srcStride);
2372 
2373     /*
2374         Calculates sum of all image pixel values and squared values
2375     */
2376     bool isSumSupported(u32 channels);
2377 
2378     void sum(const Size2D &_size,
2379              const u8 * srcBase, ptrdiff_t srcStride,
2380              u32 * sumdst, u32 channels);
2381 
2382     void sum(const Size2D &_size,
2383              const f32 * srcBase, ptrdiff_t srcStride,
2384              f64 * sumdst, u32 channels);
2385 
2386     bool isSqsumSupported(u32 channels);
2387 
2388     void sqsum(const Size2D &_size,
2389                const u8 * srcBase, ptrdiff_t srcStride,
2390                f64 * sumdst, f64 * sqsumdst, u32 channels);
2391 
2392     /*
2393         Calculates norm
2394     */
2395     s32 normInf(const Size2D &_size,
2396                 const u8 * srcBase, ptrdiff_t srcStride);
2397 
2398     s32 normInf(const Size2D &_size,
2399                 const s8 * srcBase, ptrdiff_t srcStride);
2400 
2401     s32 normInf(const Size2D &_size,
2402                 const u16 * srcBase, ptrdiff_t srcStride);
2403 
2404     s32 normInf(const Size2D &_size,
2405                 const s16 * srcBase, ptrdiff_t srcStride);
2406 
2407     s32 normInf(const Size2D &_size,
2408                 const s32 * srcBase, ptrdiff_t srcStride);
2409 
2410     f32 normInf(const Size2D &_size,
2411                 const f32 * srcBase, ptrdiff_t srcStride);
2412 
2413     s32 normL1(const Size2D &_size,
2414                const u8 * srcBase, ptrdiff_t srcStride);
2415 
2416     s32 normL1(const Size2D &_size,
2417                const s8 * srcBase, ptrdiff_t srcStride);
2418 
2419     s32 normL1(const Size2D &_size,
2420                const u16 * srcBase, ptrdiff_t srcStride);
2421 
2422     s32 normL1(const Size2D &_size,
2423                const s16 * srcBase, ptrdiff_t srcStride);
2424 
2425     f64 normL1(const Size2D &_size,
2426                const s32 * srcBase, ptrdiff_t srcStride);
2427 
2428     f64 normL1(const Size2D &_size,
2429                const f32 * srcBase, ptrdiff_t srcStride);
2430 
2431     s32 normL2(const Size2D &_size,
2432                const u8 * srcBase, ptrdiff_t srcStride);
2433 
2434     s32 normL2(const Size2D &_size,
2435                const s8 * srcBase, ptrdiff_t srcStride);
2436 
2437     f64 normL2(const Size2D &_size,
2438                const u16 * srcBase, ptrdiff_t srcStride);
2439 
2440     f64 normL2(const Size2D &_size,
2441                const s16 * srcBase, ptrdiff_t srcStride);
2442 
2443     f64 normL2(const Size2D &_size,
2444                const s32 * srcBase, ptrdiff_t srcStride);
2445 
2446     f64 normL2(const Size2D &_size,
2447                const f32 * srcBase, ptrdiff_t srcStride);
2448 
2449     /*
2450         Calculates norm of per element difference
2451     */
2452     s32 diffNormInf(const Size2D &_size,
2453                     const u8 * src0Base, ptrdiff_t src0Stride,
2454                     const u8 * src1Base, ptrdiff_t src1Stride);
2455 
2456     f32 diffNormInf(const Size2D &_size,
2457                     const f32 * src0Base, ptrdiff_t src0Stride,
2458                     const f32 * src1Base, ptrdiff_t src1Stride);
2459 
2460     s32 diffNormL1(const Size2D &_size,
2461                    const u8 * src0Base, ptrdiff_t src0Stride,
2462                    const u8 * src1Base, ptrdiff_t src1Stride);
2463 
2464     f64 diffNormL1(const Size2D &_size,
2465                    const f32 * src0Base, ptrdiff_t src0Stride,
2466                    const f32 * src1Base, ptrdiff_t src1Stride);
2467 
2468     s32 diffNormL2(const Size2D &_size,
2469                    const u8 * src0Base, ptrdiff_t src0Stride,
2470                    const u8 * src1Base, ptrdiff_t src1Stride);
2471 
2472     f64 diffNormL2(const Size2D &_size,
2473                    const f32 * src0Base, ptrdiff_t src0Stride,
2474                    const f32 * src1Base, ptrdiff_t src1Stride);
2475 
2476     /*
2477      *        Pyramidal Lucas-Kanade Optical Flow level processing
2478      */
2479     void pyrLKOptFlowLevel(const Size2D &size, s32 cn,
2480                            const u8 *prevData, ptrdiff_t prevStride,
2481                            const s16 *prevDerivData, ptrdiff_t prevDerivStride,
2482                            const u8 *nextData, ptrdiff_t nextStride,
2483                            u32 ptCount,
2484                            const f32 *prevPts, f32 *nextPts,
2485                            u8 *status, f32 *err,
2486                            const Size2D &winSize,
2487                            u32 terminationCount, f64 terminationEpsilon,
2488                            u32 level, u32 maxLevel, bool useInitialFlow, bool getMinEigenVals,
2489                            f32 minEigThreshold);
2490 }
2491 
2492 #endif
2493