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 // Third party copyrights are property of their respective owners.
18 // Niko Li, newlife20080214@gmail.com
19 // Jia Haipeng, jiahaipeng95@gmail.com
20 // Zero Lin, Zero.Lin@amd.com
21 // Zhang Ying, zhangying913@gmail.com
23 // Redistribution and use in source and binary forms, with or without modification,
24 // are permitted provided that the following conditions are met:
26 // * Redistribution's of source code must retain the above copyright notice,
27 // this list of conditions and the following disclaimer.
29 // * Redistribution's in binary form must reproduce the above copyright notice,
30 // this list of conditions and the following disclaimer in the documentation
31 // and/or other oclMaterials provided with the distribution.
33 // * The name of the copyright holders may not be used to endorse or promote products
34 // derived from this software without specific prior written permission.
36 // This software is provided by the copyright holders and contributors "as is" and
37 // any express or implied warranties, including, but not limited to, the implied
38 // warranties of merchantability and fitness for a particular purpose are disclaimed.
39 // In no event shall the Intel Corporation or contributors be liable for any direct,
40 // indirect, incidental, special, exemplary, or consequential damages
41 // (including, but not limited to, procurement of substitute goods or services;
42 // loss of use, data, or profits; or business interruption) however caused
43 // and on any theory of liability, whether in contract, strict liability,
44 // or tort (including negligence or otherwise) arising in any way out of
45 // the use of this software, even if advised of the possibility of such damage.
49 #include "precomp.hpp"
53 using namespace cvtest;
54 using namespace testing;
58 PARAM_TEST_CASE(FilterTestBase, MatType, bool)
68 cv::Mat dst1; //bak, for two outputs
87 cv::Mat dst1_roi; //bak
88 //std::vector<cv::ocl::Info> oclinfo;
89 //ocl dst mat for testing
90 cv::ocl::oclMat gdst_whole;
91 cv::ocl::oclMat gdst1_whole; //bak
94 cv::ocl::oclMat gmat1;
95 cv::ocl::oclMat gmat2;
97 cv::ocl::oclMat gdst1; //bak
98 cv::ocl::oclMat gmask;
104 cv::RNG &rng = TS::ptr()->get_rng();
105 cv::Size size(MWIDTH, MHEIGHT);
107 mat1 = randomMat(rng, size, type, 5, 16, false);
108 mat2 = randomMat(rng, size, type, 5, 16, false);
109 dst = randomMat(rng, size, type, 5, 16, false);
110 dst1 = randomMat(rng, size, type, 5, 16, false);
111 mask = randomMat(rng, size, CV_8UC1, 0, 2, false);
113 cv::threshold(mask, mask, 0.5, 255., CV_8UC1);
115 val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0));
122 cv::RNG &rng = TS::ptr()->get_rng();
123 roicols = rng.uniform(1, mat1.cols);
124 roirows = rng.uniform(1, mat1.rows);
125 src1x = rng.uniform(0, mat1.cols - roicols);
126 src1y = rng.uniform(0, mat1.rows - roirows);
127 src2x = rng.uniform(0, mat2.cols - roicols);
128 src2y = rng.uniform(0, mat2.rows - roirows);
129 dstx = rng.uniform(0, dst.cols - roicols);
130 dsty = rng.uniform(0, dst.rows - roirows);
131 maskx = rng.uniform(0, mask.cols - roicols);
132 masky = rng.uniform(0, mask.rows - roirows);
145 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
146 mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows));
147 mask_roi = mask(Rect(maskx, masky, roicols, roirows));
148 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
149 dst1_roi = dst1(Rect(dstx, dsty, roicols, roirows));
152 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
155 gdst1 = gdst1_whole(Rect(dstx, dsty, roicols, roirows));
164 /////////////////////////////////////////////////////////////////////////////////////////////////
167 PARAM_TEST_CASE(Blur, MatType, cv::Size, int)
188 //std::vector<cv::ocl::Info> oclinfo;
189 //ocl dst mat for testing
190 cv::ocl::oclMat gdst_whole;
193 cv::ocl::oclMat gmat1;
194 cv::ocl::oclMat gdst;
199 ksize = GET_PARAM(1);
200 bordertype = GET_PARAM(2);
202 cv::RNG &rng = TS::ptr()->get_rng();
203 cv::Size size(MWIDTH, MHEIGHT);
205 mat1 = randomMat(rng, size, type, 5, 16, false);
206 dst = randomMat(rng, size, type, 5, 16, false);
207 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
208 //CV_Assert(devnums > 0);
209 ////if you want to use undefault device, set it here
210 ////setDevice(oclinfo[0]);
217 cv::RNG &rng = TS::ptr()->get_rng();
218 roicols = rng.uniform(2, mat1.cols);
219 roirows = rng.uniform(2, mat1.rows);
220 src1x = rng.uniform(0, mat1.cols - roicols);
221 src1y = rng.uniform(0, mat1.rows - roirows);
222 dstx = rng.uniform(0, dst.cols - roicols);
223 dsty = rng.uniform(0, dst.rows - roirows);
233 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
234 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
237 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
247 for(int j = 0; j < LOOP_TIMES; j++)
251 cv::blur(mat1_roi, dst_roi, ksize, Point(-1, -1), bordertype);
252 cv::ocl::blur(gmat1, gdst, ksize, Point(-1, -1), bordertype);
255 gdst_whole.download(cpu_dst);
257 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
258 EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, sss);
265 /////////////////////////////////////////////////////////////////////////////////////////////////
268 PARAM_TEST_CASE(LaplacianTestBase, MatType, int)
288 //std::vector<cv::ocl::Info> oclinfo;
289 //ocl dst mat for testing
290 cv::ocl::oclMat gdst_whole;
293 cv::ocl::oclMat gmat;
294 cv::ocl::oclMat gdst;
299 ksize = GET_PARAM(1);
301 cv::RNG &rng = TS::ptr()->get_rng();
302 cv::Size size(MWIDTH, MHEIGHT);
304 mat = randomMat(rng, size, type, 5, 16, false);
305 dst = randomMat(rng, size, type, 5, 16, false);
307 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
308 //CV_Assert(devnums > 0);
309 ////if you want to use undefault device, set it here
310 ////setDevice(oclinfo[0]);
317 cv::RNG &rng = TS::ptr()->get_rng();
318 roicols = rng.uniform(2, mat.cols);
319 roirows = rng.uniform(2, mat.rows);
320 srcx = rng.uniform(0, mat.cols - roicols);
321 srcy = rng.uniform(0, mat.rows - roirows);
322 dstx = rng.uniform(0, dst.cols - roicols);
323 dsty = rng.uniform(0, dst.rows - roirows);
333 mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
334 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
337 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
343 struct Laplacian : LaplacianTestBase {};
345 TEST_P(Laplacian, Accuracy)
347 for(int j = 0; j < LOOP_TIMES; j++)
351 cv::Laplacian(mat_roi, dst_roi, -1, ksize, 1);
352 cv::ocl::Laplacian(gmat, gdst, -1, ksize, 1);
355 gdst_whole.download(cpu_dst);
357 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, srcx, srcy, dstx, dsty);
359 EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss);
365 /////////////////////////////////////////////////////////////////////////////////////////////////
368 PARAM_TEST_CASE(ErodeDilateBase, MatType, bool)
373 //erode or dilate kernel
391 //std::vector<cv::ocl::Info> oclinfo;
392 //ocl dst mat for testing
393 cv::ocl::oclMat gdst_whole;
396 cv::ocl::oclMat gmat1;
397 cv::ocl::oclMat gdst;
402 // iterations = GET_PARAM(1);
404 cv::RNG &rng = TS::ptr()->get_rng();
405 cv::Size size(MWIDTH, MHEIGHT);
407 mat1 = randomMat(rng, size, type, 5, 16, false);
408 dst = randomMat(rng, size, type, 5, 16, false);
409 // rng.fill(kernel, cv::RNG::UNIFORM, cv::Scalar::all(0), cv::Scalar::all(3));
410 kernel = randomMat(rng, Size(3, 3), CV_8UC1, 0, 3, false);
412 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
413 //CV_Assert(devnums > 0);
414 ////if you want to use undefault device, set it here
415 ////setDevice(oclinfo[0]);
422 cv::RNG &rng = TS::ptr()->get_rng();
423 roicols = rng.uniform(2, mat1.cols);
424 roirows = rng.uniform(2, mat1.rows);
425 src1x = rng.uniform(0, mat1.cols - roicols);
426 src1y = rng.uniform(0, mat1.rows - roirows);
427 dstx = rng.uniform(0, dst.cols - roicols);
428 dsty = rng.uniform(0, dst.rows - roirows);
438 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
439 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
442 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
452 struct Erode : ErodeDilateBase {};
456 for(int j = 0; j < LOOP_TIMES; j++)
460 //cv::erode(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations);
461 //cv::ocl::erode(gmat1, gdst, kernel, Point(-1, -1), iterations);
463 cv::erode(mat1_roi, dst_roi, kernel);
464 cv::ocl::erode(gmat1, gdst, kernel);
467 gdst_whole.download(cpu_dst);
469 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
471 EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss);
482 struct Dilate : ErodeDilateBase {};
486 for(int j = 0; j < LOOP_TIMES; j++)
490 // cv::erode(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations);
491 // cv::ocl::erode(gmat1, gdst, kernel, Point(-1, -1), iterations);
493 cv::dilate(mat1_roi, dst_roi, kernel);
494 cv::ocl::dilate(gmat1, gdst, kernel);
497 gdst_whole.download(cpu_dst);
499 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
501 EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss);
509 /////////////////////////////////////////////////////////////////////////////////////////////////
512 PARAM_TEST_CASE(Sobel, MatType, int, int, int, int)
515 int dx, dy, ksize, bordertype;
532 //std::vector<cv::ocl::Info> oclinfo;
533 //ocl dst mat for testing
534 cv::ocl::oclMat gdst_whole;
537 cv::ocl::oclMat gmat1;
538 cv::ocl::oclMat gdst;
545 ksize = GET_PARAM(3);
546 bordertype = GET_PARAM(4);
549 cv::RNG &rng = TS::ptr()->get_rng();
550 cv::Size size(MWIDTH, MHEIGHT);
552 mat1 = randomMat(rng, size, type, 5, 16, false);
553 dst = randomMat(rng, size, type, 5, 16, false);
555 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
556 //CV_Assert(devnums > 0);
557 ////if you want to use undefault device, set it here
558 ////setDevice(oclinfo[0]);
565 cv::RNG &rng = TS::ptr()->get_rng();
566 roicols = rng.uniform(2, mat1.cols);
567 roirows = rng.uniform(2, mat1.rows);
568 src1x = rng.uniform(0, mat1.cols - roicols);
569 src1y = rng.uniform(0, mat1.rows - roirows);
570 dstx = rng.uniform(0, dst.cols - roicols);
571 dsty = rng.uniform(0, dst.rows - roirows);
581 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
582 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
585 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
595 for(int j = 0; j < LOOP_TIMES; j++)
599 cv::Sobel(mat1_roi, dst_roi, -1, dx, dy, ksize, /*scale*/0.00001,/*delta*/0, bordertype);
600 cv::ocl::Sobel(gmat1, gdst, -1, dx, dy, ksize,/*scale*/0.00001,/*delta*/0, bordertype);
603 gdst_whole.download(cpu_dst);
605 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
607 EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss);
613 /////////////////////////////////////////////////////////////////////////////////////////////////
616 PARAM_TEST_CASE(Scharr, MatType, int, int, int)
619 int dx, dy, bordertype;
636 //std::vector<cv::ocl::Info> oclinfo;
637 //ocl dst mat for testing
638 cv::ocl::oclMat gdst_whole;
641 cv::ocl::oclMat gmat1;
642 cv::ocl::oclMat gdst;
649 bordertype = GET_PARAM(3);
653 cv::RNG &rng = TS::ptr()->get_rng();
654 cv::Size size(MWIDTH, MHEIGHT);
656 mat1 = randomMat(rng, size, type, 5, 16, false);
657 dst = randomMat(rng, size, type, 5, 16, false);
659 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
660 //CV_Assert(devnums > 0);
661 ////if you want to use undefault device, set it here
662 ////setDevice(oclinfo[0]);
669 cv::RNG &rng = TS::ptr()->get_rng();
670 roicols = rng.uniform(2, mat1.cols);
671 roirows = rng.uniform(2, mat1.rows);
672 src1x = rng.uniform(0, mat1.cols - roicols);
673 src1y = rng.uniform(0, mat1.rows - roirows);
674 dstx = rng.uniform(0, dst.cols - roicols);
675 dsty = rng.uniform(0, dst.rows - roirows);
685 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
686 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
689 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
699 for(int j = 0; j < LOOP_TIMES; j++)
703 cv::Scharr(mat1_roi, dst_roi, -1, dx, dy, /*scale*/1,/*delta*/0, bordertype);
704 cv::ocl::Scharr(gmat1, gdst, -1, dx, dy,/*scale*/1,/*delta*/0, bordertype);
707 gdst_whole.download(cpu_dst);
709 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
711 EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss);
717 /////////////////////////////////////////////////////////////////////////////////////////////////
720 PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int)
726 double sigma1, sigma2;
743 //std::vector<cv::ocl::Info> oclinfo;
744 //ocl dst mat for testing
745 cv::ocl::oclMat gdst_whole;
748 cv::ocl::oclMat gmat1;
749 cv::ocl::oclMat gdst;
754 ksize = GET_PARAM(1);
755 bordertype = GET_PARAM(2);
757 cv::RNG &rng = TS::ptr()->get_rng();
758 cv::Size size(MWIDTH, MHEIGHT);
760 sigma1 = rng.uniform(0.1, 1.0);
761 sigma2 = rng.uniform(0.1, 1.0);
763 mat1 = randomMat(rng, size, type, 5, 16, false);
764 dst = randomMat(rng, size, type, 5, 16, false);
766 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
767 //CV_Assert(devnums > 0);
768 ////if you want to use undefault device, set it here
769 ////setDevice(oclinfo[0]);
776 cv::RNG &rng = TS::ptr()->get_rng();
777 roicols = rng.uniform(2, mat1.cols);
778 roirows = rng.uniform(2, mat1.rows);
779 src1x = rng.uniform(0, mat1.cols - roicols);
780 src1y = rng.uniform(0, mat1.rows - roirows);
781 dstx = rng.uniform(0, dst.cols - roicols);
782 dsty = rng.uniform(0, dst.rows - roirows);
792 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
793 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
796 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
804 TEST_P(GaussianBlur, Mat)
806 for(int j = 0; j < LOOP_TIMES; j++)
810 cv::GaussianBlur(mat1_roi, dst_roi, ksize, sigma1, sigma2, bordertype);
811 cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype);
814 gdst_whole.download(cpu_dst);
816 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
818 EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, sss);
825 INSTANTIATE_TEST_CASE_P(Filter, Blur, Combine(Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
826 Values(cv::Size(3, 3), cv::Size(5, 5), cv::Size(7, 7)),
827 Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101)));
830 INSTANTIATE_TEST_CASE_P(Filters, Laplacian, Combine(
831 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
834 INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2, 3)));
836 //INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC1), Values(false)));
838 INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2, 3)));
840 //INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC1), Values(false)));
843 INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
844 Values(1, 2), Values(0, 1), Values(3, 5), Values((MatType)cv::BORDER_CONSTANT,
845 (MatType)cv::BORDER_REPLICATE)));
848 INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine(
849 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1),
850 Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE)));
852 INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine(
853 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
854 Values(cv::Size(3, 3), cv::Size(5, 5)),
855 Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE)));
859 #endif // HAVE_OPENCL