diff --git a/modules/imgproc/test/ocl/test_histogram.cpp b/modules/imgproc/test/ocl/test_histogram.cpp index 0a27907b63..7d52fc1de3 100644 --- a/modules/imgproc/test/ocl/test_histogram.cpp +++ b/modules/imgproc/test/ocl/test_histogram.cpp @@ -13,6 +13,7 @@ // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. // Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2013-2014, Itseez, Inc, all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors @@ -144,6 +145,36 @@ PARAM_TEST_CASE(CalcBackProject, MatDepth, int, bool) scale = randomDouble(0.1, 1); } + + virtual void test_by_pict() + { + Mat frame1 = readImage("optflow/RubberWhale1.png", IMREAD_GRAYSCALE); + + UMat usrc; + frame1.copyTo(usrc); + int histSize = randomInt(3, 29); + float hue_range[] = { 0, 180 }; + const float* ranges = { hue_range }; + + //compute histogram + calcHist(&frame1, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false); + normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat()); + + Mat dst; + UMat udst, src, uhist; + hist.copyTo(uhist); + std::vector uims; + uims.push_back(usrc); + std::vector urngs; + urngs.push_back(0); + urngs.push_back(180); + std::vector chs; + chs.push_back(0); + + OCL_OFF(calcBackProject(&frame1, 1, 0, hist, dst, &ranges, 1, true)); + OCL_ON(calcBackProject(uims, chs, uhist, udst, urngs, 1.0)); + EXPECT_MAT_NEAR(dst, udst, 0.0); + } }; //////////////////////////////// CalcBackProject ////////////////////////////////////////////// @@ -157,7 +188,14 @@ OCL_TEST_P(CalcBackProject, Mat) OCL_OFF(cv::calcBackProject(images_roi, channels, hist_roi, dst_roi, ranges, scale)); OCL_ON(cv::calcBackProject(uimages_roi, channels, uhist_roi, udst_roi, ranges, scale)); - OCL_EXPECT_MATS_NEAR(dst, 0.0); + Size dstSize = dst_roi.size(); + int nDiffs = (int)(0.03f*dstSize.height*dstSize.width); + + //check if the dst mats are the same except 3% difference + EXPECT_MAT_N_DIFF(dst_roi, udst_roi, nDiffs); + + //check in addition on given image + test_by_pict(); } } diff --git a/modules/ts/include/opencv2/ts/ocl_test.hpp b/modules/ts/include/opencv2/ts/ocl_test.hpp index 0f0d9657fe..28ff674911 100644 --- a/modules/ts/include/opencv2/ts/ocl_test.hpp +++ b/modules/ts/include/opencv2/ts/ocl_test.hpp @@ -85,6 +85,17 @@ do \ << "Size: " << mat1.size() << std::endl; \ } while ((void)0, 0) +#define EXPECT_MAT_N_DIFF(mat1, mat2, num) \ +do \ +{ \ + ASSERT_EQ(mat1.type(), mat2.type()); \ + ASSERT_EQ(mat1.size(), mat2.size()); \ + Mat diff; \ + absdiff(mat1, mat2, diff); \ + EXPECT_LE(countNonZero(diff.reshape(1)), num) \ + << "Size: " << mat1.size() << std::endl; \ +} while ((void)0, 0) + #define OCL_EXPECT_MATS_NEAR(name, eps) \ do \ { \