From 379ea15d1664a37a2f8851ce00e5feb8ce5b8d8d Mon Sep 17 00:00:00 2001 From: yuki takehara Date: Mon, 12 Feb 2018 20:36:54 +0900 Subject: [PATCH] Add new Mat constructor (#10808) * Add new Mat constructor * Fix build error * Fix build error * Fixed the code about 4 comments * Fixed three comments * delete previous local declaration * fix build error --- modules/core/include/opencv2/core/mat.hpp | 5 +++++ modules/core/include/opencv2/core/mat.inl.hpp | 17 +++++++++++++++++ modules/core/test/test_mat.cpp | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index da3baa9..41652d2 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -989,6 +989,10 @@ public: */ template::value>::type> explicit Mat(const std::initializer_list<_Tp> list); + + /** @overload + */ + template explicit Mat(const std::initializer_list sizes, const std::initializer_list<_Tp> list); #endif #ifdef CV_CXX_STD_ARRAY @@ -2208,6 +2212,7 @@ public: #ifdef CV_CXX11 Mat_(std::initializer_list<_Tp> values); + explicit Mat_(const std::initializer_list sizes, const std::initializer_list<_Tp> values); #endif #ifdef CV_CXX_STD_ARRAY diff --git a/modules/core/include/opencv2/core/mat.inl.hpp b/modules/core/include/opencv2/core/mat.inl.hpp index 74cee27..5f54d1f 100644 --- a/modules/core/include/opencv2/core/mat.inl.hpp +++ b/modules/core/include/opencv2/core/mat.inl.hpp @@ -584,6 +584,18 @@ Mat::Mat(const std::initializer_list<_Tp> list) return; Mat((int)list.size(), 1, traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this); } + +template inline +Mat::Mat(const std::initializer_list sizes, const std::initializer_list<_Tp> list) + : Mat() +{ + size_t size_total = 1; + int *sz = (int*)sizes.begin(); + for(auto s : sizes) + size_total *= s; + CV_Assert(list.size() != 0 || size_total == list.size()); + Mat((int)sizes.size(), sz, traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this); +} #endif #ifdef CV_CXX_STD_ARRAY @@ -1629,6 +1641,11 @@ template inline Mat_<_Tp>::Mat_(std::initializer_list<_Tp> list) : Mat(list) {} + +template inline +Mat_<_Tp>::Mat_(const std::initializer_list sizes, std::initializer_list<_Tp> list) + : Mat(sizes, list) +{} #endif #ifdef CV_CXX_STD_ARRAY diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index f632ec8..0d8a4af 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -1719,17 +1719,23 @@ TEST(Mat, from_initializer_list) { Mat A({1.f, 2.f, 3.f}); Mat_ B(3, 1); B << 1, 2, 3; + Mat_ C({3}, {1,2,3}); ASSERT_EQ(A.type(), CV_32F); ASSERT_DOUBLE_EQ(cvtest::norm(A, B, NORM_INF), 0.); + ASSERT_DOUBLE_EQ(cvtest::norm(A, C, NORM_INF), 0.); + ASSERT_DOUBLE_EQ(cvtest::norm(B, C, NORM_INF), 0.); } TEST(Mat_, from_initializer_list) { Mat_ A = {1, 2, 3}; Mat_ B(3, 1); B << 1, 2, 3; + Mat_ C({3}, {1,2,3}); ASSERT_DOUBLE_EQ(cvtest::norm(A, B, NORM_INF), 0.); + ASSERT_DOUBLE_EQ(cvtest::norm(A, C, NORM_INF), 0.); + ASSERT_DOUBLE_EQ(cvtest::norm(B, C, NORM_INF), 0.); } -- 2.7.4