From 4934f7c5a409553d24074d5b05a91d1e3c635fd5 Mon Sep 17 00:00:00 2001 From: yuki takehara Date: Sat, 28 Apr 2018 20:14:10 +0900 Subject: [PATCH] Merge pull request #11285 from take1014:core_6125 * Resolves 6125 * Fix test code * Delete unnecessary code --- modules/core/src/convert_scale.cpp | 17 ++++++++++++----- modules/core/test/test_arithm.cpp | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/modules/core/src/convert_scale.cpp b/modules/core/src/convert_scale.cpp index 74cf98b..ff8398a 100644 --- a/modules/core/src/convert_scale.cpp +++ b/modules/core/src/convert_scale.cpp @@ -1885,13 +1885,24 @@ void cv::normalize( InputArray _src, InputOutputArray _dst, double a, double b, CV_INSTRUMENT_REGION() double scale = 1, shift = 0; + int type = _src.type(), depth = CV_MAT_DEPTH(type); + + if( rtype < 0 ) + rtype = _dst.fixedType() ? _dst.depth() : depth; + if( norm_type == CV_MINMAX ) { double smin = 0, smax = 0; double dmin = MIN( a, b ), dmax = MAX( a, b ); minMaxIdx( _src, &smin, &smax, 0, 0, _mask ); scale = (dmax - dmin)*(smax - smin > DBL_EPSILON ? 1./(smax - smin) : 0); - shift = dmin - smin*scale; + if( rtype == CV_32F ) + { + scale = (float)scale; + shift = (float)dmin - (float)(smin*scale); + } + else + shift = dmin - smin*scale; } else if( norm_type == CV_L2 || norm_type == CV_L1 || norm_type == CV_C ) { @@ -1902,10 +1913,6 @@ void cv::normalize( InputArray _src, InputOutputArray _dst, double a, double b, else CV_Error( CV_StsBadArg, "Unknown/unsupported norm type" ); - int type = _src.type(), depth = CV_MAT_DEPTH(type); - if( rtype < 0 ) - rtype = _dst.fixedType() ? _dst.depth() : depth; - CV_OCL_RUN(_dst.isUMat(), ocl_normalize(_src, _dst, _mask, rtype, scale, shift)) diff --git a/modules/core/test/test_arithm.cpp b/modules/core/test/test_arithm.cpp index 6c90c1c..dd2ed9a 100644 --- a/modules/core/test/test_arithm.cpp +++ b/modules/core/test/test_arithm.cpp @@ -1918,6 +1918,25 @@ TEST(Normalize, regression_5876_inplace_change_type) EXPECT_EQ(0, cvtest::norm(m, result, NORM_INF)); } +TEST(Normalize, regression_6125) +{ + float initial_values[] = { + 1888, 1692, 369, 263, 199, + 280, 326, 129, 143, 126, + 233, 221, 130, 126, 150, + 249, 575, 574, 63, 12 + }; + + Mat src(Size(20, 1), CV_32F, initial_values); + float min = 0., max = 400.; + normalize(src, src, 0, 400, NORM_MINMAX, CV_32F); + for(int i = 0; i < 20; i++) + { + EXPECT_GE(src.at(i), min) << "Value should be >= 0"; + EXPECT_LE(src.at(i), max) << "Value should be <= 400"; + } +} + TEST(MinMaxLoc, regression_4955_nans) { cv::Mat one_mat(2, 2, CV_32F, cv::Scalar(1)); -- 2.7.4