fixed mixed-type array operations (bug #2336)
authorVadim Pisarevsky <vadim.pisarevsky@itseez.com>
Wed, 19 Sep 2012 13:55:34 +0000 (17:55 +0400)
committerVadim Pisarevsky <vadim.pisarevsky@itseez.com>
Wed, 19 Sep 2012 13:55:34 +0000 (17:55 +0400)
modules/core/src/arithm.cpp
modules/core/test/test_operations.cpp

index e252a28..a3e5b05 100644 (file)
@@ -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) )
         {
index 77d05fe..ebdaaef 100644 (file)
@@ -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&)
     {