both tests by picture and rand mat
authormlyashko <maria.lyashko@itseez.com>
Thu, 27 Mar 2014 13:08:05 +0000 (17:08 +0400)
committermlyashko <maria.lyashko@itseez.com>
Thu, 27 Mar 2014 13:08:05 +0000 (17:08 +0400)
modules/imgproc/test/ocl/test_histogram.cpp
modules/ts/include/opencv2/ts/ocl_test.hpp

index 0a27907..7d52fc1 100644 (file)
@@ -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<UMat> uims;
+        uims.push_back(usrc);
+        std::vector<float> urngs;
+        urngs.push_back(0);
+        urngs.push_back(180);
+        std::vector<int> 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();
     }
 }
 
index 0f0d965..28ff674 100644 (file)
@@ -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 \
 { \