1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 //   * Redistribution's of source code must retain the above copyright notice,
20 //     this list of conditions and the following disclaimer.
21 //
22 //   * Redistribution's in binary form must reproduce the above copyright notice,
23 //     this list of conditions and the following disclaimer in the documentation
24 //     and/or other materials provided with the distribution.
25 //
26 //   * The name of the copyright holders may not be used to endorse or promote products
27 //     derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the OpenCV Foundation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41 
42 #include "../test_precomp.hpp"
43 #include "opencv2/ts/ocl_test.hpp"
44 
45 #include <cmath>
46 
47 #ifdef HAVE_OPENCL
48 
49 namespace cvtest {
50 namespace ocl {
51 
52 //////////////////////////////// LUT /////////////////////////////////////////////////
53 
PARAM_TEST_CASE(Lut,MatDepth,MatDepth,Channels,bool,bool)54 PARAM_TEST_CASE(Lut, MatDepth, MatDepth, Channels, bool, bool)
55 {
56     int src_depth, lut_depth;
57     int cn;
58     bool use_roi, same_cn;
59 
60     TEST_DECLARE_INPUT_PARAMETER(src);
61     TEST_DECLARE_INPUT_PARAMETER(lut);
62     TEST_DECLARE_OUTPUT_PARAMETER(dst);
63 
64     virtual void SetUp()
65     {
66         src_depth = GET_PARAM(0);
67         lut_depth = GET_PARAM(1);
68         cn = GET_PARAM(2);
69         same_cn = GET_PARAM(3);
70         use_roi = GET_PARAM(4);
71     }
72 
73     void generateTestData()
74     {
75         const int src_type = CV_MAKE_TYPE(src_depth, cn);
76         const int lut_type = CV_MAKE_TYPE(lut_depth, same_cn ? cn : 1);
77         const int dst_type = CV_MAKE_TYPE(lut_depth, cn);
78 
79         Size roiSize = randomSize(1, MAX_VALUE);
80         Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
81         randomSubMat(src, src_roi, roiSize, srcBorder, src_type, 0, 256);
82 
83         Size lutRoiSize = Size(256, 1);
84         Border lutBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
85         randomSubMat(lut, lut_roi, lutRoiSize, lutBorder, lut_type, 5, 16);
86 
87         Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
88         randomSubMat(dst, dst_roi, roiSize, dstBorder, dst_type, 5, 16);
89 
90         UMAT_UPLOAD_INPUT_PARAMETER(src);
91         UMAT_UPLOAD_INPUT_PARAMETER(lut);
92         UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
93     }
94 
95     void Near(double threshold = 0.)
96     {
97         OCL_EXPECT_MATS_NEAR(dst, threshold);
98     }
99 };
100 
OCL_TEST_P(Lut,Mat)101 OCL_TEST_P(Lut, Mat)
102 {
103     for (int j = 0; j < test_loop_times; j++)
104     {
105         generateTestData();
106 
107         OCL_OFF(cv::LUT(src_roi, lut_roi, dst_roi));
108         OCL_ON(cv::LUT(usrc_roi, ulut_roi, udst_roi));
109 
110         Near();
111     }
112 }
113 
114 ///////////////////////// ArithmTestBase ///////////////////////////
115 
PARAM_TEST_CASE(ArithmTestBase,MatDepth,Channels,bool)116 PARAM_TEST_CASE(ArithmTestBase, MatDepth, Channels, bool)
117 {
118     int depth;
119     int cn;
120     bool use_roi;
121     cv::Scalar val;
122     cv::Scalar val_in_range;
123 
124     TEST_DECLARE_INPUT_PARAMETER(src1);
125     TEST_DECLARE_INPUT_PARAMETER(src2);
126     TEST_DECLARE_INPUT_PARAMETER(mask);
127     TEST_DECLARE_OUTPUT_PARAMETER(dst1);
128     TEST_DECLARE_OUTPUT_PARAMETER(dst2);
129 
130     virtual void SetUp()
131     {
132         depth = GET_PARAM(0);
133         cn = GET_PARAM(1);
134         use_roi = GET_PARAM(2);
135     }
136 
137     virtual void generateTestData(bool with_val_in_range = false)
138     {
139         const int type = CV_MAKE_TYPE(depth, cn);
140 
141         double minV = getMinVal(type);
142         double maxV = getMaxVal(type);
143 
144         Size roiSize = randomSize(1, MAX_VALUE);
145         Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
146         randomSubMat(src1, src1_roi, roiSize, src1Border, type, 2, 11); // FIXIT: Test with minV, maxV
147 
148         Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
149         randomSubMat(src2, src2_roi, roiSize, src2Border, type, std::max(-1540., minV), std::min(1740., maxV));
150 
151         Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
152         randomSubMat(dst1, dst1_roi, roiSize, dst1Border, type, 5, 16);
153 
154         Border dst2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
155         randomSubMat(dst2, dst2_roi, roiSize, dst2Border, type, 5, 16);
156 
157         Border maskBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
158         randomSubMat(mask, mask_roi, roiSize, maskBorder, CV_8UC1, 0, 2);
159         cv::threshold(mask, mask, 0.5, 255., CV_8UC1);
160         *mask.ptr(0) = 255; // prevent test case with mask filled 0 only
161 
162         val = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
163                          rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
164 
165         if (with_val_in_range)
166         {
167             val_in_range = cv::Scalar(rng.uniform(minV, maxV), rng.uniform(minV, maxV),
168                                       rng.uniform(minV, maxV), rng.uniform(minV, maxV));
169         }
170 
171         UMAT_UPLOAD_INPUT_PARAMETER(src1);
172         UMAT_UPLOAD_INPUT_PARAMETER(src2);
173         UMAT_UPLOAD_INPUT_PARAMETER(mask);
174         UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
175         UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
176     }
177 
178     void Near(double threshold = 0., bool relative = false)
179     {
180         if (!relative)
181             OCL_EXPECT_MATS_NEAR(dst1, threshold);
182         else
183             OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, threshold);
184     }
185 
186     void Near1(double threshold = 0.)
187     {
188         OCL_EXPECT_MATS_NEAR(dst2, threshold);
189     }
190 };
191 
192 //////////////////////////////// Add /////////////////////////////////////////////////
193 
194 typedef ArithmTestBase Add;
195 
OCL_TEST_P(Add,Mat)196 OCL_TEST_P(Add, Mat)
197 {
198     for (int j = 0; j < test_loop_times; j++)
199     {
200         generateTestData();
201 
202         OCL_OFF(cv::add(src1_roi, src2_roi, dst1_roi));
203         OCL_ON(cv::add(usrc1_roi, usrc2_roi, udst1_roi));
204         Near(0);
205     }
206 }
207 
OCL_TEST_P(Add,Mat_Mask)208 OCL_TEST_P(Add, Mat_Mask)
209 {
210     for (int j = 0; j < test_loop_times; j++)
211     {
212         generateTestData();
213 
214         OCL_OFF(cv::add(src1_roi, src2_roi, dst1_roi, mask_roi));
215         OCL_ON(cv::add(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
216         Near(0);
217     }
218 }
219 
OCL_TEST_P(Add,Scalar)220 OCL_TEST_P(Add, Scalar)
221 {
222     for (int j = 0; j < test_loop_times; j++)
223     {
224         generateTestData();
225 
226         OCL_OFF(cv::add(src1_roi, val, dst1_roi));
227         OCL_ON(cv::add(val, usrc1_roi, udst1_roi));
228         Near(1e-5);
229     }
230 }
231 
OCL_TEST_P(Add,Scalar_Mask)232 OCL_TEST_P(Add, Scalar_Mask)
233 {
234     for (int j = 0; j < test_loop_times; j++)
235     {
236         generateTestData();
237 
238         OCL_OFF(cv::add(src1_roi, val, dst1_roi, mask_roi));
239         OCL_ON(cv::add(usrc1_roi, val, udst1_roi, umask_roi));
240         Near(1e-5);
241     }
242 }
243 
244 //////////////////////////////////////// Subtract //////////////////////////////////////////////
245 
246 typedef ArithmTestBase Subtract;
247 
OCL_TEST_P(Subtract,Mat)248 OCL_TEST_P(Subtract, Mat)
249 {
250     for (int j = 0; j < test_loop_times; j++)
251     {
252         generateTestData();
253 
254         OCL_OFF(cv::subtract(src1_roi, src2_roi, dst1_roi));
255         OCL_ON(cv::subtract(usrc1_roi, usrc2_roi, udst1_roi));
256         Near(0);
257     }
258 }
259 
OCL_TEST_P(Subtract,Mat_Mask)260 OCL_TEST_P(Subtract, Mat_Mask)
261 {
262     for (int j = 0; j < test_loop_times; j++)
263     {
264         generateTestData();
265 
266         OCL_OFF(cv::subtract(src1_roi, src2_roi, dst1_roi, mask_roi));
267         OCL_ON(cv::subtract(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
268         Near(0);
269     }
270 }
271 
OCL_TEST_P(Subtract,Scalar)272 OCL_TEST_P(Subtract, Scalar)
273 {
274     for (int j = 0; j < test_loop_times; j++)
275     {
276         generateTestData();
277 
278         OCL_OFF(cv::subtract(val, src1_roi, dst1_roi));
279         OCL_ON(cv::subtract(val, usrc1_roi, udst1_roi));
280         Near(1e-5);
281     }
282 }
283 
OCL_TEST_P(Subtract,Scalar_Mask)284 OCL_TEST_P(Subtract, Scalar_Mask)
285 {
286     for (int j = 0; j < test_loop_times; j++)
287     {
288         generateTestData();
289 
290         OCL_OFF(cv::subtract(src1_roi, val, dst1_roi, mask_roi));
291         OCL_ON(cv::subtract(usrc1_roi, val, udst1_roi, umask_roi));
292         Near(1e-5);
293     }
294 }
295 
296 //////////////////////////////// Mul /////////////////////////////////////////////////
297 
298 typedef ArithmTestBase Mul;
299 
OCL_TEST_P(Mul,Mat)300 OCL_TEST_P(Mul, Mat)
301 {
302     for (int j = 0; j < test_loop_times; j++)
303     {
304         generateTestData();
305 
306         OCL_OFF(cv::multiply(src1_roi, src2_roi, dst1_roi));
307         OCL_ON(cv::multiply(usrc1_roi, usrc2_roi, udst1_roi));
308         Near(0);
309     }
310 }
311 
OCL_TEST_P(Mul,Scalar)312 OCL_TEST_P(Mul, Scalar)
313 {
314     for (int j = 0; j < test_loop_times; j++)
315     {
316         generateTestData();
317 
318         OCL_OFF(cv::multiply(src1_roi, val, dst1_roi));
319         OCL_ON(cv::multiply(val, usrc1_roi, udst1_roi));
320 
321         Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
322     }
323 }
324 
OCL_TEST_P(Mul,Mat_Scale)325 OCL_TEST_P(Mul, Mat_Scale)
326 {
327     for (int j = 0; j < test_loop_times; j++)
328     {
329         generateTestData();
330 
331         OCL_OFF(cv::multiply(src1_roi, src2_roi, dst1_roi, val[0]));
332         OCL_ON(cv::multiply(usrc1_roi, usrc2_roi, udst1_roi, val[0]));
333 
334 #ifdef ANDROID
335         Near(udst1_roi.depth() >= CV_32F ? 2e-1 : 1);
336 #else
337         Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
338 #endif
339     }
340 }
341 
OCL_TEST_P(Mul,Mat_Scalar_Scale)342 OCL_TEST_P(Mul, Mat_Scalar_Scale)
343 {
344     for (int j = 0; j < test_loop_times; j++)
345     {
346         generateTestData();
347 
348         OCL_OFF(cv::multiply(src1_roi, val, dst1_roi, val[0]));
349         OCL_ON(cv::multiply(usrc1_roi, val, udst1_roi, val[0]));
350 
351         if (udst1_roi.depth() >= CV_32F)
352             Near(1e-6, true);
353         else
354             Near(1);
355     }
356 }
357 
358 
359 //////////////////////////////// Div /////////////////////////////////////////////////
360 
361 typedef ArithmTestBase Div;
362 
OCL_TEST_P(Div,Mat)363 OCL_TEST_P(Div, Mat)
364 {
365     for (int j = 0; j < test_loop_times; j++)
366     {
367         generateTestData();
368 
369         OCL_OFF(cv::divide(src1_roi, src2_roi, dst1_roi));
370         OCL_ON(cv::divide(usrc1_roi, usrc2_roi, udst1_roi));
371         Near(1);
372     }
373 }
374 
OCL_TEST_P(Div,Scalar)375 OCL_TEST_P(Div, Scalar)
376 {
377     for (int j = 0; j < test_loop_times; j++)
378     {
379         generateTestData();
380 
381         OCL_OFF(cv::divide(val, src1_roi, dst1_roi));
382         OCL_ON(cv::divide(val, usrc1_roi, udst1_roi));
383 
384         Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
385     }
386 }
387 
OCL_TEST_P(Div,Scalar2)388 OCL_TEST_P(Div, Scalar2)
389 {
390     for (int j = 0; j < test_loop_times; j++)
391     {
392         generateTestData();
393 
394         OCL_OFF(cv::divide(src1_roi, val, dst1_roi));
395         OCL_ON(cv::divide(usrc1_roi, val, udst1_roi));
396 
397         Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
398     }
399 }
400 
OCL_TEST_P(Div,Mat_Scale)401 OCL_TEST_P(Div, Mat_Scale)
402 {
403     for (int j = 0; j < test_loop_times; j++)
404     {
405         generateTestData();
406 
407         OCL_OFF(cv::divide(src1_roi, src2_roi, dst1_roi, val[0]));
408         OCL_ON(cv::divide(usrc1_roi, usrc2_roi, udst1_roi, val[0]));
409 
410         Near(udst1_roi.depth() >= CV_32F ? 4e-3 : 1);
411     }
412 }
413 
OCL_TEST_P(Div,Mat_Scalar_Scale)414 OCL_TEST_P(Div, Mat_Scalar_Scale)
415 {
416     for (int j = 0; j < test_loop_times; j++)
417     {
418         generateTestData();
419 
420         OCL_OFF(cv::divide(src1_roi, val, dst1_roi, val[0]));
421         OCL_ON(cv::divide(usrc1_roi, val, udst1_roi, val[0]));
422 
423         Near(udst1_roi.depth() >= CV_32F ? 4e-3 : 1);
424     }
425 }
426 
OCL_TEST_P(Div,Recip)427 OCL_TEST_P(Div, Recip)
428 {
429     for (int j = 0; j < test_loop_times; j++)
430     {
431         generateTestData();
432 
433         OCL_OFF(cv::divide(val[0], src1_roi, dst1_roi));
434         OCL_ON(cv::divide(val[0], usrc1_roi, udst1_roi));
435 
436         Near(udst1_roi.depth() >= CV_32F ? 1e-3 : 1);
437     }
438 }
439 
440 //////////////////////////////// Min/Max /////////////////////////////////////////////////
441 
442 typedef ArithmTestBase Min;
443 
OCL_TEST_P(Min,Mat)444 OCL_TEST_P(Min, Mat)
445 {
446     for (int j = 0; j < test_loop_times; j++)
447     {
448         generateTestData();
449 
450         OCL_OFF(cv::max(src1_roi, src2_roi, dst1_roi));
451         OCL_ON(cv::max(usrc1_roi, usrc2_roi, udst1_roi));
452         Near(0);
453     }
454 }
455 
456 typedef ArithmTestBase Max;
457 
OCL_TEST_P(Max,Mat)458 OCL_TEST_P(Max, Mat)
459 {
460     for (int j = 0; j < test_loop_times; j++)
461     {
462         generateTestData();
463 
464         OCL_OFF(cv::min(src1_roi, src2_roi, dst1_roi));
465         OCL_ON(cv::min(usrc1_roi, usrc2_roi, udst1_roi));
466         Near(0);
467     }
468 }
469 
470 //////////////////////////////// Absdiff /////////////////////////////////////////////////
471 
472 typedef ArithmTestBase Absdiff;
473 
OCL_TEST_P(Absdiff,Mat)474 OCL_TEST_P(Absdiff, Mat)
475 {
476     for (int j = 0; j < test_loop_times; j++)
477     {
478         generateTestData();
479 
480         OCL_OFF(cv::absdiff(src1_roi, src2_roi, dst1_roi));
481         OCL_ON(cv::absdiff(usrc1_roi, usrc2_roi, udst1_roi));
482         Near(0);
483     }
484 }
485 
OCL_TEST_P(Absdiff,Scalar)486 OCL_TEST_P(Absdiff, Scalar)
487 {
488     for (int j = 0; j < test_loop_times; j++)
489     {
490         generateTestData();
491 
492         OCL_OFF(cv::absdiff(src1_roi, val, dst1_roi));
493         OCL_ON(cv::absdiff(usrc1_roi, val, udst1_roi));
494         Near(1e-5);
495     }
496 }
497 
498 //////////////////////////////// CartToPolar /////////////////////////////////////////////////
499 
500 typedef ArithmTestBase CartToPolar;
501 
OCL_TEST_P(CartToPolar,angleInDegree)502 OCL_TEST_P(CartToPolar, angleInDegree)
503 {
504     for (int j = 0; j < test_loop_times; j++)
505     {
506         generateTestData();
507 
508         OCL_OFF(cv::cartToPolar(src1_roi, src2_roi, dst1_roi, dst2_roi, true));
509         OCL_ON(cv::cartToPolar(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi, true));
510         Near(0.5);
511         Near1(0.5);
512     }
513 }
514 
OCL_TEST_P(CartToPolar,angleInRadians)515 OCL_TEST_P(CartToPolar, angleInRadians)
516 {
517     for (int j = 0; j < test_loop_times; j++)
518     {
519         generateTestData();
520 
521         OCL_OFF(cv::cartToPolar(src1_roi, src2_roi, dst1_roi, dst2_roi));
522         OCL_ON(cv::cartToPolar(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi));
523         Near(0.5);
524         Near1(0.5);
525     }
526 }
527 
528 //////////////////////////////// PolarToCart /////////////////////////////////////////////////
529 
530 typedef ArithmTestBase PolarToCart;
531 
OCL_TEST_P(PolarToCart,angleInDegree)532 OCL_TEST_P(PolarToCart, angleInDegree)
533 {
534     for (int j = 0; j < test_loop_times; j++)
535     {
536         generateTestData();
537 
538         OCL_OFF(cv::polarToCart(src1_roi, src2_roi, dst1_roi, dst2_roi, true));
539         OCL_ON(cv::polarToCart(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi, true));
540 
541         Near(0.5);
542         Near1(0.5);
543     }
544 }
545 
OCL_TEST_P(PolarToCart,angleInRadians)546 OCL_TEST_P(PolarToCart, angleInRadians)
547 {
548     for (int j = 0; j < test_loop_times; j++)
549     {
550         generateTestData();
551 
552         OCL_OFF(cv::polarToCart(src1_roi, src2_roi, dst1_roi, dst2_roi));
553         OCL_ON(cv::polarToCart(usrc1_roi, usrc2_roi, udst1_roi, udst2_roi));
554 
555         Near(0.5);
556         Near1(0.5);
557     }
558 }
559 
560 //////////////////////////////// Transpose /////////////////////////////////////////////////
561 
562 typedef ArithmTestBase Transpose;
563 
OCL_TEST_P(Transpose,Mat)564 OCL_TEST_P(Transpose, Mat)
565 {
566     for (int j = 0; j < test_loop_times; j++)
567     {
568         generateTestData();
569 
570         Size roiSize = src1_roi.size();
571         Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
572         randomSubMat(dst1, dst1_roi, Size(roiSize.height, roiSize.width), dst1Border, src1.type(), 5, 16);
573 
574         UMAT_UPLOAD_INPUT_PARAMETER(dst1);
575 
576         OCL_OFF(cv::transpose(src1_roi, dst1_roi));
577         OCL_ON(cv::transpose(usrc1_roi, udst1_roi));
578 
579         Near(1e-5);
580     }
581 }
582 
OCL_TEST_P(Transpose,SquareInplace)583 OCL_TEST_P(Transpose, SquareInplace)
584 {
585     const int type = CV_MAKE_TYPE(depth, cn);
586 
587     for (int j = 0; j < test_loop_times; j++)
588     {
589         Size roiSize = randomSize(1, MAX_VALUE);
590         roiSize.height = roiSize.width; // make it square
591 
592         Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
593         randomSubMat(src1, src1_roi, roiSize, srcBorder, type, 5, 16);
594 
595         UMAT_UPLOAD_OUTPUT_PARAMETER(src1);
596 
597         OCL_OFF(cv::transpose(src1_roi, src1_roi));
598         OCL_ON(cv::transpose(usrc1_roi, usrc1_roi));
599 
600         OCL_EXPECT_MATS_NEAR(src1, 0);
601     }
602 }
603 
604 //////////////////////////////// Bitwise_and /////////////////////////////////////////////////
605 
606 typedef ArithmTestBase Bitwise_and;
607 
OCL_TEST_P(Bitwise_and,Mat)608 OCL_TEST_P(Bitwise_and, Mat)
609 {
610     for (int j = 0; j < test_loop_times; j++)
611     {
612         generateTestData();
613 
614         OCL_OFF(cv::bitwise_and(src1_roi, src2_roi, dst1_roi));
615         OCL_ON(cv::bitwise_and(usrc1_roi, usrc2_roi, udst1_roi));
616         Near(0);
617     }
618 }
619 
OCL_TEST_P(Bitwise_and,Mat_Mask)620 OCL_TEST_P(Bitwise_and, Mat_Mask)
621 {
622     for (int j = 0; j < test_loop_times; j++)
623     {
624         generateTestData();
625 
626         OCL_OFF(cv::bitwise_and(src1_roi, src2_roi, dst1_roi, mask_roi));
627         OCL_ON(cv::bitwise_and(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
628         Near(0);
629     }
630 }
631 
OCL_TEST_P(Bitwise_and,Scalar)632 OCL_TEST_P(Bitwise_and, Scalar)
633 {
634     for (int j = 0; j < test_loop_times; j++)
635     {
636         generateTestData();
637 
638         OCL_OFF(cv::bitwise_and(src1_roi, val, dst1_roi));
639         OCL_ON(cv::bitwise_and(usrc1_roi, val, udst1_roi));
640         Near(1e-5);
641     }
642 }
643 
OCL_TEST_P(Bitwise_and,Scalar_Mask)644 OCL_TEST_P(Bitwise_and, Scalar_Mask)
645 {
646     for (int j = 0; j < test_loop_times; j++)
647     {
648         generateTestData();
649 
650         OCL_OFF(cv::bitwise_and(src1_roi, val, dst1_roi, mask_roi));
651         OCL_ON(cv::bitwise_and(usrc1_roi, val, udst1_roi, umask_roi));
652         Near(1e-5);
653     }
654 }
655 
656 //////////////////////////////// Bitwise_or /////////////////////////////////////////////////
657 
658 typedef ArithmTestBase Bitwise_or;
659 
OCL_TEST_P(Bitwise_or,Mat)660 OCL_TEST_P(Bitwise_or, Mat)
661 {
662     for (int j = 0; j < test_loop_times; j++)
663     {
664         generateTestData();
665 
666         OCL_OFF(cv::bitwise_or(src1_roi, src2_roi, dst1_roi));
667         OCL_ON(cv::bitwise_or(usrc1_roi, usrc2_roi, udst1_roi));
668         Near(0);
669     }
670 }
671 
OCL_TEST_P(Bitwise_or,Mat_Mask)672 OCL_TEST_P(Bitwise_or, Mat_Mask)
673 {
674     for (int j = 0; j < test_loop_times; j++)
675     {
676         generateTestData();
677 
678         OCL_OFF(cv::bitwise_or(src1_roi, src2_roi, dst1_roi, mask_roi));
679         OCL_ON(cv::bitwise_or(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
680         Near(0);
681     }
682 }
683 
OCL_TEST_P(Bitwise_or,Scalar)684 OCL_TEST_P(Bitwise_or, Scalar)
685 {
686     for (int j = 0; j < test_loop_times; j++)
687     {
688         generateTestData();
689 
690         OCL_OFF(cv::bitwise_or(src1_roi, val, dst1_roi));
691         OCL_ON(cv::bitwise_or(usrc1_roi, val, udst1_roi));
692         Near(1e-5);
693     }
694 }
695 
OCL_TEST_P(Bitwise_or,Scalar_Mask)696 OCL_TEST_P(Bitwise_or, Scalar_Mask)
697 {
698     for (int j = 0; j < test_loop_times; j++)
699     {
700         generateTestData();
701 
702         OCL_OFF(cv::bitwise_or(src1_roi, val, dst1_roi, mask_roi));
703         OCL_ON(cv::bitwise_or(val, usrc1_roi, udst1_roi, umask_roi));
704         Near(1e-5);
705     }
706 }
707 
708 //////////////////////////////// Bitwise_xor /////////////////////////////////////////////////
709 
710 typedef ArithmTestBase Bitwise_xor;
711 
OCL_TEST_P(Bitwise_xor,Mat)712 OCL_TEST_P(Bitwise_xor, Mat)
713 {
714     for (int j = 0; j < test_loop_times; j++)
715     {
716         generateTestData();
717 
718         OCL_OFF(cv::bitwise_xor(src1_roi, src2_roi, dst1_roi));
719         OCL_ON(cv::bitwise_xor(usrc1_roi, usrc2_roi, udst1_roi));
720         Near(0);
721     }
722 }
723 
OCL_TEST_P(Bitwise_xor,Mat_Mask)724 OCL_TEST_P(Bitwise_xor, Mat_Mask)
725 {
726     for (int j = 0; j < test_loop_times; j++)
727     {
728         generateTestData();
729 
730         OCL_OFF(cv::bitwise_xor(src1_roi, src2_roi, dst1_roi, mask_roi));
731         OCL_ON(cv::bitwise_xor(usrc1_roi, usrc2_roi, udst1_roi, umask_roi));
732         Near(0);
733     }
734 }
735 
OCL_TEST_P(Bitwise_xor,Scalar)736 OCL_TEST_P(Bitwise_xor, Scalar)
737 {
738     for (int j = 0; j < test_loop_times; j++)
739     {
740         generateTestData();
741 
742         OCL_OFF(cv::bitwise_xor(src1_roi, val, dst1_roi));
743         OCL_ON(cv::bitwise_xor(usrc1_roi, val, udst1_roi));
744         Near(1e-5);
745     }
746 }
747 
OCL_TEST_P(Bitwise_xor,Scalar_Mask)748 OCL_TEST_P(Bitwise_xor, Scalar_Mask)
749 {
750     for (int j = 0; j < test_loop_times; j++)
751     {
752         generateTestData();
753 
754         OCL_OFF(cv::bitwise_xor(src1_roi, val, dst1_roi, mask_roi));
755         OCL_ON(cv::bitwise_xor(usrc1_roi, val, udst1_roi, umask_roi));
756         Near(1e-5);
757     }
758 }
759 
760 //////////////////////////////// Bitwise_not /////////////////////////////////////////////////
761 
762 typedef ArithmTestBase Bitwise_not;
763 
OCL_TEST_P(Bitwise_not,Mat)764 OCL_TEST_P(Bitwise_not, Mat)
765 {
766     for (int j = 0; j < test_loop_times; j++)
767     {
768         generateTestData();
769 
770         OCL_OFF(cv::bitwise_not(src1_roi, dst1_roi));
771         OCL_ON(cv::bitwise_not(usrc1_roi, udst1_roi));
772         Near(0);
773     }
774 }
775 
776 //////////////////////////////// Compare /////////////////////////////////////////////////
777 
778 typedef ArithmTestBase Compare;
779 
780 static const int cmp_codes[] = { CMP_EQ, CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE };
781 static const char * cmp_strs[] = { "CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE" };
782 static const int cmp_num = sizeof(cmp_codes) / sizeof(int);
783 
OCL_TEST_P(Compare,Mat)784 OCL_TEST_P(Compare, Mat)
785 {
786     for (int i = 0; i < cmp_num; ++i)
787     {
788         SCOPED_TRACE(cmp_strs[i]);
789         for (int j = 0; j < test_loop_times; j++)
790         {
791             generateTestData();
792 
793             OCL_OFF(cv::compare(src1_roi, src2_roi, dst1_roi, cmp_codes[i]));
794             OCL_ON(cv::compare(usrc1_roi, usrc2_roi, udst1_roi, cmp_codes[i]));
795 
796             Near(0);
797         }
798     }
799 }
800 
OCL_TEST_P(Compare,Scalar)801 OCL_TEST_P(Compare, Scalar)
802 {
803     for (int i = 0; i < cmp_num; ++i)
804     {
805         SCOPED_TRACE(cmp_strs[i]);
806         for (int j = 0; j < test_loop_times; j++)
807         {
808             generateTestData(true);
809 
810             OCL_OFF(cv::compare(src1_roi, val_in_range, dst1_roi, cmp_codes[i]));
811             OCL_ON(cv::compare(usrc1_roi, val_in_range, udst1_roi, cmp_codes[i]));
812 
813             Near(0);
814         }
815     }
816 }
817 
OCL_TEST_P(Compare,Scalar2)818 OCL_TEST_P(Compare, Scalar2)
819 {
820     for (int i = 0; i < cmp_num; ++i)
821     {
822         SCOPED_TRACE(cmp_strs[i]);
823         for (int j = 0; j < test_loop_times; j++)
824         {
825             generateTestData(true);
826 
827             OCL_OFF(cv::compare(val_in_range, src1_roi, dst1_roi, cmp_codes[i]));
828             OCL_ON(cv::compare(val_in_range, usrc1_roi, udst1_roi, cmp_codes[i]));
829 
830             Near(0);
831         }
832     }
833 }
834 
835 //////////////////////////////// Pow /////////////////////////////////////////////////
836 
837 typedef ArithmTestBase Pow;
838 
OCL_TEST_P(Pow,Mat)839 OCL_TEST_P(Pow, Mat)
840 {
841     static const double pows[] = { -4, -1, -2.5, 0, 1, 2, 3.7, 4 };
842 
843     for (int j = 0; j < 1/*test_loop_times*/; j++)
844         for (int k = 0, size = sizeof(pows) / sizeof(double); k < size; ++k)
845         {
846             SCOPED_TRACE(pows[k]);
847 
848             generateTestData();
849 
850             OCL_OFF(cv::pow(src1_roi, pows[k], dst1_roi));
851             OCL_ON(cv::pow(usrc1_roi, pows[k], udst1_roi));
852 
853             OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, 1e-5);
854         }
855 }
856 
857 //////////////////////////////// AddWeighted /////////////////////////////////////////////////
858 
859 typedef ArithmTestBase AddWeighted;
860 
OCL_TEST_P(AddWeighted,Mat)861 OCL_TEST_P(AddWeighted, Mat)
862 {
863     for (int j = 0; j < test_loop_times; j++)
864     {
865         generateTestData();
866 
867         const double alpha = 2.0, beta = 1.0, gama = 3.0;
868 
869         OCL_OFF(cv::addWeighted(src1_roi, alpha, src2_roi, beta, gama, dst1_roi));
870         OCL_ON(cv::addWeighted(usrc1_roi, alpha, usrc2_roi, beta, gama, udst1_roi));
871 
872         Near(3e-4);
873     }
874 }
875 
876 //////////////////////////////// setIdentity /////////////////////////////////////////////////
877 
878 typedef ArithmTestBase SetIdentity;
879 
OCL_TEST_P(SetIdentity,Mat)880 OCL_TEST_P(SetIdentity, Mat)
881 {
882     for (int j = 0; j < test_loop_times; j++)
883     {
884         generateTestData();
885 
886         OCL_OFF(cv::setIdentity(dst1_roi, val));
887         OCL_ON(cv::setIdentity(udst1_roi, val));
888 
889         Near(0);
890     }
891 }
892 
893 //// Repeat
894 
895 struct RepeatTestCase :
896         public ArithmTestBase
897 {
898     int nx, ny;
899 
generateTestDatacvtest::ocl::RepeatTestCase900     virtual void generateTestData()
901     {
902         const int type = CV_MAKE_TYPE(depth, cn);
903 
904         nx = randomInt(1, 4);
905         ny = randomInt(1, 4);
906 
907         Size srcRoiSize = randomSize(1, MAX_VALUE);
908         Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
909         randomSubMat(src1, src1_roi, srcRoiSize, srcBorder, type, 2, 11);
910 
911         Size dstRoiSize(srcRoiSize.width * nx, srcRoiSize.height * ny);
912         Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
913         randomSubMat(dst1, dst1_roi, dstRoiSize, dst1Border, type, 5, 16);
914 
915         UMAT_UPLOAD_INPUT_PARAMETER(src1);
916         UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
917     }
918 };
919 
920 typedef RepeatTestCase Repeat;
921 
OCL_TEST_P(Repeat,Mat)922 OCL_TEST_P(Repeat, Mat)
923 {
924     for (int i = 0; i < test_loop_times; ++i)
925     {
926         generateTestData();
927 
928         OCL_OFF(cv::repeat(src1_roi, ny, nx, dst1_roi));
929         OCL_ON(cv::repeat(usrc1_roi, ny, nx, udst1_roi));
930 
931         Near();
932     }
933 }
934 
935 //////////////////////////////// CountNonZero /////////////////////////////////////////////////
936 
937 typedef ArithmTestBase CountNonZero;
938 
OCL_TEST_P(CountNonZero,MAT)939 OCL_TEST_P(CountNonZero, MAT)
940 {
941     for (int j = 0; j < test_loop_times; j++)
942     {
943         generateTestData();
944 
945         int cpures, gpures;
946         OCL_OFF(cpures = cv::countNonZero(src1_roi));
947         OCL_ON(gpures = cv::countNonZero(usrc1_roi));
948 
949         EXPECT_EQ(cpures, gpures);
950     }
951 }
952 
953 //////////////////////////////// Sum /////////////////////////////////////////////////
954 
955 typedef ArithmTestBase Sum;
956 
OCL_TEST_P(Sum,MAT)957 OCL_TEST_P(Sum, MAT)
958 {
959     for (int j = 0; j < test_loop_times; j++)
960     {
961         generateTestData();
962 
963         Scalar cpures, gpures;
964         OCL_OFF(cpures = cv::sum(src1_roi));
965         OCL_ON(gpures = cv::sum(usrc1_roi));
966 
967         for (int i = 0; i < cn; ++i)
968             EXPECT_NEAR(cpures[i], gpures[i], 0.1);
969     }
970 }
971 
972 //////////////////////////////// meanStdDev /////////////////////////////////////////////////
973 
974 typedef ArithmTestBase MeanStdDev;
975 
OCL_TEST_P(MeanStdDev,Mat)976 OCL_TEST_P(MeanStdDev, Mat)
977 {
978     for (int j = 0; j < test_loop_times; j++)
979     {
980         generateTestData();
981 
982         Scalar cpu_mean, cpu_stddev;
983         Scalar gpu_mean, gpu_stddev;
984 
985         OCL_OFF(cv::meanStdDev(src1_roi, cpu_mean, cpu_stddev));
986         OCL_ON(cv::meanStdDev(usrc1_roi, gpu_mean, gpu_stddev));
987 
988         for (int i = 0; i < cn; ++i)
989         {
990             EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
991             EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
992         }
993     }
994 }
995 
OCL_TEST_P(MeanStdDev,Mat_Mask)996 OCL_TEST_P(MeanStdDev, Mat_Mask)
997 {
998     for (int j = 0; j < test_loop_times; j++)
999     {
1000         generateTestData();
1001 
1002         Scalar cpu_mean, cpu_stddev;
1003         Scalar gpu_mean, gpu_stddev;
1004 
1005         OCL_OFF(cv::meanStdDev(src1_roi, cpu_mean, cpu_stddev, mask_roi));
1006         OCL_ON(cv::meanStdDev(usrc1_roi, gpu_mean, gpu_stddev, umask_roi));
1007 
1008         for (int i = 0; i < cn; ++i)
1009         {
1010             EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
1011             EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
1012         }
1013     }
1014 }
1015 
OCL_TEST(MeanStdDev_,ZeroMask)1016 OCL_TEST(MeanStdDev_, ZeroMask)
1017 {
1018     Size size(5, 5);
1019     UMat um(size, CV_32SC1), umask(size, CV_8UC1, Scalar::all(0));
1020     Mat m(size, CV_32SC1), mask(size, CV_8UC1, Scalar::all(0));
1021 
1022     Scalar cpu_mean, cpu_stddev;
1023     Scalar gpu_mean, gpu_stddev;
1024 
1025     OCL_OFF(cv::meanStdDev(m, cpu_mean, cpu_stddev, mask));
1026     OCL_ON(cv::meanStdDev(um, gpu_mean, gpu_stddev, umask));
1027 
1028     for (int i = 0; i < 4; ++i)
1029     {
1030         EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
1031         EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
1032     }
1033 }
1034 
1035 //////////////////////////////////////// Log /////////////////////////////////////////
1036 
1037 typedef ArithmTestBase Log;
1038 
OCL_TEST_P(Log,Mat)1039 OCL_TEST_P(Log, Mat)
1040 {
1041     for (int j = 0; j < test_loop_times; j++)
1042     {
1043         generateTestData();
1044 
1045         OCL_OFF(cv::log(src1_roi, dst1_roi));
1046         OCL_ON(cv::log(usrc1_roi, udst1_roi));
1047         Near(1);
1048     }
1049 }
1050 
1051 //////////////////////////////////////// Exp /////////////////////////////////////////
1052 
1053 typedef ArithmTestBase Exp;
1054 
OCL_TEST_P(Exp,Mat)1055 OCL_TEST_P(Exp, Mat)
1056 {
1057     for (int j = 0; j < test_loop_times; j++)
1058     {
1059         generateTestData();
1060 
1061         OCL_OFF(cv::exp(src1_roi, dst1_roi));
1062         OCL_ON(cv::exp(usrc1_roi, udst1_roi));
1063         Near(2);
1064     }
1065 }
1066 
1067 //////////////////////////////////////// Phase /////////////////////////////////////////
1068 
1069 typedef ArithmTestBase Phase;
1070 
OCL_TEST_P(Phase,angleInDegree)1071 OCL_TEST_P(Phase, angleInDegree)
1072 {
1073     for (int j = 0; j < test_loop_times; j++)
1074     {
1075         generateTestData();
1076 
1077         OCL_OFF(cv::phase(src1_roi, src2_roi, dst1_roi, true));
1078         OCL_ON(cv::phase(usrc1_roi, usrc2_roi, udst1_roi, true));
1079         Near(1e-2);
1080     }
1081 }
1082 
OCL_TEST_P(Phase,angleInRadians)1083 OCL_TEST_P(Phase, angleInRadians)
1084 {
1085     for (int j = 0; j < test_loop_times; j++)
1086     {
1087         generateTestData();
1088 
1089         OCL_OFF(cv::phase(src1_roi, src2_roi, dst1_roi));
1090         OCL_ON(cv::phase(usrc1_roi, usrc2_roi, udst1_roi));
1091         Near(1e-2);
1092     }
1093 }
1094 
1095 //////////////////////////////////////// Magnitude /////////////////////////////////////////
1096 
1097 typedef ArithmTestBase Magnitude;
1098 
OCL_TEST_P(Magnitude,Mat)1099 OCL_TEST_P(Magnitude, Mat)
1100 {
1101     for (int j = 0; j < test_loop_times; j++)
1102     {
1103         generateTestData();
1104 
1105         OCL_OFF(cv::magnitude(src1_roi, src2_roi, dst1_roi));
1106         OCL_ON(cv::magnitude(usrc1_roi, usrc2_roi, udst1_roi));
1107         Near(depth == CV_64F ? 1e-5 : 1e-2);
1108     }
1109 }
1110 
1111 //////////////////////////////// Flip /////////////////////////////////////////////////
1112 
1113 typedef ArithmTestBase Flip;
1114 
OCL_TEST_P(Flip,X)1115 OCL_TEST_P(Flip, X)
1116 {
1117     for (int j = 0; j < test_loop_times; j++)
1118     {
1119         generateTestData();
1120 
1121         OCL_OFF(cv::flip(src1_roi, dst1_roi, 0));
1122         OCL_ON(cv::flip(usrc1_roi, udst1_roi, 0));
1123         Near(0);
1124     }
1125 }
1126 
OCL_TEST_P(Flip,Y)1127 OCL_TEST_P(Flip, Y)
1128 {
1129     for (int j = 0; j < test_loop_times; j++)
1130     {
1131         generateTestData();
1132 
1133         OCL_OFF(cv::flip(src1_roi, dst1_roi, 1));
1134         OCL_ON(cv::flip(usrc1_roi, udst1_roi, 1));
1135         Near(0);
1136     }
1137 }
1138 
OCL_TEST_P(Flip,BOTH)1139 OCL_TEST_P(Flip, BOTH)
1140 {
1141     for (int j = 0; j < test_loop_times; j++)
1142     {
1143         generateTestData();
1144 
1145         OCL_OFF(cv::flip(src1_roi, dst1_roi, -1));
1146         OCL_ON(cv::flip(usrc1_roi, udst1_roi, -1));
1147         Near(0);
1148     }
1149 }
1150 //////////////////////////////////////// minMaxIdx /////////////////////////////////////////
1151 
1152 typedef ArithmTestBase MinMaxIdx;
1153 
OCL_TEST_P(MinMaxIdx,Mat)1154 OCL_TEST_P(MinMaxIdx, Mat)
1155 {
1156     for (int j = 0; j < test_loop_times; j++)
1157     {
1158         generateTestData();
1159 
1160         int p1[2], p2[2], up1[2], up2[2];
1161         double minv, maxv, uminv, umaxv;
1162 
1163         if (cn > 1)
1164         {
1165             OCL_OFF(cv::minMaxIdx(src2_roi, &minv, &maxv) );
1166             OCL_ON(cv::minMaxIdx(usrc2_roi, &uminv, &umaxv));
1167 
1168             EXPECT_DOUBLE_EQ(minv, uminv);
1169             EXPECT_DOUBLE_EQ(maxv, umaxv);
1170         }
1171         else
1172         {
1173             OCL_OFF(cv::minMaxIdx(src2_roi, &minv, &maxv, p1, p2, noArray()));
1174             OCL_ON(cv::minMaxIdx(usrc2_roi, &uminv, &umaxv, up1, up2, noArray()));
1175 
1176             EXPECT_DOUBLE_EQ(minv, uminv);
1177             EXPECT_DOUBLE_EQ(maxv, umaxv);
1178 
1179             for (int i = 0; i < 2; i++)
1180             {
1181                 EXPECT_EQ(p1[i], up1[i]);
1182                 EXPECT_EQ(p2[i], up2[i]);
1183             }
1184         }
1185     }
1186 }
1187 
1188 typedef ArithmTestBase MinMaxIdx_Mask;
1189 
OCL_TEST_P(MinMaxIdx_Mask,Mat)1190 OCL_TEST_P(MinMaxIdx_Mask, Mat)
1191 {
1192     for (int j = 0; j < test_loop_times; j++)
1193     {
1194         generateTestData();
1195 
1196         int p1[2], p2[2], up1[2], up2[2];
1197         double minv, maxv, uminv, umaxv;
1198 
1199         OCL_OFF(cv::minMaxIdx(src2_roi, &minv, &maxv, p1, p2, mask_roi));
1200         OCL_ON(cv::minMaxIdx(usrc2_roi, &uminv, &umaxv, up1, up2, umask_roi));
1201 
1202         EXPECT_DOUBLE_EQ(minv, uminv);
1203         EXPECT_DOUBLE_EQ(maxv, umaxv);
1204         for( int i = 0; i < 2; i++)
1205         {
1206             EXPECT_EQ(p1[i], up1[i]);
1207             EXPECT_EQ(p2[i], up2[i]);
1208         }
1209 
1210     }
1211 }
1212 
1213 //////////////////////////////// Norm /////////////////////////////////////////////////
1214 
relativeError(double actual,double expected,double eps)1215 static bool relativeError(double actual, double expected, double eps)
1216 {
1217     return std::abs(actual - expected) < eps*(1 + std::abs(actual));
1218 }
1219 
1220 typedef ArithmTestBase Norm;
1221 
OCL_TEST_P(Norm,NORM_INF_1arg)1222 OCL_TEST_P(Norm, NORM_INF_1arg)
1223 {
1224     for (int j = 0; j < test_loop_times; j++)
1225     {
1226         generateTestData();
1227 
1228         OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_INF));
1229         OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_INF));
1230 
1231         EXPECT_NEAR(cpuRes, gpuRes, 0.1);
1232     }
1233 }
1234 
OCL_TEST_P(Norm,NORM_INF_1arg_mask)1235 OCL_TEST_P(Norm, NORM_INF_1arg_mask)
1236 {
1237     for (int j = 0; j < test_loop_times; j++)
1238     {
1239         generateTestData();
1240 
1241         OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_INF, mask_roi));
1242         OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_INF, umask_roi));
1243 
1244         EXPECT_NEAR(cpuRes, gpuRes, 0.2);
1245     }
1246 }
1247 
OCL_TEST_P(Norm,NORM_L1_1arg)1248 OCL_TEST_P(Norm, NORM_L1_1arg)
1249 {
1250     for (int j = 0; j < test_loop_times; j++)
1251     {
1252         generateTestData();
1253 
1254         OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L1));
1255         OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L1));
1256 
1257         EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1258     }
1259 }
1260 
OCL_TEST_P(Norm,NORM_L1_1arg_mask)1261 OCL_TEST_P(Norm, NORM_L1_1arg_mask)
1262 {
1263     for (int j = 0; j < test_loop_times; j++)
1264     {
1265         generateTestData();
1266 
1267         OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L1, mask_roi));
1268         OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L1, umask_roi));
1269 
1270         EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1271     }
1272 }
1273 
OCL_TEST_P(Norm,NORM_L2_1arg)1274 OCL_TEST_P(Norm, NORM_L2_1arg)
1275 {
1276     for (int j = 0; j < test_loop_times; j++)
1277     {
1278         generateTestData();
1279 
1280         OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L2));
1281         OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L2));
1282 
1283         EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1284     }
1285 }
1286 
OCL_TEST_P(Norm,NORM_L2_1arg_mask)1287 OCL_TEST_P(Norm, NORM_L2_1arg_mask)
1288 {
1289     for (int j = 0; j < test_loop_times; j++)
1290     {
1291         generateTestData();
1292 
1293         OCL_OFF(const double cpuRes = cv::norm(src1_roi, NORM_L2, mask_roi));
1294         OCL_ON(const double gpuRes = cv::norm(usrc1_roi, NORM_L2, umask_roi));
1295 
1296         EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1297     }
1298 }
1299 
OCL_TEST_P(Norm,NORM_INF_2args)1300 OCL_TEST_P(Norm, NORM_INF_2args)
1301 {
1302     for (int relative = 0; relative < 2; ++relative)
1303         for (int j = 0; j < test_loop_times; j++)
1304         {
1305             generateTestData();
1306 
1307             SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
1308 
1309             int type = NORM_INF;
1310             if (relative == 1)
1311                 type |= NORM_RELATIVE;
1312 
1313             OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type));
1314             OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type));
1315 
1316             EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1317         }
1318 }
1319 
OCL_TEST_P(Norm,NORM_INF_2args_mask)1320 OCL_TEST_P(Norm, NORM_INF_2args_mask)
1321 {
1322     for (int relative = 0; relative < 2; ++relative)
1323         for (int j = 0; j < test_loop_times; j++)
1324         {
1325             generateTestData();
1326 
1327             SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
1328 
1329             int type = NORM_INF;
1330             if (relative == 1)
1331                 type |= NORM_RELATIVE;
1332 
1333             OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type, mask_roi));
1334             OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type, umask_roi));
1335 
1336             EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1337         }
1338 }
1339 
OCL_TEST_P(Norm,NORM_L1_2args)1340 OCL_TEST_P(Norm, NORM_L1_2args)
1341 {
1342     for (int relative = 0; relative < 2; ++relative)
1343         for (int j = 0; j < test_loop_times; j++)
1344         {
1345             generateTestData();
1346 
1347             SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
1348 
1349             int type = NORM_L1;
1350             if (relative == 1)
1351                 type |= NORM_RELATIVE;
1352 
1353             OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type));
1354             OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type));
1355 
1356             EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1357         }
1358 }
1359 
OCL_TEST_P(Norm,NORM_L1_2args_mask)1360 OCL_TEST_P(Norm, NORM_L1_2args_mask)
1361 {
1362     for (int relative = 0; relative < 2; ++relative)
1363         for (int j = 0; j < test_loop_times; j++)
1364         {
1365             generateTestData();
1366 
1367             SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
1368 
1369             int type = NORM_L1;
1370             if (relative == 1)
1371                 type |= NORM_RELATIVE;
1372 
1373             OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type, mask_roi));
1374             OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type, umask_roi));
1375 
1376             EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1377         }
1378 }
1379 
OCL_TEST_P(Norm,NORM_L2_2args)1380 OCL_TEST_P(Norm, NORM_L2_2args)
1381 {
1382     for (int relative = 0; relative < 2; ++relative)
1383         for (int j = 0; j < test_loop_times; j++)
1384         {
1385             generateTestData();
1386 
1387             SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
1388 
1389             int type = NORM_L2;
1390             if (relative == 1)
1391                 type |= NORM_RELATIVE;
1392 
1393             OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type));
1394             OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type));
1395 
1396             EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1397         }
1398 }
1399 
OCL_TEST_P(Norm,NORM_L2_2args_mask)1400 OCL_TEST_P(Norm, NORM_L2_2args_mask)
1401 {
1402     for (int relative = 0; relative < 2; ++relative)
1403         for (int j = 0; j < test_loop_times; j++)
1404         {
1405             generateTestData();
1406 
1407             SCOPED_TRACE(relative ? "NORM_RELATIVE" : "");
1408 
1409             int type = NORM_L2;
1410             if (relative == 1)
1411                 type |= NORM_RELATIVE;
1412 
1413             OCL_OFF(const double cpuRes = cv::norm(src1_roi, src2_roi, type, mask_roi));
1414             OCL_ON(const double gpuRes = cv::norm(usrc1_roi, usrc2_roi, type, umask_roi));
1415 
1416             EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1417         }
1418 }
1419 
1420 //////////////////////////////// UMat::dot ////////////////////////////////////////////////
1421 
1422 typedef ArithmTestBase UMatDot;
1423 
OCL_TEST_P(UMatDot,Mat)1424 OCL_TEST_P(UMatDot, Mat)
1425 {
1426     for (int j = 0; j < test_loop_times; j++)
1427     {
1428         generateTestData();
1429 
1430         OCL_OFF(const double cpuRes = src1_roi.dot(src2_roi));
1431         OCL_ON(const double gpuRes = usrc1_roi.dot(usrc2_roi));
1432 
1433         EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-5);
1434     }
1435 }
1436 
1437 //////////////////////////////// Sqrt ////////////////////////////////////////////////
1438 
1439 typedef ArithmTestBase Sqrt;
1440 
OCL_TEST_P(Sqrt,Mat)1441 OCL_TEST_P(Sqrt, Mat)
1442 {
1443     for (int j = 0; j < test_loop_times; j++)
1444     {
1445         generateTestData();
1446 
1447         OCL_OFF(cv::sqrt(src1_roi, dst1_roi));
1448         OCL_ON(cv::sqrt(usrc1_roi, udst1_roi));
1449 
1450         Near(1);
1451     }
1452 }
1453 
1454 //////////////////////////////// Normalize ////////////////////////////////////////////////
1455 
1456 typedef ArithmTestBase Normalize;
1457 
OCL_TEST_P(Normalize,Mat)1458 OCL_TEST_P(Normalize, Mat)
1459 {
1460     static int modes[] = { CV_MINMAX, CV_L2, CV_L1, CV_C };
1461 
1462     for (int j = 0; j < test_loop_times; j++)
1463     {
1464         generateTestData();
1465 
1466         for (int i = 0, size = sizeof(modes) / sizeof(modes[0]); i < size; ++i)
1467         {
1468             OCL_OFF(cv::normalize(src1_roi, dst1_roi, 10, 110, modes[i], src1_roi.type(), mask_roi));
1469             OCL_ON(cv::normalize(usrc1_roi, udst1_roi, 10, 110, modes[i], src1_roi.type(), umask_roi));
1470 
1471             Near(1);
1472         }
1473     }
1474 }
1475 
1476 //////////////////////////////////////// InRange ///////////////////////////////////////////////
1477 
PARAM_TEST_CASE(InRange,MatDepth,Channels,bool,bool)1478 PARAM_TEST_CASE(InRange, MatDepth, Channels, bool /*Scalar or not*/, bool /*Roi*/)
1479 {
1480     int depth;
1481     int cn;
1482     bool scalars, use_roi;
1483     cv::Scalar val1, val2;
1484 
1485     TEST_DECLARE_INPUT_PARAMETER(src1);
1486     TEST_DECLARE_INPUT_PARAMETER(src2);
1487     TEST_DECLARE_INPUT_PARAMETER(src3);
1488     TEST_DECLARE_OUTPUT_PARAMETER(dst);
1489 
1490     virtual void SetUp()
1491     {
1492         depth = GET_PARAM(0);
1493         cn = GET_PARAM(1);
1494         scalars = GET_PARAM(2);
1495         use_roi = GET_PARAM(3);
1496     }
1497 
1498     virtual void generateTestData()
1499     {
1500         const int type = CV_MAKE_TYPE(depth, cn);
1501 
1502         Size roiSize = randomSize(1, MAX_VALUE);
1503         Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
1504         randomSubMat(src1, src1_roi, roiSize, src1Border, type, -40, 40);
1505 
1506         Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
1507         randomSubMat(src2, src2_roi, roiSize, src2Border, type, -40, 40);
1508 
1509         Border src3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
1510         randomSubMat(src3, src3_roi, roiSize, src3Border, type, -40, 40);
1511 
1512         Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
1513         randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_8UC1, 5, 16);
1514 
1515         val1 = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
1516                           rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
1517         val2 = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
1518                           rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
1519 
1520         UMAT_UPLOAD_INPUT_PARAMETER(src1);
1521         UMAT_UPLOAD_INPUT_PARAMETER(src2);
1522         UMAT_UPLOAD_INPUT_PARAMETER(src3);
1523         UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
1524     }
1525 
1526     void Near()
1527     {
1528         OCL_EXPECT_MATS_NEAR(dst, 0);
1529     }
1530 };
1531 
OCL_TEST_P(InRange,Mat)1532 OCL_TEST_P(InRange, Mat)
1533 {
1534     for (int j = 0; j < test_loop_times; j++)
1535     {
1536         generateTestData();
1537 
1538         OCL_OFF(cv::inRange(src1_roi, src2_roi, src3_roi, dst_roi));
1539         OCL_ON(cv::inRange(usrc1_roi, usrc2_roi, usrc3_roi, udst_roi));
1540 
1541         Near();
1542     }
1543 }
1544 
OCL_TEST_P(InRange,Scalar)1545 OCL_TEST_P(InRange, Scalar)
1546 {
1547     for (int j = 0; j < test_loop_times; j++)
1548     {
1549         generateTestData();
1550 
1551         OCL_OFF(cv::inRange(src1_roi, val1, val2, dst_roi));
1552         OCL_ON(cv::inRange(usrc1_roi, val1, val2, udst_roi));
1553 
1554         Near();
1555     }
1556 }
1557 
1558 //////////////////////////////// ConvertScaleAbs ////////////////////////////////////////////////
1559 
PARAM_TEST_CASE(ConvertScaleAbs,MatDepth,Channels,bool)1560 PARAM_TEST_CASE(ConvertScaleAbs, MatDepth, Channels, bool)
1561 {
1562     int depth;
1563     int cn;
1564     bool use_roi;
1565     cv::Scalar val;
1566 
1567     TEST_DECLARE_INPUT_PARAMETER(src);
1568     TEST_DECLARE_OUTPUT_PARAMETER(dst);
1569 
1570     virtual void SetUp()
1571     {
1572         depth = GET_PARAM(0);
1573         cn = GET_PARAM(1);
1574         use_roi = GET_PARAM(2);
1575     }
1576 
1577     virtual void generateTestData()
1578     {
1579         const int stype = CV_MAKE_TYPE(depth, cn);
1580         const int dtype = CV_MAKE_TYPE(CV_8U, cn);
1581 
1582         Size roiSize = randomSize(1, MAX_VALUE);
1583         Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
1584         randomSubMat(src, src_roi, roiSize, srcBorder, stype, -11, 11); // FIXIT: Test with minV, maxV
1585 
1586         Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
1587         randomSubMat(dst, dst_roi, roiSize, dstBorder, dtype, 5, 16);
1588 
1589         val = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
1590                          rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
1591 
1592         UMAT_UPLOAD_INPUT_PARAMETER(src);
1593         UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
1594     }
1595 
1596     void Near(double threshold = 0.)
1597     {
1598         OCL_EXPECT_MATS_NEAR(dst, threshold);
1599     }
1600 
1601 };
1602 
1603 
OCL_TEST_P(ConvertScaleAbs,Mat)1604 OCL_TEST_P(ConvertScaleAbs, Mat)
1605 {
1606     for (int j = 0; j < test_loop_times; j++)
1607     {
1608         generateTestData();
1609 
1610         OCL_OFF(cv::convertScaleAbs(src_roi, dst_roi, val[0], val[1]));
1611         OCL_ON(cv::convertScaleAbs(usrc_roi, udst_roi, val[0], val[1]));
1612 
1613         Near(1);
1614     }
1615 }
1616 
1617 //////////////////////////////// ScaleAdd ////////////////////////////////////////////////
1618 
1619 typedef ArithmTestBase ScaleAdd;
1620 
OCL_TEST_P(ScaleAdd,Mat)1621 OCL_TEST_P(ScaleAdd, Mat)
1622 {
1623     for (int j = 0; j < test_loop_times; j++)
1624     {
1625         generateTestData();
1626 
1627         OCL_OFF(cv::scaleAdd(src1_roi, val[0], src2_roi, dst1_roi));
1628         OCL_ON(cv::scaleAdd(usrc1_roi, val[0], usrc2_roi, udst1_roi));
1629 
1630         Near(depth <= CV_32S ? 1 : 1e-3);
1631     }
1632 }
1633 
1634 //////////////////////////////// PatchNans ////////////////////////////////////////////////
1635 
PARAM_TEST_CASE(PatchNaNs,Channels,bool)1636 PARAM_TEST_CASE(PatchNaNs, Channels, bool)
1637 {
1638     int cn;
1639     bool use_roi;
1640     double value;
1641 
1642     TEST_DECLARE_INPUT_PARAMETER(src);
1643 
1644     virtual void SetUp()
1645     {
1646         cn = GET_PARAM(0);
1647         use_roi = GET_PARAM(1);
1648     }
1649 
1650     virtual void generateTestData()
1651     {
1652         const int type = CV_MAKE_TYPE(CV_32F, cn);
1653 
1654         Size roiSize = randomSize(1, 10);
1655         Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
1656         randomSubMat(src, src_roi, roiSize, srcBorder, type, -40, 40);
1657 
1658         // generating NaNs
1659         roiSize.width *= cn;
1660         for (int y = 0; y < roiSize.height; ++y)
1661         {
1662             float * const ptr = src_roi.ptr<float>(y);
1663             for (int x = 0; x < roiSize.width; ++x)
1664                 ptr[x] = randomInt(-1, 1) == 0 ? std::numeric_limits<float>::quiet_NaN() : ptr[x];
1665         }
1666 
1667         value = randomDouble(-100, 100);
1668 
1669         UMAT_UPLOAD_INPUT_PARAMETER(src);
1670     }
1671 
1672     void Near()
1673     {
1674         OCL_EXPECT_MATS_NEAR(src, 0);
1675     }
1676 };
1677 
OCL_TEST_P(PatchNaNs,Mat)1678 OCL_TEST_P(PatchNaNs, Mat)
1679 {
1680     for (int j = 0; j < test_loop_times; j++)
1681     {
1682         generateTestData();
1683 
1684         OCL_OFF(cv::patchNaNs(src_roi, value));
1685         OCL_ON(cv::patchNaNs(usrc_roi, value));
1686 
1687         Near();
1688     }
1689 }
1690 
1691 //////////////////////////////// Psnr ////////////////////////////////////////////////
1692 
1693 typedef ArithmTestBase Psnr;
1694 
OCL_TEST_P(Psnr,Mat)1695 OCL_TEST_P(Psnr, Mat)
1696 {
1697     for (int j = 0; j < test_loop_times; j++)
1698     {
1699         generateTestData();
1700 
1701         double cpuRes = 0, gpuRes = 0;
1702 
1703         OCL_OFF(cpuRes = cv::PSNR(src1_roi, src2_roi));
1704         OCL_ON(gpuRes = cv::PSNR(usrc1_roi, usrc2_roi));
1705 
1706         EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6);
1707     }
1708 }
1709 
1710 //////////////////////////////////////// Reduce /////////////////////////////////////////////
1711 
PARAM_TEST_CASE(Reduce,std::pair<MatDepth,MatDepth>,Channels,int,bool)1712 PARAM_TEST_CASE(Reduce, std::pair<MatDepth, MatDepth>, Channels, int, bool)
1713 {
1714     int sdepth, ddepth, cn, dim, dtype;
1715     bool use_roi;
1716 
1717     TEST_DECLARE_INPUT_PARAMETER(src);
1718     TEST_DECLARE_OUTPUT_PARAMETER(dst);
1719 
1720     virtual void SetUp()
1721     {
1722         const std::pair<MatDepth, MatDepth> p = GET_PARAM(0);
1723         sdepth = p.first;
1724         ddepth = p.second;
1725         cn = GET_PARAM(1);
1726         dim = GET_PARAM(2);
1727         use_roi = GET_PARAM(3);
1728     }
1729 
1730     virtual void generateTestData()
1731     {
1732         const int stype = CV_MAKE_TYPE(sdepth, cn);
1733         dtype = CV_MAKE_TYPE(ddepth, cn);
1734 
1735         Size roiSize = randomSize(1, MAX_VALUE);
1736         Border srcBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
1737         randomSubMat(src, src_roi, roiSize, srcBorder, stype, -40, 40);
1738 
1739         Size dstRoiSize = Size(dim == 0 ? roiSize.width : 1, dim == 0 ? 1 : roiSize.height);
1740         Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
1741         randomSubMat(dst, dst_roi, dstRoiSize, dstBorder, dtype, 5, 16);
1742 
1743         UMAT_UPLOAD_INPUT_PARAMETER(src);
1744         UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
1745     }
1746 };
1747 
1748 typedef Reduce ReduceSum;
1749 
OCL_TEST_P(ReduceSum,Mat)1750 OCL_TEST_P(ReduceSum, Mat)
1751 {
1752     for (int j = 0; j < test_loop_times; j++)
1753     {
1754         generateTestData();
1755 
1756         OCL_OFF(cv::reduce(src_roi, dst_roi, dim, CV_REDUCE_SUM, dtype));
1757         OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_SUM, dtype));
1758 
1759         double eps = ddepth <= CV_32S ? 1 : 7e-4;
1760         OCL_EXPECT_MATS_NEAR(dst, eps);
1761     }
1762 }
1763 
1764 typedef Reduce ReduceMax;
1765 
OCL_TEST_P(ReduceMax,Mat)1766 OCL_TEST_P(ReduceMax, Mat)
1767 {
1768     for (int j = 0; j < test_loop_times; j++)
1769     {
1770         generateTestData();
1771 
1772         OCL_OFF(cv::reduce(src_roi, dst_roi, dim, CV_REDUCE_MAX, dtype));
1773         OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_MAX, dtype));
1774 
1775         OCL_EXPECT_MATS_NEAR(dst, 0);
1776     }
1777 }
1778 
1779 typedef Reduce ReduceMin;
1780 
OCL_TEST_P(ReduceMin,Mat)1781 OCL_TEST_P(ReduceMin, Mat)
1782 {
1783     for (int j = 0; j < test_loop_times; j++)
1784     {
1785         generateTestData();
1786 
1787         OCL_OFF(cv::reduce(src_roi, dst_roi, dim, CV_REDUCE_MIN, dtype));
1788         OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_MIN, dtype));
1789 
1790         OCL_EXPECT_MATS_NEAR(dst, 0);
1791     }
1792 }
1793 
1794 typedef Reduce ReduceAvg;
1795 
OCL_TEST_P(ReduceAvg,Mat)1796 OCL_TEST_P(ReduceAvg, Mat)
1797 {
1798     for (int j = 0; j < test_loop_times; j++)
1799     {
1800         generateTestData();
1801 
1802         OCL_OFF(cv::reduce(src_roi, dst_roi, dim, CV_REDUCE_AVG, dtype));
1803         OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_AVG, dtype));
1804 
1805         double eps = ddepth <= CV_32S ? 1 : 6e-6;
1806         OCL_EXPECT_MATS_NEAR(dst, eps);
1807     }
1808 }
1809 
1810 //////////////////////////////////////// Instantiation /////////////////////////////////////////
1811 
1812 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine(::testing::Values(CV_8U, CV_8S), OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool()));
1813 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Add, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1814 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Subtract, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1815 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Mul, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1816 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Div, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1817 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Min, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1818 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Max, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1819 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Absdiff, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1820 OCL_INSTANTIATE_TEST_CASE_P(Arithm, CartToPolar, Combine(testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1821 OCL_INSTANTIATE_TEST_CASE_P(Arithm, PolarToCart, Combine(testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1822 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Transpose, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1823 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_and, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1824 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_not, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1825 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_xor, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1826 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_or, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1827 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Pow, Combine(testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1828 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Compare, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1829 OCL_INSTANTIATE_TEST_CASE_P(Arithm, AddWeighted, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1830 OCL_INSTANTIATE_TEST_CASE_P(Arithm, SetIdentity, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1831 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Repeat, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1832 OCL_INSTANTIATE_TEST_CASE_P(Arithm, CountNonZero, Combine(OCL_ALL_DEPTHS, testing::Values(Channels(1)), Bool()));
1833 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Sum, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1834 OCL_INSTANTIATE_TEST_CASE_P(Arithm, MeanStdDev, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1835 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Log, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1836 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Exp, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1837 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1838 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Magnitude, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1839 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Flip, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1840 OCL_INSTANTIATE_TEST_CASE_P(Arithm, MinMaxIdx, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1841 OCL_INSTANTIATE_TEST_CASE_P(Arithm, MinMaxIdx_Mask, Combine(OCL_ALL_DEPTHS, ::testing::Values(Channels(1)), Bool()));
1842 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Norm, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1843 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Sqrt, Combine(::testing::Values(CV_32F, CV_64F), OCL_ALL_CHANNELS, Bool()));
1844 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Normalize, Combine(OCL_ALL_DEPTHS, Values(Channels(1)), Bool()));
1845 OCL_INSTANTIATE_TEST_CASE_P(Arithm, InRange, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool()));
1846 OCL_INSTANTIATE_TEST_CASE_P(Arithm, ConvertScaleAbs, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1847 OCL_INSTANTIATE_TEST_CASE_P(Arithm, ScaleAdd, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1848 OCL_INSTANTIATE_TEST_CASE_P(Arithm, PatchNaNs, Combine(OCL_ALL_CHANNELS, Bool()));
1849 OCL_INSTANTIATE_TEST_CASE_P(Arithm, Psnr, Combine(::testing::Values((MatDepth)CV_8U), OCL_ALL_CHANNELS, Bool()));
1850 OCL_INSTANTIATE_TEST_CASE_P(Arithm, UMatDot, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
1851 
1852 OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceSum, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32S),
1853                                                                        std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32F),
1854                                                                        std::make_pair<MatDepth, MatDepth>(CV_8U, CV_64F),
1855                                                                        std::make_pair<MatDepth, MatDepth>(CV_16U, CV_32F),
1856                                                                        std::make_pair<MatDepth, MatDepth>(CV_16U, CV_64F),
1857                                                                        std::make_pair<MatDepth, MatDepth>(CV_16S, CV_32F),
1858                                                                        std::make_pair<MatDepth, MatDepth>(CV_16S, CV_64F),
1859                                                                        std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
1860                                                                        std::make_pair<MatDepth, MatDepth>(CV_32F, CV_64F),
1861                                                                        std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
1862                                                        OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
1863 OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceAvg, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32S),
1864                                                                        std::make_pair<MatDepth, MatDepth>(CV_8U, CV_32F),
1865                                                                        std::make_pair<MatDepth, MatDepth>(CV_8U, CV_64F),
1866                                                                        std::make_pair<MatDepth, MatDepth>(CV_16U, CV_32F),
1867                                                                        std::make_pair<MatDepth, MatDepth>(CV_16U, CV_64F),
1868                                                                        std::make_pair<MatDepth, MatDepth>(CV_16S, CV_32F),
1869                                                                        std::make_pair<MatDepth, MatDepth>(CV_16S, CV_64F),
1870                                                                        std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
1871                                                                        std::make_pair<MatDepth, MatDepth>(CV_32F, CV_64F),
1872                                                                        std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
1873                                                        OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
1874 OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceMax, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_8U),
1875                                                                        std::make_pair<MatDepth, MatDepth>(CV_16U, CV_16U),
1876                                                                        std::make_pair<MatDepth, MatDepth>(CV_16S, CV_16S),
1877                                                                        std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
1878                                                                        std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
1879                                                        OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
1880 OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceMin, Combine(testing::Values(std::make_pair<MatDepth, MatDepth>(CV_8U, CV_8U),
1881                                                                        std::make_pair<MatDepth, MatDepth>(CV_16U, CV_16U),
1882                                                                        std::make_pair<MatDepth, MatDepth>(CV_16S, CV_16S),
1883                                                                        std::make_pair<MatDepth, MatDepth>(CV_32F, CV_32F),
1884                                                                        std::make_pair<MatDepth, MatDepth>(CV_64F, CV_64F)),
1885                                                        OCL_ALL_CHANNELS, testing::Values(0, 1), Bool()));
1886 
1887 
1888 } } // namespace cvtest::ocl
1889 
1890 #endif // HAVE_OPENCL
1891