From da2790249e06235d613bad077c121ad058d87e00 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 7 Jan 2014 20:32:22 +0400 Subject: [PATCH] added NORM_L2SQR type to cv::norm --- modules/core/perf/opencl/perf_arithm.cpp | 2 +- modules/core/src/stat.cpp | 10 +++++----- modules/core/test/ocl/test_arithm.cpp | 21 ++++++++++++++++++++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/modules/core/perf/opencl/perf_arithm.cpp b/modules/core/perf/opencl/perf_arithm.cpp index fc6ce0840..4eae4897e 100644 --- a/modules/core/perf/opencl/perf_arithm.cpp +++ b/modules/core/perf/opencl/perf_arithm.cpp @@ -909,7 +909,7 @@ OCL_PERF_TEST_P(PSNRFixture, PSNR, OCL_TEST_CYCLE() psnr = cv::PSNR(src1, src2); - SANITY_CHECK(psnr, 1e-6, ERROR_RELATIVE); + SANITY_CHECK(psnr, 1e-4, ERROR_RELATIVE); } } } // namespace cvtest::ocl diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index a2cdeaf3e..eac823995 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -1902,7 +1902,7 @@ static bool ocl_norm( InputArray _src, int normType, InputArray _mask, double & bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0, haveMask = _mask.kind() != _InputArray::NONE; - if ( !(normType == NORM_INF || normType == NORM_L1 || normType == NORM_L2) || + if ( !(normType == NORM_INF || normType == NORM_L1 || normType == NORM_L2 || normType == NORM_L2SQR) || (!doubleSupport && depth == CV_64F) || (normType == NORM_INF && haveMask && cn != 1)) return false; @@ -1937,12 +1937,12 @@ static bool ocl_norm( InputArray _src, int normType, InputArray _mask, double & cv::minMaxIdx(haveMask ? abssrc : abssrc.reshape(1), NULL, &result, NULL, NULL, _mask); } - else if (normType == NORM_L1 || normType == NORM_L2) + else if (normType == NORM_L1 || normType == NORM_L2 || normType == NORM_L2SQR) { Scalar sc; bool unstype = depth == CV_8U || depth == CV_16U; - if ( !ocl_sum(haveMask ? src : src.reshape(1), sc, normType == NORM_L2 ? + if ( !ocl_sum(haveMask ? src : src.reshape(1), sc, normType == NORM_L2 || normType == NORM_L2SQR ? OCL_OP_SUM_SQR : (unstype ? OCL_OP_SUM : OCL_OP_SUM_ABS), _mask) ) return false; @@ -1953,7 +1953,7 @@ static bool ocl_norm( InputArray _src, int normType, InputArray _mask, double & for (int i = 0; i < cn; ++i) s += sc[i]; - result = normType == NORM_L1 ? s : std::sqrt(s); + result = normType == NORM_L1 || normType == NORM_L2SQR ? s : std::sqrt(s); } return true; @@ -2261,7 +2261,7 @@ static bool ocl_norm( InputArray _src1, InputArray _src2, int normType, double & bool relative = (normType & NORM_RELATIVE) != 0; normType &= ~NORM_RELATIVE; - if ( !(normType == NORM_INF || normType == NORM_L1 || normType == NORM_L2) || + if ( !(normType == NORM_INF || normType == NORM_L1 || normType == NORM_L2 || normType == NORM_L2SQR) || (!doubleSupport && depth == CV_64F)) return false; diff --git a/modules/core/test/ocl/test_arithm.cpp b/modules/core/test/ocl/test_arithm.cpp index a2165d256..ff85e6c24 100644 --- a/modules/core/test/ocl/test_arithm.cpp +++ b/modules/core/test/ocl/test_arithm.cpp @@ -1011,7 +1011,6 @@ OCL_TEST_P(Phase, angleInDegree) } } - OCL_TEST_P(Phase, angleInRadians) { for (int j = 0; j < test_loop_times; j++) @@ -1548,6 +1547,25 @@ OCL_TEST_P(PatchNaNs, Mat) } } +//////////////////////////////// Psnr //////////////////////////////////////////////// + +typedef ArithmTestBase Psnr; + +OCL_TEST_P(Psnr, Mat) +{ + for (int j = 0; j < test_loop_times; j++) + { + generateTestData(); + + double cpuRes = 0, gpuRes = 0; + + OCL_OFF(cpuRes = cv::PSNR(src1_roi, src2_roi)); + OCL_ON(gpuRes = cv::PSNR(usrc1_roi, usrc2_roi)); + + EXPECT_PRED3(relativeError, cpuRes, gpuRes, 1e-6); + } +} + //////////////////////////////////////// Instantiation ///////////////////////////////////////// OCL_INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine(::testing::Values(CV_8U, CV_8S), OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool())); @@ -1587,6 +1605,7 @@ OCL_INSTANTIATE_TEST_CASE_P(Arithm, InRange, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHA OCL_INSTANTIATE_TEST_CASE_P(Arithm, ConvertScaleAbs, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool())); OCL_INSTANTIATE_TEST_CASE_P(Arithm, ScaleAdd, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool())); OCL_INSTANTIATE_TEST_CASE_P(Arithm, PatchNaNs, Combine(OCL_ALL_CHANNELS, Bool())); +OCL_INSTANTIATE_TEST_CASE_P(Arithm, Psnr, Combine(::testing::Values((MatDepth)CV_8U), OCL_ALL_CHANNELS, Bool())); } } // namespace cvtest::ocl