From 3721c8bb068aceafce068ab459810440057d8254 Mon Sep 17 00:00:00 2001 From: Lee Jaehwan Date: Thu, 17 Jan 2019 23:23:09 +0900 Subject: [PATCH] Merge pull request #13586 from eightco:Core_bugfix3 * Add Operator override for multi-channel Mat with literal constant. * simple test * Operator overloading channel constraint for primitive types * fix some test for #13586 --- .../core/include/opencv2/core/operations.hpp | 20 +++++++++++ modules/core/test/test_mat.cpp | 36 +++++++++++++++++++ modules/dnn/test/test_tf_importer.cpp | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 082fef4440..2c38469446 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -256,6 +256,14 @@ Matx<_Tp, n, l> Matx<_Tp, m, n>::solve(const Matx<_Tp, m, l>& rhs, int method) c template static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \ template static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } +#define CV_MAT_AUG_OPERATOR_FOR1CHANNEL(op, cvop, A) \ + CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, A, double) \ + CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, const A, double) + +#define CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(op, cvop, A) \ + template CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, A, double) \ + template CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, const A, double) + CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Mat) CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar) CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat) @@ -263,6 +271,8 @@ CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Scalar) CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat_<_Tp>) CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat) CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_FOR1CHANNEL (+=, cv::add(a, b, a), Mat) +CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(+=, cv::add(a, b, a), Mat_<_Tp>) CV_MAT_AUG_OPERATOR (-=, cv::subtract(a,b,a), Mat, Mat) CV_MAT_AUG_OPERATOR (-=, cv::subtract(a,b,a), Mat, Scalar) @@ -271,6 +281,8 @@ CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a,b,a), Mat_<_Tp>, Scalar) CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a,b,a), Mat_<_Tp>, Mat_<_Tp>) CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a,Mat(b),a), Mat) CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a,Mat(b),a), Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_FOR1CHANNEL (-=, cv::subtract(a, b, a), Mat) +CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(-=, cv::subtract(a, b, a), Mat_<_Tp>) CV_MAT_AUG_OPERATOR (*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat, Mat) CV_MAT_AUG_OPERATOR_T(*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat_<_Tp>, Mat) @@ -295,6 +307,8 @@ CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a,b,a), Mat_<_Tp>, Scalar) CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a,b,a), Mat_<_Tp>, Mat_<_Tp>) CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), a), Mat) CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), a), Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_FOR1CHANNEL (&=, cv::bitwise_and(a, b, a), Mat) +CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(&=, cv::bitwise_and(a, b, a), Mat_<_Tp>) CV_MAT_AUG_OPERATOR (|=, cv::bitwise_or(a,b,a), Mat, Mat) CV_MAT_AUG_OPERATOR (|=, cv::bitwise_or(a,b,a), Mat, Scalar) @@ -303,6 +317,8 @@ CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a,b,a), Mat_<_Tp>, Scalar) CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a,b,a), Mat_<_Tp>, Mat_<_Tp>) CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), a), Mat) CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), a), Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_FOR1CHANNEL (|=, cv::bitwise_or(a, b, a), Mat) +CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(|=, cv::bitwise_or(a, b, a), Mat_<_Tp>) CV_MAT_AUG_OPERATOR (^=, cv::bitwise_xor(a,b,a), Mat, Mat) CV_MAT_AUG_OPERATOR (^=, cv::bitwise_xor(a,b,a), Mat, Scalar) @@ -311,7 +327,11 @@ CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a,b,a), Mat_<_Tp>, Scalar) CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a,b,a), Mat_<_Tp>, Mat_<_Tp>) CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), a), Mat) CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), a), Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_FOR1CHANNEL (^=, cv::bitwise_xor(a, b, a), Mat) +CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(^=, cv::bitwise_xor(a, b, a), Mat_<_Tp>) +#undef CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL +#undef CV_MAT_AUG_OPERATOR_FOR1CHANNEL #undef CV_MAT_AUG_OPERATOR_TN #undef CV_MAT_AUG_OPERATOR_T #undef CV_MAT_AUG_OPERATOR diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index f69140bb8c..14174e560e 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -1644,7 +1644,43 @@ TEST(Mat, regression_10507_mat_setTo) } } +template +static void OverloadingTestFor1Channel_EachOp(const MatType& m, Type c) +{ + EXPECT_ANY_THROW(m += c); + EXPECT_ANY_THROW(m -= c); + EXPECT_ANY_THROW(m &= c); + EXPECT_ANY_THROW(m |= c); + EXPECT_ANY_THROW(m ^= c); +} + +template +static void OverloadingTestFor1Channel_EachType(const MatType& m) +{ + OverloadingTestFor1Channel_EachOp< MatType, bool> (m, true); + OverloadingTestFor1Channel_EachOp< MatType, char> (m, (char)1); + OverloadingTestFor1Channel_EachOp< MatType, unsigned char> (m, (unsigned char)1); + OverloadingTestFor1Channel_EachOp< MatType, short> (m, (short)1); + OverloadingTestFor1Channel_EachOp< MatType, unsigned short> (m, (unsigned short)1); + OverloadingTestFor1Channel_EachOp< MatType, int> (m, 1); + OverloadingTestFor1Channel_EachOp< MatType, unsigned int> (m, (unsigned int)1); + OverloadingTestFor1Channel_EachOp< MatType, long> (m, (long)1); + OverloadingTestFor1Channel_EachOp< MatType, unsigned long> (m, (unsigned long)1); + OverloadingTestFor1Channel_EachOp< MatType, float> (m, 1.0f); + OverloadingTestFor1Channel_EachOp< MatType, double> (m, 1.0); +} + +TEST(Mat, regression_13586) +{ + Mat m1(2, 2, CV_8UC3, Scalar::all(1)); + OverloadingTestFor1Channel_EachType(m1); + Mat4b m2(2, 2); + m2.setTo(0); + OverloadingTestFor1Channel_EachType(m2); +} + #ifdef CV_CXX_STD_ARRAY + TEST(Core_Mat_array, outputArray_create_getMat) { cv::Mat_ src_base(5, 1); diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index ce4997cd4e..cc7f26196b 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -40,7 +40,7 @@ TEST(Test_TensorFlow, read_inception) ASSERT_TRUE(!sample.empty()); Mat input; resize(sample, input, Size(224, 224)); - input -= 128; // mean sub + input -= Scalar::all(117); // mean sub Mat inputBlob = blobFromImage(input); -- GitLab