diff --git a/modules/core/src/mathfuncs.cpp b/modules/core/src/mathfuncs.cpp index 4e25eed5e4..0ac641a117 100644 --- a/modules/core/src/mathfuncs.cpp +++ b/modules/core/src/mathfuncs.cpp @@ -2032,8 +2032,9 @@ template<> struct mat_type_assotiations static const type max_allowable = INT_MAX; }; +// inclusive maxVal !!! template -bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value) +bool checkIntegerRange(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value) { typedef mat_type_assotiations type_ass; @@ -2041,7 +2042,7 @@ bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double { return true; } - else if (minVal >= type_ass::max_allowable || maxVal <= type_ass::min_allowable || maxVal <= minVal) + else if (minVal > type_ass::max_allowable || maxVal < type_ass::min_allowable || maxVal < minVal) { bad_pt = cv::Point(0,0); return false; @@ -2051,7 +2052,7 @@ bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double for (int j = 0; j < as_one_channel.rows; ++j) for (int i = 0; i < as_one_channel.cols; ++i) { - if (as_one_channel.at(j ,i) < minVal || as_one_channel.at(j ,i) >= maxVal) + if (as_one_channel.at(j ,i) < minVal || as_one_channel.at(j ,i) > maxVal) { bad_pt.y = j ; bad_pt.x = i % src.channels(); @@ -2064,15 +2065,15 @@ bool chackIntegerRang(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double return true; } -typedef bool (*check_pange_function)(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value); +typedef bool (*check_range_function)(cv::Mat src, Point& bad_pt, int minVal, int maxVal, double& bad_value); -check_pange_function check_range_functions[] = +check_range_function check_range_functions[] = { - &chackIntegerRang, - &chackIntegerRang, - &chackIntegerRang, - &chackIntegerRang, - &chackIntegerRang + &checkIntegerRange, + &checkIntegerRange, + &checkIntegerRange, + &checkIntegerRange, + &checkIntegerRange }; bool checkRange(InputArray _src, bool quiet, Point* pt, double minVal, double maxVal) @@ -2102,8 +2103,9 @@ bool checkRange(InputArray _src, bool quiet, Point* pt, double minVal, double ma if (depth < CV_32F) { - int minVali = cvFloor(minVal); - int maxVali = cvCeil(maxVal); + // see "Bug #1784" + int minVali = minVal<(-INT_MAX - 1) ? (-INT_MAX - 1) : cvFloor(minVal); + int maxVali = maxVal>INT_MAX ? INT_MAX : cvCeil(maxVal) - 1; // checkIntegerRang() use inclusive maxVal (check_range_functions[depth])(src, badPt, minVali, maxVali, badValue); } diff --git a/modules/core/test/test_math.cpp b/modules/core/test/test_math.cpp index 1c4293b804..4d333c6439 100644 --- a/modules/core/test/test_math.cpp +++ b/modules/core/test/test_math.cpp @@ -2347,6 +2347,41 @@ void Core_SolvePolyTest::run( int ) } } +class Core_CheckRange_Empty : public cvtest::BaseTest +{ +public: + Core_CheckRange_Empty(){} + ~Core_CheckRange_Empty(){} +protected: + virtual void run( int start_from ); +}; + +void Core_CheckRange_Empty::run( int ) +{ + cv::Mat m; + ASSERT_TRUE( cv::checkRange(m) ); +} + +TEST(Core_CheckRange_Empty, accuracy) { Core_CheckRange_Empty test; test.safe_run(); } + +class Core_CheckRange_INT_MAX : public cvtest::BaseTest +{ +public: + Core_CheckRange_INT_MAX(){} + ~Core_CheckRange_INT_MAX(){} +protected: + virtual void run( int start_from ); +}; + +void Core_CheckRange_INT_MAX::run( int ) +{ + cv::Mat m(3, 3, CV_32SC1, cv::Scalar(INT_MAX)); + ASSERT_FALSE( cv::checkRange(m, true, 0, 0, INT_MAX) ); + ASSERT_TRUE( cv::checkRange(m) ); +} + +TEST(Core_CheckRange_INT_MAX, accuracy) { Core_CheckRange_INT_MAX test; test.safe_run(); } + template class Core_CheckRange : public testing::Test {}; TYPED_TEST_CASE_P(Core_CheckRange);