From 7a3ca99894eabd0ea5f6d42797627ad115ee4a3c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicu=20=C8=98tiurc=C4=83?= Date: Tue, 20 Jan 2015 23:44:03 -0500 Subject: [PATCH] fix _OutputArray::assign() for _OutputArrays of type MATX when data types differ --- modules/core/src/matrix.cpp | 2 +- modules/core/test/test_misc.cpp | 104 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 04d6fb4..3bd9f2c 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -2668,7 +2668,7 @@ void _OutputArray::assign(const Mat& m) const } else if (k == MATX) { - getMat() = m; + m.copyTo(getMat()); } else { diff --git a/modules/core/test/test_misc.cpp b/modules/core/test/test_misc.cpp index d37f0ee..0438065 100644 --- a/modules/core/test/test_misc.cpp +++ b/modules/core/test/test_misc.cpp @@ -26,3 +26,107 @@ TEST(Core_SaturateCast, NegativeNotClipped) ASSERT_EQ(0xffffffff, val); } + +template +static double maxAbsDiff(const T &t, const U &u) +{ + Mat_ d; + absdiff(t, u, d); + double ret; + minMaxLoc(d, NULL, &ret); + return ret; +} + +TEST(Core_OutputArrayAssign, _Matxd_Matd) +{ + Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); + Matx23d actualx; + + { + OutputArray oa(actualx); + oa.assign(expected); + } + + Mat actual = (Mat) actualx; + + EXPECT_LE(maxAbsDiff(expected, actual), 0.0); +} + +TEST(Core_OutputArrayAssign, _Matxd_Matf) +{ + Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); + Matx23d actualx; + + { + OutputArray oa(actualx); + oa.assign(expected); + } + + Mat actual = (Mat) actualx; + + EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); +} + +TEST(Core_OutputArrayAssign, _Matxf_Matd) +{ + Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); + Matx23f actualx; + + { + OutputArray oa(actualx); + oa.assign(expected); + } + + Mat actual = (Mat) actualx; + + EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); +} + +TEST(Core_OutputArrayAssign, _Matxd_UMatd) +{ + Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); + UMat uexpected = expected.getUMat(ACCESS_READ); + Matx23d actualx; + + { + OutputArray oa(actualx); + oa.assign(uexpected); + } + + Mat actual = (Mat) actualx; + + EXPECT_LE(maxAbsDiff(expected, actual), 0.0); +} + +TEST(Core_OutputArrayAssign, _Matxd_UMatf) +{ + Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); + UMat uexpected = expected.getUMat(ACCESS_READ); + Matx23d actualx; + + { + OutputArray oa(actualx); + oa.assign(uexpected); + } + + Mat actual = (Mat) actualx; + + EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); +} + +TEST(Core_OutputArrayAssign, _Matxf_UMatd) +{ + Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); + UMat uexpected = expected.getUMat(ACCESS_READ); + Matx23f actualx; + + { + OutputArray oa(actualx); + oa.assign(uexpected); + } + + Mat actual = (Mat) actualx; + + EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); +} + -- 2.7.4