diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index c3204d0f19..a2cdeaf3e8 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -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) { diff --git a/modules/core/test/ocl/test_arithm.cpp b/modules/core/test/ocl/test_arithm.cpp index 6082b6ddf8..9d5fcf335c 100644 --- a/modules/core/test/ocl/test_arithm.cpp +++ b/modules/core/test/ocl/test_arithm.cpp @@ -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; diff --git a/modules/ts/include/opencv2/ts/ocl_test.hpp b/modules/ts/include/opencv2/ts/ocl_test.hpp index 57220c7a7a..2fea52a95e 100644 --- a/modules/ts/include/opencv2/ts/ocl_test.hpp +++ b/modules/ts/include/opencv2/ts/ocl_test.hpp @@ -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