1 /*M///////////////////////////////////////////////////////////////////////////////////////
3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
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.
11 // For Open Source Computer Vision Library
13 // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved.
14 // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
15 // Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
16 // Third party copyrights are property of their respective owners.
19 // Niko Li, newlife20080214@gmail.com
20 // Jia Haipeng, jiahaipeng95@gmail.com
21 // Zero Lin, Zero.Lin@amd.com
22 // Zhang Ying, zhangying913@gmail.com
23 // Yao Wang, bitwangyaoyao@gmail.com
25 // Redistribution and use in source and binary forms, with or without modification,
26 // are permitted provided that the following conditions are met:
28 // * Redistribution's of source code must retain the above copyright notice,
29 // this list of conditions and the following disclaimer.
31 // * Redistribution's in binary form must reproduce the above copyright notice,
32 // this list of conditions and the following disclaimer in the documentation
33 // and/or other materials provided with the distribution.
35 // * The name of the copyright holders may not be used to endorse or promote products
36 // derived from this software without specific prior written permission.
38 // This software is provided by the copyright holders and contributors "as is" and
39 // any express or implied warranties, including, but not limited to, the implied
40 // warranties of merchantability and fitness for a particular purpose are disclaimed.
41 // In no event shall the Intel Corporation or contributors be liable for any direct,
42 // indirect, incidental, special, exemplary, or consequential damages
43 // (including, but not limited to, procurement of substitute goods or services;
44 // loss of use, data, or profits; or business interruption) however caused
45 // and on any theory of liability, whether in contract, strict liability,
46 // or tort (including negligence or otherwise) arising in any way out of
47 // the use of this software, even if advised of the possibility of such damage.
51 #include "../test_precomp.hpp"
53 #include "opencv2/ts/ocl_test.hpp"
60 PARAM_TEST_CASE(FilterTestBase, MatType,
63 BorderType, // border type
64 double, // optional parameter
66 int) // width multiplier
68 int type, borderType, ksize;
74 TEST_DECLARE_INPUT_PARAMETER(src);
75 TEST_DECLARE_OUTPUT_PARAMETER(dst);
82 borderType = GET_PARAM(3);
84 useRoi = GET_PARAM(5);
85 widthMultiple = GET_PARAM(6);
88 void random_roi(int minSize = 1)
93 Size roiSize = randomSize(minSize, MAX_VALUE);
94 roiSize.width &= ~((widthMultiple * 2) - 1);
95 roiSize.width += widthMultiple;
97 Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
98 randomSubMat(src, src_roi, roiSize, srcBorder, type, 5, 256);
100 Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
101 randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -60, 70);
103 UMAT_UPLOAD_INPUT_PARAMETER(src);
104 UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
109 int depth = CV_MAT_DEPTH(type);
110 bool isFP = depth >= CV_32F;
118 void Near(double threshold, bool relative)
121 OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
123 OCL_EXPECT_MATS_NEAR(dst, threshold);
127 ////////////////////////////////////////////////////////////////////////////////////////////////////
130 typedef FilterTestBase Bilateral;
132 OCL_TEST_P(Bilateral, Mat)
134 for (int j = 0; j < test_loop_times; j++)
138 double sigmacolor = rng.uniform(20, 100);
139 double sigmaspace = rng.uniform(10, 40);
141 OCL_OFF(cv::bilateralFilter(src_roi, dst_roi, ksize, sigmacolor, sigmaspace, borderType));
142 OCL_ON(cv::bilateralFilter(usrc_roi, udst_roi, ksize, sigmacolor, sigmaspace, borderType));
148 /////////////////////////////////////////////////////////////////////////////////////////////////
151 typedef FilterTestBase LaplacianTest;
153 OCL_TEST_P(LaplacianTest, Accuracy)
155 double scale = param;
157 for (int j = 0; j < test_loop_times; j++)
161 OCL_OFF(cv::Laplacian(src_roi, dst_roi, -1, ksize, scale, 10, borderType));
162 OCL_ON(cv::Laplacian(usrc_roi, udst_roi, -1, ksize, scale, 10, borderType));
168 PARAM_TEST_CASE(Deriv3x3_cols16_rows2_Base, MatType,
171 BorderType, // border type
172 double, // optional parameter
174 int) // width multiplier
176 int type, borderType, ksize;
182 TEST_DECLARE_INPUT_PARAMETER(src);
183 TEST_DECLARE_OUTPUT_PARAMETER(dst);
188 ksize = GET_PARAM(1);
190 borderType = GET_PARAM(3);
191 param = GET_PARAM(4);
192 useRoi = GET_PARAM(5);
193 widthMultiple = GET_PARAM(6);
200 Size roiSize = randomSize(size.width, MAX_VALUE, size.height, MAX_VALUE);
201 roiSize.width = std::max(size.width + 13, roiSize.width & (~0xf));
202 roiSize.height = std::max(size.height + 1, roiSize.height & (~0x1));
204 Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
205 randomSubMat(src, src_roi, roiSize, srcBorder, type, 5, 256);
207 Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
208 randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -60, 70);
210 UMAT_UPLOAD_INPUT_PARAMETER(src);
211 UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
219 void Near(double threshold, bool relative)
222 OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
224 OCL_EXPECT_MATS_NEAR(dst, threshold);
228 typedef Deriv3x3_cols16_rows2_Base Laplacian3_cols16_rows2;
230 OCL_TEST_P(Laplacian3_cols16_rows2, Accuracy)
232 double scale = param;
234 for (int j = 0; j < test_loop_times; j++)
238 OCL_OFF(cv::Laplacian(src_roi, dst_roi, -1, ksize, scale, 10, borderType));
239 OCL_ON(cv::Laplacian(usrc_roi, udst_roi, -1, ksize, scale, 10, borderType));
246 /////////////////////////////////////////////////////////////////////////////////////////////////
249 typedef FilterTestBase SobelTest;
251 OCL_TEST_P(SobelTest, Mat)
253 int dx = size.width, dy = size.height;
254 double scale = param;
256 for (int j = 0; j < test_loop_times; j++)
260 OCL_OFF(cv::Sobel(src_roi, dst_roi, -1, dx, dy, ksize, scale, /* delta */0, borderType));
261 OCL_ON(cv::Sobel(usrc_roi, udst_roi, -1, dx, dy, ksize, scale, /* delta */0, borderType));
267 typedef Deriv3x3_cols16_rows2_Base Sobel3x3_cols16_rows2;
269 OCL_TEST_P(Sobel3x3_cols16_rows2, Mat)
271 int dx = size.width, dy = size.height;
272 double scale = param;
274 for (int j = 0; j < test_loop_times; j++)
278 OCL_OFF(cv::Sobel(src_roi, dst_roi, -1, dx, dy, ksize, scale, /* delta */0, borderType));
279 OCL_ON(cv::Sobel(usrc_roi, udst_roi, -1, dx, dy, ksize, scale, /* delta */0, borderType));
285 /////////////////////////////////////////////////////////////////////////////////////////////////
288 typedef FilterTestBase ScharrTest;
290 OCL_TEST_P(ScharrTest, Mat)
292 int dx = size.width, dy = size.height;
293 double scale = param;
295 for (int j = 0; j < test_loop_times; j++)
299 OCL_OFF(cv::Scharr(src_roi, dst_roi, -1, dx, dy, scale, /* delta */ 0, borderType));
300 OCL_ON(cv::Scharr(usrc_roi, udst_roi, -1, dx, dy, scale, /* delta */ 0, borderType));
306 typedef Deriv3x3_cols16_rows2_Base Scharr3x3_cols16_rows2;
308 OCL_TEST_P(Scharr3x3_cols16_rows2, Mat)
310 int dx = size.width, dy = size.height;
311 double scale = param;
313 for (int j = 0; j < test_loop_times; j++)
317 OCL_OFF(cv::Scharr(src_roi, dst_roi, -1, dx, dy, scale, /* delta */ 0, borderType));
318 OCL_ON(cv::Scharr(usrc_roi, udst_roi, -1, dx, dy, scale, /* delta */ 0, borderType));
324 /////////////////////////////////////////////////////////////////////////////////////////////////
327 typedef FilterTestBase GaussianBlurTest;
329 OCL_TEST_P(GaussianBlurTest, Mat)
331 for (int j = 0; j < test_loop_times + 1; j++)
335 double sigma1 = rng.uniform(0.1, 1.0);
336 double sigma2 = j % 2 == 0 ? sigma1 : rng.uniform(0.1, 1.0);
338 OCL_OFF(cv::GaussianBlur(src_roi, dst_roi, Size(ksize, ksize), sigma1, sigma2, borderType));
339 OCL_ON(cv::GaussianBlur(usrc_roi, udst_roi, Size(ksize, ksize), sigma1, sigma2, borderType));
341 Near(CV_MAT_DEPTH(type) >= CV_32F ? 1e-3 : 4, CV_MAT_DEPTH(type) >= CV_32F);
345 PARAM_TEST_CASE(GaussianBlur_multicols_Base, MatType,
348 BorderType, // border type
349 double, // optional parameter
351 int) // width multiplier
353 int type, borderType, ksize;
359 TEST_DECLARE_INPUT_PARAMETER(src);
360 TEST_DECLARE_OUTPUT_PARAMETER(dst);
365 ksize = GET_PARAM(1);
367 borderType = GET_PARAM(3);
368 param = GET_PARAM(4);
369 useRoi = GET_PARAM(5);
370 widthMultiple = GET_PARAM(6);
375 size = Size(ksize, ksize);
377 Size roiSize = randomSize(size.width, MAX_VALUE, size.height, MAX_VALUE);
380 roiSize.width = std::max((size.width + 15) & 0x10, roiSize.width & (~0xf));
381 roiSize.height = std::max(size.height + 1, roiSize.height & (~0x1));
385 roiSize.width = std::max((size.width + 3) & 0x4, roiSize.width & (~0x3));
388 Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
389 randomSubMat(src, src_roi, roiSize, srcBorder, type, 5, 256);
391 Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
392 randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -60, 70);
394 UMAT_UPLOAD_INPUT_PARAMETER(src);
395 UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
403 void Near(double threshold, bool relative)
406 OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
408 OCL_EXPECT_MATS_NEAR(dst, threshold);
412 typedef GaussianBlur_multicols_Base GaussianBlur_multicols;
414 OCL_TEST_P(GaussianBlur_multicols, Mat)
416 Size kernelSize(ksize, ksize);
418 for (int j = 0; j < test_loop_times; j++)
422 double sigma1 = rng.uniform(0.1, 1.0);
423 double sigma2 = j % 2 == 0 ? sigma1 : rng.uniform(0.1, 1.0);
425 OCL_OFF(cv::GaussianBlur(src_roi, dst_roi, Size(ksize, ksize), sigma1, sigma2, borderType));
426 OCL_ON(cv::GaussianBlur(usrc_roi, udst_roi, Size(ksize, ksize), sigma1, sigma2, borderType));
428 Near(CV_MAT_DEPTH(type) >= CV_32F ? 1e-3 : 4, CV_MAT_DEPTH(type) >= CV_32F);
432 /////////////////////////////////////////////////////////////////////////////////////////////////
435 typedef FilterTestBase Erode;
437 OCL_TEST_P(Erode, Mat)
439 Size kernelSize(ksize, ksize);
440 int iterations = (int)param;
442 for (int j = 0; j < test_loop_times; j++)
445 Mat kernel = ksize==0 ? Mat() : randomMat(kernelSize, CV_8UC1, 0, 3);
447 OCL_OFF(cv::erode(src_roi, dst_roi, kernel, Point(-1, -1), iterations) );
448 OCL_ON(cv::erode(usrc_roi, udst_roi, kernel, Point(-1, -1), iterations) );
454 /////////////////////////////////////////////////////////////////////////////////////////////////
457 typedef FilterTestBase Dilate;
459 OCL_TEST_P(Dilate, Mat)
461 Size kernelSize(ksize, ksize);
462 int iterations = (int)param;
464 for (int j = 0; j < test_loop_times; j++)
467 Mat kernel = ksize==0 ? Mat() : randomMat(kernelSize, CV_8UC1, 0, 3);
469 OCL_OFF(cv::dilate(src_roi, dst_roi, kernel, Point(-1, -1), iterations) );
470 OCL_ON(cv::dilate(usrc_roi, udst_roi, kernel, Point(-1, -1), iterations) );
476 PARAM_TEST_CASE(MorphFilter3x3_cols16_rows2_Base, MatType,
479 BorderType, // border type
480 double, // optional parameter
482 int) // width multiplier
484 int type, borderType, ksize;
490 TEST_DECLARE_INPUT_PARAMETER(src);
491 TEST_DECLARE_OUTPUT_PARAMETER(dst);
496 ksize = GET_PARAM(1);
498 borderType = GET_PARAM(3);
499 param = GET_PARAM(4);
500 useRoi = GET_PARAM(5);
501 widthMultiple = GET_PARAM(6);
508 Size roiSize = randomSize(size.width, MAX_VALUE, size.height, MAX_VALUE);
509 roiSize.width = std::max(size.width + 13, roiSize.width & (~0xf));
510 roiSize.height = std::max(size.height + 1, roiSize.height & (~0x1));
512 Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
513 randomSubMat(src, src_roi, roiSize, srcBorder, type, 5, 256);
515 Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
516 randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -60, 70);
518 UMAT_UPLOAD_INPUT_PARAMETER(src);
519 UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
527 void Near(double threshold, bool relative)
530 OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
532 OCL_EXPECT_MATS_NEAR(dst, threshold);
536 typedef MorphFilter3x3_cols16_rows2_Base MorphFilter3x3_cols16_rows2;
538 OCL_TEST_P(MorphFilter3x3_cols16_rows2, Mat)
540 Size kernelSize(ksize, ksize);
541 int iterations = (int)param;
543 for (int j = 0; j < test_loop_times; j++)
546 Mat kernel = ksize==0 ? Mat() : randomMat(kernelSize, CV_8UC1, 0, 3);
548 OCL_OFF(cv::dilate(src_roi, dst_roi, kernel, Point(-1, -1), iterations) );
549 OCL_ON(cv::dilate(usrc_roi, udst_roi, kernel, Point(-1, -1), iterations) );
555 /////////////////////////////////////////////////////////////////////////////////////////////////
557 IMPLEMENT_PARAM_CLASS(MorphOp, int)
558 PARAM_TEST_CASE(MorphologyEx, MatType,
564 int type, ksize, op, iterations;
567 TEST_DECLARE_INPUT_PARAMETER(src);
568 TEST_DECLARE_OUTPUT_PARAMETER(dst);
573 ksize = GET_PARAM(1);
575 iterations = GET_PARAM(3);
576 useRoi = GET_PARAM(4);
579 void random_roi(int minSize = 1)
584 Size roiSize = randomSize(minSize, MAX_VALUE);
586 Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
587 randomSubMat(src, src_roi, roiSize, srcBorder, type, 5, 256);
589 Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
590 randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -60, 70);
592 UMAT_UPLOAD_INPUT_PARAMETER(src);
593 UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
598 int depth = CV_MAT_DEPTH(type);
599 bool isFP = depth >= CV_32F;
607 void Near(double threshold, bool relative)
610 OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
612 OCL_EXPECT_MATS_NEAR(dst, threshold);
616 OCL_TEST_P(MorphologyEx, Mat)
618 Size kernelSize(ksize, ksize);
620 for (int j = 0; j < test_loop_times; j++)
623 Mat kernel = randomMat(kernelSize, CV_8UC1, 0, 3);
625 OCL_OFF(cv::morphologyEx(src_roi, dst_roi, op, kernel, Point(-1, -1), iterations) );
626 OCL_ON(cv::morphologyEx(usrc_roi, udst_roi, op, kernel, Point(-1, -1), iterations) );
632 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
634 #define FILTER_BORDER_SET_NO_ISOLATED \
635 Values((BorderType)BORDER_CONSTANT, (BorderType)BORDER_REPLICATE, (BorderType)BORDER_REFLECT, (BorderType)BORDER_WRAP, (BorderType)BORDER_REFLECT_101/*, \
636 (int)BORDER_CONSTANT|BORDER_ISOLATED, (int)BORDER_REPLICATE|BORDER_ISOLATED, \
637 (int)BORDER_REFLECT|BORDER_ISOLATED, (int)BORDER_WRAP|BORDER_ISOLATED, \
638 (int)BORDER_REFLECT_101|BORDER_ISOLATED*/) // WRAP and ISOLATED are not supported by cv:: version
640 #define FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED \
641 Values((BorderType)BORDER_CONSTANT, (BorderType)BORDER_REPLICATE, (BorderType)BORDER_REFLECT, /*(int)BORDER_WRAP,*/ (BorderType)BORDER_REFLECT_101/*, \
642 (int)BORDER_CONSTANT|BORDER_ISOLATED, (int)BORDER_REPLICATE|BORDER_ISOLATED, \
643 (int)BORDER_REFLECT|BORDER_ISOLATED, (int)BORDER_WRAP|BORDER_ISOLATED, \
644 (int)BORDER_REFLECT_101|BORDER_ISOLATED*/) // WRAP and ISOLATED are not supported by cv:: version
646 #define FILTER_TYPES Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_16UC1, CV_16UC3, CV_16UC4, CV_32FC1, CV_32FC3, CV_32FC4)
648 OCL_INSTANTIATE_TEST_CASE_P(Filter, Bilateral, Combine(
649 Values(CV_8UC1, CV_8UC3),
650 Values(5, 9), // kernel size
651 Values(Size(0, 0)), // not used
652 FILTER_BORDER_SET_NO_ISOLATED,
653 Values(0.0), // not used
657 OCL_INSTANTIATE_TEST_CASE_P(Filter, LaplacianTest, Combine(
659 Values(1, 3, 5), // kernel size
660 Values(Size(0, 0)), // not used
661 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
662 Values(1.0, 0.2, 3.0), // kernel scale
664 Values(1))); // not used
666 OCL_INSTANTIATE_TEST_CASE_P(Filter, Laplacian3_cols16_rows2, Combine(
667 Values((MatType)CV_8UC1),
668 Values(3), // kernel size
669 Values(Size(0, 0)), // not used
670 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
671 Values(1.0, 0.2, 3.0), // kernel scale
673 Values(1))); // not used
675 OCL_INSTANTIATE_TEST_CASE_P(Filter, SobelTest, Combine(
677 Values(3, 5), // kernel size
678 Values(Size(1, 0), Size(1, 1), Size(2, 0), Size(2, 1)), // dx, dy
679 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
680 Values(0.0), // not used
682 Values(1))); // not used
684 OCL_INSTANTIATE_TEST_CASE_P(Filter, Sobel3x3_cols16_rows2, Combine(
685 Values((MatType)CV_8UC1),
686 Values(3), // kernel size
687 Values(Size(1, 0), Size(1, 1), Size(2, 0), Size(2, 1)), // dx, dy
688 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
689 Values(0.0), // not used
691 Values(1))); // not used
693 OCL_INSTANTIATE_TEST_CASE_P(Filter, ScharrTest, Combine(
695 Values(0), // not used
696 Values(Size(0, 1), Size(1, 0)), // dx, dy
697 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
698 Values(1.0, 0.2), // kernel scale
700 Values(1))); // not used
702 OCL_INSTANTIATE_TEST_CASE_P(Filter, Scharr3x3_cols16_rows2, Combine(
704 Values(0), // not used
705 Values(Size(0, 1), Size(1, 0)), // dx, dy
706 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
707 Values(1.0, 0.2), // kernel scale
709 Values(1))); // not used
711 OCL_INSTANTIATE_TEST_CASE_P(Filter, GaussianBlurTest, Combine(
713 Values(3, 5), // kernel size
714 Values(Size(0, 0)), // not used
715 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
716 Values(0.0), // not used
718 Values(1))); // not used
720 OCL_INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur_multicols, Combine(
721 Values((MatType)CV_8UC1),
722 Values(3, 5), // kernel size
723 Values(Size(0, 0)), // not used
724 FILTER_BORDER_SET_NO_WRAP_NO_ISOLATED,
725 Values(0.0), // not used
727 Values(1))); // not used
729 OCL_INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(
730 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4),
731 Values(0, 3, 5, 7), // kernel size, 0 means kernel = Mat()
732 Values(Size(0, 0)), //not used
733 Values((BorderType)BORDER_CONSTANT),
734 Values(1.0, 2.0, 3.0),
736 Values(1))); // not used
738 OCL_INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(
739 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC4),
740 Values(0, 3, 5, 7), // kernel size, 0 means kernel = Mat()
741 Values(Size(0, 0)), // not used
742 Values((BorderType)BORDER_CONSTANT),
743 Values(1.0, 2.0, 3.0),
745 Values(1))); // not used
747 OCL_INSTANTIATE_TEST_CASE_P(Filter, MorphFilter3x3_cols16_rows2, Combine(
748 Values((MatType)CV_8UC1),
749 Values(0, 3), // kernel size, 0 means kernel = Mat()
750 Values(Size(0, 0)), // not used
751 Values((BorderType)BORDER_CONSTANT),
752 Values(1.0, 2.0, 3.0),
754 Values(1))); // not used
756 OCL_INSTANTIATE_TEST_CASE_P(Filter, MorphologyEx, Combine(
757 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
758 Values(3, 5, 7), // kernel size
759 Values((MorphOp)MORPH_OPEN, (MorphOp)MORPH_CLOSE, (MorphOp)MORPH_GRADIENT, (MorphOp)MORPH_TOPHAT, (MorphOp)MORPH_BLACKHAT), // used as generator of operations
764 } } // namespace cvtest::ocl
766 #endif // HAVE_OPENCL