提交 3721c8bb 编写于 作者: L Lee Jaehwan 提交者: Alexander Alekhin

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
上级 b9496f8d
...@@ -256,6 +256,14 @@ Matx<_Tp, n, l> Matx<_Tp, m, n>::solve(const Matx<_Tp, m, l>& rhs, int method) c ...@@ -256,6 +256,14 @@ Matx<_Tp, n, l> Matx<_Tp, m, n>::solve(const Matx<_Tp, m, l>& rhs, int method) c
template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \ template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \
template<typename _Tp, int m, int n> static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } template<typename _Tp, int m, int n> 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<typename _Tp> CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, A, double) \
template<typename _Tp> 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, Mat)
CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar) CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar)
CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat) 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) ...@@ -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_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)
CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>) 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, Mat)
CV_MAT_AUG_OPERATOR (-=, cv::subtract(a,b,a), Mat, Scalar) 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) ...@@ -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_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)
CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a,Mat(b),a), Mat_<_Tp>) 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 (*=, 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) 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) ...@@ -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_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)
CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), a), Mat_<_Tp>) 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, Mat)
CV_MAT_AUG_OPERATOR (|=, cv::bitwise_or(a,b,a), Mat, Scalar) 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) ...@@ -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_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)
CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), a), Mat_<_Tp>) 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, Mat)
CV_MAT_AUG_OPERATOR (^=, cv::bitwise_xor(a,b,a), Mat, Scalar) 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) ...@@ -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_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)
CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), a), Mat_<_Tp>) 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_TN
#undef CV_MAT_AUG_OPERATOR_T #undef CV_MAT_AUG_OPERATOR_T
#undef CV_MAT_AUG_OPERATOR #undef CV_MAT_AUG_OPERATOR
......
...@@ -1644,7 +1644,43 @@ TEST(Mat, regression_10507_mat_setTo) ...@@ -1644,7 +1644,43 @@ TEST(Mat, regression_10507_mat_setTo)
} }
} }
template<typename MatType, typename Type>
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<typename MatType>
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 #ifdef CV_CXX_STD_ARRAY
TEST(Core_Mat_array, outputArray_create_getMat) TEST(Core_Mat_array, outputArray_create_getMat)
{ {
cv::Mat_<uchar> src_base(5, 1); cv::Mat_<uchar> src_base(5, 1);
......
...@@ -40,7 +40,7 @@ TEST(Test_TensorFlow, read_inception) ...@@ -40,7 +40,7 @@ TEST(Test_TensorFlow, read_inception)
ASSERT_TRUE(!sample.empty()); ASSERT_TRUE(!sample.empty());
Mat input; Mat input;
resize(sample, input, Size(224, 224)); resize(sample, input, Size(224, 224));
input -= 128; // mean sub input -= Scalar::all(117); // mean sub
Mat inputBlob = blobFromImage(input); Mat inputBlob = blobFromImage(input);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册