From 1ded1597e77c2710635173d5339b51ee1b4cf87e Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Wed, 19 Sep 2012 17:55:34 +0400 Subject: [PATCH] fixed mixed-type array operations (bug #2336) --- modules/core/src/arithm.cpp | 5 ++--- modules/core/test/test_operations.cpp | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/core/src/arithm.cpp b/modules/core/src/arithm.cpp index e252a28..a3e5b05 100644 --- a/modules/core/src/arithm.cpp +++ b/modules/core/src/arithm.cpp @@ -1224,7 +1224,7 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst, bool haveMask = !_mask.empty(); bool reallocate = false; - if( kind1 == kind2 && src1.dims <= 2 && src2.dims <= 2 && + if( (kind1 == kind2 || src1.channels() == 1) && src1.dims <= 2 && src2.dims <= 2 && src1.size() == src2.size() && src1.type() == src2.type() && !haveMask && ((!_dst.fixedType() && (dtype < 0 || CV_MAT_DEPTH(dtype) == src1.depth())) || (_dst.fixedType() && _dst.type() == _src1.type())) ) @@ -1238,8 +1238,7 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst, bool haveScalar = false, swapped12 = false; - if( (kind1 == _InputArray::MATX) + (kind2 == _InputArray::MATX) == 1 || - src1.size != src2.size || src1.channels() != src2.channels() ) + if( src1.size != src2.size || src1.channels() != src2.channels() ) { if( checkScalar(src1, src2.type(), kind1, kind2) ) { diff --git a/modules/core/test/test_operations.cpp b/modules/core/test/test_operations.cpp index 77d05fe..ebdaaef 100644 --- a/modules/core/test/test_operations.cpp +++ b/modules/core/test/test_operations.cpp @@ -959,9 +959,16 @@ bool CV_OperationsTest::operations1() minval == -7 && maxval == 12)) throw test_excep(); - Matx33f b(1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f), c; + Matx33f b(1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f); + Mat c; add(Mat::zeros(3, 3, CV_32F), b, c); CV_Assert( norm(b, c, CV_C) == 0 ); + + add(Mat::zeros(3, 3, CV_64F), b, c, noArray(), c.type()); + CV_Assert( norm(b, c, CV_C) == 0 ); + + add(Mat::zeros(6, 1, CV_64F), 1, c, noArray(), c.type()); + CV_Assert( norm(Matx61f(1.f, 1.f, 1.f, 1.f, 1.f, 1.f), c, CV_C) == 0 ); } catch(const test_excep&) { -- 2.7.4