From 344d9fd83f048d083783eaa792bccefed83c7815 Mon Sep 17 00:00:00 2001 From: Gleb Gladilov Date: Mon, 20 Jul 2015 15:10:46 +0300 Subject: [PATCH] Fixed minMaxLoc and test functions --- modules/core/src/stat.cpp | 12 ++++++++++-- modules/ts/src/ts_func.cpp | 15 ++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index 0a4c0415c..ebb845a14 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -2331,8 +2331,8 @@ void cv::minMaxIdx(InputArray _src, double* minVal, size_t minidx = 0, maxidx = 0; int iminval = INT_MAX, imaxval = INT_MIN; - float fminval = FLT_MAX, fmaxval = -FLT_MAX; - double dminval = DBL_MAX, dmaxval = -DBL_MAX; + float fminval = std::numeric_limits::infinity(), fmaxval = -fminval; + double dminval = std::numeric_limits::infinity(), dmaxval = -dminval; size_t startidx = 1; int *minval = &iminval, *maxval = &imaxval; int planeSize = (int)it.size*cn; @@ -2345,6 +2345,14 @@ void cv::minMaxIdx(InputArray _src, double* minVal, for( size_t i = 0; i < it.nplanes; i++, ++it, startidx += planeSize ) func( ptrs[0], ptrs[1], minval, maxval, &minidx, &maxidx, planeSize, startidx ); + if (!src.empty() && mask.empty()) + { + if( minidx == 0 ) + minidx = 1; + if( maxidx == 0 ) + maxidx = 1; + } + if( minidx == 0 ) dminval = dmaxval = 0; else if( depth == CV_32F ) diff --git a/modules/ts/src/ts_func.cpp b/modules/ts/src/ts_func.cpp index f5fed678d..202a96f36 100644 --- a/modules/ts/src/ts_func.cpp +++ b/modules/ts/src/ts_func.cpp @@ -980,12 +980,12 @@ minMaxLoc_(const _Tp* src, size_t total, size_t startidx, for( size_t i = 0; i < total; i++ ) { _Tp val = src[i]; - if( minval > val ) + if( minval > val || !minpos ) { minval = val; minpos = startidx + i; } - if( maxval < val ) + if( maxval < val || !maxpos ) { maxval = val; maxpos = startidx + i; @@ -997,12 +997,12 @@ minMaxLoc_(const _Tp* src, size_t total, size_t startidx, for( size_t i = 0; i < total; i++ ) { _Tp val = src[i]; - if( minval > val && mask[i] ) + if( (minval > val || !minpos) && mask[i] ) { minval = val; minpos = startidx + i; } - if( maxval < val && mask[i] ) + if( (maxval < val || !maxpos) && mask[i] ) { maxval = val; maxpos = startidx + i; @@ -1049,8 +1049,8 @@ void minMaxLoc(const Mat& src, double* _minval, double* _maxval, size_t startidx = 1, total = planes[0].total(); size_t i, nplanes = it.nplanes; int depth = src.depth(); - double maxval = depth < CV_32F ? INT_MIN : depth == CV_32F ? -FLT_MAX : -DBL_MAX; - double minval = depth < CV_32F ? INT_MAX : depth == CV_32F ? FLT_MAX : DBL_MAX; + double minval = 0; + double maxval = 0; size_t maxidx = 0, minidx = 0; for( i = 0; i < nplanes; i++, ++it, startidx += total ) @@ -1093,9 +1093,6 @@ void minMaxLoc(const Mat& src, double* _minval, double* _maxval, } } - if( minidx == 0 ) - minval = maxval = 0; - if( _maxval ) *_maxval = maxval; if( _minval )