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, int)
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);
418 cv::RNG &rng = TS::ptr()->get_rng();
419 roicols = rng.uniform(2, mat1.cols);
420 roirows = rng.uniform(2, mat1.rows);
421 src1x = rng.uniform(0, mat1.cols - roicols);
422 src1y = rng.uniform(0, mat1.rows - roirows);
423 dstx = rng.uniform(0, dst.cols - roicols);
424 dsty = rng.uniform(0, dst.rows - roirows);
434 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
435 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
438 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
448 struct Erode : ErodeDilateBase {};
452 for(int j = 0; j < LOOP_TIMES; j++)
456 cv::erode(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations);
457 cv::ocl::erode(gmat1, gdst, kernel, Point(-1, -1), iterations);
460 gdst_whole.download(cpu_dst);
462 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
464 EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss);
475 struct Dilate : ErodeDilateBase {};
479 for(int j = 0; j < LOOP_TIMES; j++)
482 cv::erode(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations);
483 cv::ocl::erode(gmat1, gdst, kernel, Point(-1, -1), iterations);
486 gdst_whole.download(cpu_dst);
488 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
490 EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss);
498 /////////////////////////////////////////////////////////////////////////////////////////////////
501 PARAM_TEST_CASE(Sobel, MatType, int, int, int, int)
504 int dx, dy, ksize, bordertype;
521 //std::vector<cv::ocl::Info> oclinfo;
522 //ocl dst mat for testing
523 cv::ocl::oclMat gdst_whole;
526 cv::ocl::oclMat gmat1;
527 cv::ocl::oclMat gdst;
534 ksize = GET_PARAM(3);
535 bordertype = GET_PARAM(4);
538 cv::RNG &rng = TS::ptr()->get_rng();
539 cv::Size size(MWIDTH, MHEIGHT);
541 mat1 = randomMat(rng, size, type, 5, 16, false);
542 dst = randomMat(rng, size, type, 5, 16, false);
544 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
545 //CV_Assert(devnums > 0);
546 ////if you want to use undefault device, set it here
547 ////setDevice(oclinfo[0]);
554 cv::RNG &rng = TS::ptr()->get_rng();
555 roicols = rng.uniform(2, mat1.cols);
556 roirows = rng.uniform(2, mat1.rows);
557 src1x = rng.uniform(0, mat1.cols - roicols);
558 src1y = rng.uniform(0, mat1.rows - roirows);
559 dstx = rng.uniform(0, dst.cols - roicols);
560 dsty = rng.uniform(0, dst.rows - roirows);
570 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
571 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
574 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
584 for(int j = 0; j < LOOP_TIMES; j++)
588 cv::Sobel(mat1_roi, dst_roi, -1, dx, dy, ksize, /*scale*/0.00001,/*delta*/0, bordertype);
589 cv::ocl::Sobel(gmat1, gdst, -1, dx, dy, ksize,/*scale*/0.00001,/*delta*/0, bordertype);
592 gdst_whole.download(cpu_dst);
594 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
596 EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss);
602 /////////////////////////////////////////////////////////////////////////////////////////////////
605 PARAM_TEST_CASE(Scharr, MatType, int, int, int)
608 int dx, dy, bordertype;
625 //std::vector<cv::ocl::Info> oclinfo;
626 //ocl dst mat for testing
627 cv::ocl::oclMat gdst_whole;
630 cv::ocl::oclMat gmat1;
631 cv::ocl::oclMat gdst;
638 bordertype = GET_PARAM(3);
642 cv::RNG &rng = TS::ptr()->get_rng();
643 cv::Size size(MWIDTH, MHEIGHT);
645 mat1 = randomMat(rng, size, type, 5, 16, false);
646 dst = randomMat(rng, size, type, 5, 16, false);
648 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
649 //CV_Assert(devnums > 0);
650 ////if you want to use undefault device, set it here
651 ////setDevice(oclinfo[0]);
658 cv::RNG &rng = TS::ptr()->get_rng();
659 roicols = rng.uniform(2, mat1.cols);
660 roirows = rng.uniform(2, mat1.rows);
661 src1x = rng.uniform(0, mat1.cols - roicols);
662 src1y = rng.uniform(0, mat1.rows - roirows);
663 dstx = rng.uniform(0, dst.cols - roicols);
664 dsty = rng.uniform(0, dst.rows - roirows);
674 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
675 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
678 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
688 for(int j = 0; j < LOOP_TIMES; j++)
692 cv::Scharr(mat1_roi, dst_roi, -1, dx, dy, /*scale*/1,/*delta*/0, bordertype);
693 cv::ocl::Scharr(gmat1, gdst, -1, dx, dy,/*scale*/1,/*delta*/0, bordertype);
696 gdst_whole.download(cpu_dst);
698 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
700 EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss);
706 /////////////////////////////////////////////////////////////////////////////////////////////////
709 PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int)
715 double sigma1, sigma2;
732 //std::vector<cv::ocl::Info> oclinfo;
733 //ocl dst mat for testing
734 cv::ocl::oclMat gdst_whole;
737 cv::ocl::oclMat gmat1;
738 cv::ocl::oclMat gdst;
743 ksize = GET_PARAM(1);
744 bordertype = GET_PARAM(2);
746 cv::RNG &rng = TS::ptr()->get_rng();
747 cv::Size size(MWIDTH, MHEIGHT);
749 sigma1 = rng.uniform(0.1, 1.0);
750 sigma2 = rng.uniform(0.1, 1.0);
752 mat1 = randomMat(rng, size, type, 5, 16, false);
753 dst = randomMat(rng, size, type, 5, 16, false);
755 //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
756 //CV_Assert(devnums > 0);
757 ////if you want to use undefault device, set it here
758 ////setDevice(oclinfo[0]);
765 cv::RNG &rng = TS::ptr()->get_rng();
766 roicols = rng.uniform(2, mat1.cols);
767 roirows = rng.uniform(2, mat1.rows);
768 src1x = rng.uniform(0, mat1.cols - roicols);
769 src1y = rng.uniform(0, mat1.rows - roirows);
770 dstx = rng.uniform(0, dst.cols - roicols);
771 dsty = rng.uniform(0, dst.rows - roirows);
781 mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
782 dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
785 gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
793 TEST_P(GaussianBlur, Mat)
795 for(int j = 0; j < LOOP_TIMES; j++)
799 cv::GaussianBlur(mat1_roi, dst_roi, ksize, sigma1, sigma2, bordertype);
800 cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype);
803 gdst_whole.download(cpu_dst);
805 sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty);
807 EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, sss);
814 INSTANTIATE_TEST_CASE_P(Filter, Blur, Combine(Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
815 Values(cv::Size(3, 3), cv::Size(5, 5), cv::Size(7, 7)),
816 Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101)));
819 INSTANTIATE_TEST_CASE_P(Filters, Laplacian, Combine(
820 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
823 INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1)));
825 //INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC1), Values(false)));
827 INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1)));
829 //INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC1), Values(false)));
832 INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
833 Values(1, 2), Values(0, 1), Values(3, 5), Values((MatType)cv::BORDER_CONSTANT,
834 (MatType)cv::BORDER_REPLICATE)));
837 INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine(
838 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1),
839 Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE)));
841 INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine(
842 Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
843 Values(cv::Size(3, 3), cv::Size(5, 5)),
844 Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE)));
848 #endif // HAVE_OPENCL