fixed case with zero mask
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Thu, 9 Jan 2014 13:32:13 +0000 (17:32 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Thu, 9 Jan 2014 15:26:09 +0000 (19:26 +0400)
modules/core/src/stat.cpp
modules/core/test/ocl/test_arithm.cpp
modules/ts/include/opencv2/ts/ocl_test.hpp

index c3204d0..a2cdeaf 100644 (file)
@@ -827,7 +827,8 @@ static bool ocl_meanStdDev( InputArray _src, OutputArray _mean, OutputArray _sdv
     if (!ocl_sum(_src, stddev, OCL_OP_SUM_SQR, _mask))
         return false;
 
-    double total = 1.0 / (haveMask ? countNonZero(_mask) : _src.total());
+    int nz = haveMask ? countNonZero(_mask) : (int)_src.total();
+    double total = nz != 0 ? 1.0 / nz : 0;
     int k, j, cn = _src.channels();
     for (int i = 0; i < cn; ++i)
     {
index 6082b6d..9d5fcf3 100644 (file)
@@ -944,6 +944,25 @@ OCL_TEST_P(MeanStdDev, Mat_Mask)
     }
 }
 
+OCL_TEST(MeanStdDev_, ZeroMask)
+{
+    Size size(5, 5);
+    UMat um(size, CV_32SC1), umask(size, CV_8UC1, Scalar::all(0));
+    Mat m(size, CV_32SC1), mask(size, CV_8UC1, Scalar::all(0));
+
+    Scalar cpu_mean, cpu_stddev;
+    Scalar gpu_mean, gpu_stddev;
+
+    OCL_OFF(cv::meanStdDev(m, cpu_mean, cpu_stddev, mask));
+    OCL_ON(cv::meanStdDev(um, gpu_mean, gpu_stddev, umask));
+
+    for (int i = 0; i < 4; ++i)
+    {
+        EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 0.1);
+        EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1);
+    }
+}
+
 //////////////////////////////////////// Log /////////////////////////////////////////
 
 typedef ArithmTestBase Log;
index 57220c7..2fea52a 100644 (file)
@@ -318,6 +318,8 @@ IMPLEMENT_PARAM_CLASS(Channels, int)
 #endif // IMPLEMENT_PARAM_CLASS
 
 #define OCL_TEST_P TEST_P
+#define OCL_TEST_F(name, ...) typedef name OCL_##name; TEST_F(OCL_##name, __VA_ARGS__)
+#define OCL_TEST(name, ...) TEST(OCL_##name, __VA_ARGS__)
 
 #define OCL_OFF(fn) cv::ocl::setUseOpenCL(false); fn
 #define OCL_ON(fn) cv::ocl::setUseOpenCL(true); fn