From a562b5c985ffcad4390c867fa6c2dc064af4e8b0 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Mon, 30 Sep 2013 17:36:59 +0400 Subject: [PATCH] fixed ocl::meanStddev and created accuracy test for this function --- modules/ocl/src/arithm.cpp | 20 ++++++-------------- modules/ocl/test/test_arithm.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/modules/ocl/src/arithm.cpp b/modules/ocl/src/arithm.cpp index 883ac8f0d..e81ee56a5 100644 --- a/modules/ocl/src/arithm.cpp +++ b/modules/ocl/src/arithm.cpp @@ -454,23 +454,15 @@ Scalar cv::ocl::sqrSum(const oclMat &src) void cv::ocl::meanStdDev(const oclMat &src, Scalar &mean, Scalar &stddev) { - CV_Assert(src.depth() <= CV_32S); - cv::Size sz(1, 1); - int channels = src.oclchannels(); - Mat m1(sz, CV_MAKETYPE(CV_32S, channels), cv::Scalar::all(0)), - m2(sz, CV_MAKETYPE(CV_32S, channels), cv::Scalar::all(0)); - oclMat dst1(m1), dst2(m2); + double total = 1.0 / src.size().area(); -// arithmetic_sum_run(src, dst1, "arithm_op_sum"); -// arithmetic_sum_run(src, dst2, "arithm_op_squares_sum"); + mean = sum(src); + stddev = sqrSum(src); - m1 = (Mat)dst1; - m2 = (Mat)dst2; - int i = 0, *p = (int *)m1.data, *q = (int *)m2.data; - for (; i < channels; i++) + for (int i = 0; i < 4; ++i) { - mean.val[i] = (double)p[i] / (src.cols * src.rows); - stddev.val[i] = std::sqrt(std::max((double) q[i] / (src.cols * src.rows) - mean.val[i] * mean.val[i] , 0.)); + mean[i] *= total; + stddev[i] = std::sqrt(std::max(stddev[i] * total - mean.val[i] * mean.val[i] , 0.)); } } diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index ee45cf5e3..ac4842e23 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -1440,6 +1440,30 @@ TEST_P(SetIdentity, Mat) } } +//////////////////////////////// setIdentity ///////////////////////////////////////////////// + +typedef ArithmTestBase MeanStdDev; + +TEST_P(MeanStdDev, Mat) +{ + for (int j = 0; j < LOOP_TIMES; j++) + { + random_roi(); + + Scalar cpu_mean, cpu_stddev; + Scalar gpu_mean, gpu_stddev; + + cv::meanStdDev(src1_roi, cpu_mean, cpu_stddev); + cv::ocl::meanStdDev(gsrc1, gpu_mean, gpu_stddev); + + for (int i = 0; i < 4; ++i) + { + EXPECT_NEAR(cpu_mean[i], gpu_mean[i], 1e-5); + EXPECT_NEAR(cpu_stddev[i], gpu_stddev[i], 0.1); + } + } +} + //////////////////////////////////////// Instantiation ///////////////////////////////////////// INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine(testing::Range(CV_8U, CV_USRTYPE1), testing::Range(1, 5), Bool(), Bool())); @@ -1470,5 +1494,6 @@ INSTANTIATE_TEST_CASE_P(Arithm, Compare, Combine(testing::Range(CV_8U, CV_USRTYP INSTANTIATE_TEST_CASE_P(Arithm, Pow, Combine(Values(CV_32F, CV_64F), testing::Range(1, 5), Bool())); INSTANTIATE_TEST_CASE_P(Arithm, AddWeighted, Combine(testing::Range(CV_8U, CV_USRTYPE1), testing::Range(1, 5), Bool())); INSTANTIATE_TEST_CASE_P(Arithm, SetIdentity, Combine(testing::Range(CV_8U, CV_USRTYPE1), testing::Range(1, 5), Bool())); +INSTANTIATE_TEST_CASE_P(Arithm, MeanStdDev, Combine(testing::Range(CV_8U, CV_USRTYPE1), testing::Range(1, 5), Bool())); #endif // HAVE_OPENCL