From 6997d423c8149ac334aa97a8c2348fd533953395 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 25 Dec 2015 15:33:06 +0300 Subject: [PATCH 1/2] fix normalize in case of inplace operations fixes #5876 --- modules/core/src/convert.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/core/src/convert.cpp b/modules/core/src/convert.cpp index 6c693a43a0..f41bfa105f 100644 --- a/modules/core/src/convert.cpp +++ b/modules/core/src/convert.cpp @@ -5352,22 +5352,21 @@ 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), cn = CV_MAT_CN(type); + int type = _src.type(), depth = CV_MAT_DEPTH(type); if( rtype < 0 ) rtype = _dst.fixedType() ? _dst.depth() : depth; - _dst.createSameSize(_src, CV_MAKETYPE(rtype, cn)); CV_OCL_RUN(_dst.isUMat(), ocl_normalize(_src, _dst, _mask, rtype, scale, shift)) - Mat src = _src.getMat(), dst = _dst.getMat(); + Mat src = _src.getMat(); if( _mask.empty() ) - src.convertTo( dst, rtype, scale, shift ); + src.convertTo( _dst, rtype, scale, shift ); else { Mat temp; src.convertTo( temp, rtype, scale, shift ); - temp.copyTo( dst, _mask ); + temp.copyTo( _dst, _mask ); } } From 17e4d33b0e0f2927e75fd16603ab1e8825b1fc56 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 25 Dec 2015 16:02:47 +0300 Subject: [PATCH 2/2] added regression test for #5876 --- modules/core/test/ocl/test_arithm.cpp | 16 ++++++++++++++++ modules/core/test/test_arithm.cpp | 11 +++++++++++ 2 files changed, 27 insertions(+) diff --git a/modules/core/test/ocl/test_arithm.cpp b/modules/core/test/ocl/test_arithm.cpp index f1efe9b22d..85dca9649b 100644 --- a/modules/core/test/ocl/test_arithm.cpp +++ b/modules/core/test/ocl/test_arithm.cpp @@ -1885,6 +1885,22 @@ OCL_INSTANTIATE_TEST_CASE_P(Arithm, ReduceMin, Combine(testing::Values(std::make OCL_ALL_CHANNELS, testing::Values(0, 1), Bool())); +// T-API BUG (haveOpenCL() is false): modules/core/src/matrix.cpp:212: error: (-215) u->refcount == 0 in function deallocate +OCL_TEST(Normalize, DISABLED_regression_5876_inplace_change_type) +{ + double initial_values[] = {1, 2, 5, 4, 3}; + float result_values[] = {0, 0.25, 1, 0.75, 0.5}; + Mat m(Size(5, 1), CV_64FC1, initial_values); + Mat result(Size(5, 1), CV_32FC1, result_values); + + UMat um; m.copyTo(um); + UMat uresult; result.copyTo(uresult); + + OCL_ON(normalize(um, um, 1, 0, NORM_MINMAX, CV_32F)); + + EXPECT_EQ(0, cvtest::norm(um, uresult, NORM_INF)); +} + } } // namespace cvtest::ocl #endif // HAVE_OPENCL diff --git a/modules/core/test/test_arithm.cpp b/modules/core/test/test_arithm.cpp index 0471ffc0b4..ace7950a64 100644 --- a/modules/core/test/test_arithm.cpp +++ b/modules/core/test/test_arithm.cpp @@ -1833,3 +1833,14 @@ TEST(MinMaxLoc, Mat_IntMax_Without_Mask) ASSERT_EQ(Point(0, 0), minLoc); ASSERT_EQ(Point(0, 0), maxLoc); } + +TEST(Normalize, regression_5876_inplace_change_type) +{ + double initial_values[] = {1, 2, 5, 4, 3}; + float result_values[] = {0, 0.25, 1, 0.75, 0.5}; + Mat m(Size(5, 1), CV_64FC1, initial_values); + Mat result(Size(5, 1), CV_32FC1, result_values); + + normalize(m, m, 1, 0, NORM_MINMAX, CV_32F); + EXPECT_EQ(0, cvtest::norm(m, result, NORM_INF)); +}