From d268f6d02e35186cfe8624a07860daf25efe8fe2 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 8 Sep 2025 02:50:41 +0300 Subject: [PATCH 1/7] fixed compile errors for MatShape/MatSize refactoring --- modules/gapi/include/opencv2/gapi/own/convert.hpp | 4 ++-- .../onevpl_infer_with_advanced_device_selection.cpp | 2 +- modules/gapi/samples/semantic_segmentation.cpp | 4 ++-- modules/gapi/src/api/gmat.cpp | 4 ++-- modules/gapi/src/backends/common/gbackend.hpp | 10 +++++++--- modules/gapi/src/backends/common/serialization.cpp | 2 +- modules/gapi/src/backends/cpu/gnnparsers.cpp | 6 +++--- modules/gapi/src/backends/ie/giebackend.cpp | 6 +++--- modules/gapi/test/common/gapi_parsers_tests_common.hpp | 4 ++-- modules/gapi/test/gapi_sample_pipelines.cpp | 4 ++-- 10 files changed, 25 insertions(+), 21 deletions(-) diff --git a/modules/gapi/include/opencv2/gapi/own/convert.hpp b/modules/gapi/include/opencv2/gapi/own/convert.hpp index 7bebec9cf0a..c1efe3e1fbc 100644 --- a/modules/gapi/include/opencv2/gapi/own/convert.hpp +++ b/modules/gapi/include/opencv2/gapi/own/convert.hpp @@ -17,8 +17,8 @@ namespace cv { template std::vector to_own(const cv::MatSize &sz) { - std::vector result(sz.dims()); - for (int i = 0; i < sz.dims(); i++) { + std::vector result(sz.dims); + for (int i = 0; i < sz.dims; i++) { // Note: cv::MatSize is not iterable result[i] = static_cast(sz[i]); } diff --git a/modules/gapi/samples/onevpl_infer_with_advanced_device_selection.cpp b/modules/gapi/samples/onevpl_infer_with_advanced_device_selection.cpp index de1d233ae5a..ad1690dbc16 100644 --- a/modules/gapi/samples/onevpl_infer_with_advanced_device_selection.cpp +++ b/modules/gapi/samples/onevpl_infer_with_advanced_device_selection.cpp @@ -225,7 +225,7 @@ GAPI_OCV_KERNEL(OCVParseSSD, ParseSSD) { const cv::Size &in_parent_size, std::vector &out_objects) { const auto &in_ssd_dims = in_ssd_result.size; - GAPI_Assert(in_ssd_dims.dims() == 4u); + GAPI_Assert(in_ssd_dims.dims == 4); const int MAX_PROPOSALS = in_ssd_dims[2]; const int OBJECT_SIZE = in_ssd_dims[3]; diff --git a/modules/gapi/samples/semantic_segmentation.cpp b/modules/gapi/samples/semantic_segmentation.cpp index db358816d14..bb800cecc61 100644 --- a/modules/gapi/samples/semantic_segmentation.cpp +++ b/modules/gapi/samples/semantic_segmentation.cpp @@ -144,9 +144,9 @@ G_API_OP(PostProcessing, , "sample.custom.post_pro GAPI_OCV_KERNEL(OCVPostProcessing, PostProcessing) { static void run(const cv::Mat &in, const cv::Mat &out_blob, cv::Mat &out) { int C = -1, H = -1, W = -1; - if (out_blob.size.dims() == 4u) { + if (out_blob.size.dims == 4) { C = 1; H = 2, W = 3; - } else if (out_blob.size.dims() == 3u) { + } else if (out_blob.size.dims == 3) { C = 0; H = 1, W = 2; } else { throw std::logic_error( diff --git a/modules/gapi/src/api/gmat.cpp b/modules/gapi/src/api/gmat.cpp index fd5b048fcb1..53acbe02e02 100644 --- a/modules/gapi/src/api/gmat.cpp +++ b/modules/gapi/src/api/gmat.cpp @@ -87,7 +87,7 @@ namespace{ #if !defined(GAPI_STANDALONE) cv::GMatDesc cv::descr_of(const cv::Mat &mat) { - const auto mat_dims = mat.size.dims(); + const auto mat_dims = mat.size.dims; if (mat_dims <= 2) return GMatDesc{mat.depth(), mat.channels(), {mat.cols, mat.rows}}; @@ -111,7 +111,7 @@ cv::GMatDesc cv::gapi::own::descr_of(const Mat &mat) #if !defined(GAPI_STANDALONE) cv::GMatDesc cv::descr_of(const cv::UMat &mat) { - GAPI_Assert(mat.size.dims() == 2); + GAPI_Assert(mat.size.dims == 2); return GMatDesc{ mat.depth(), mat.channels(),{ mat.cols, mat.rows } }; } diff --git a/modules/gapi/src/backends/common/gbackend.hpp b/modules/gapi/src/backends/common/gbackend.hpp index b503d38a4cc..01fd9287fe9 100644 --- a/modules/gapi/src/backends/common/gbackend.hpp +++ b/modules/gapi/src/backends/common/gbackend.hpp @@ -46,9 +46,13 @@ namespace gimpl { #if !defined(GAPI_STANDALONE) int m_dims = m.dims < 2 ? 2 : m.dims; RMat::View::stepsT steps(m_dims); - const size_t* m_step = m.dims <= 2 ? m.step.buf : m.step.p; - for (int i = 0; i < m_dims; i++) { - steps[i] = m_step[i]; + if (m_dims >= 2) { + for (int i = 0; i < m_dims; i++) { + steps[i] = m.step.p[i]; + } + } else { + steps[1] = m.step.p[0]; + steps[0] = m.cols*steps[1]; } return RMat::View(cv::descr_of(m), m.data, steps, std::move(cb)); #else diff --git a/modules/gapi/src/backends/common/serialization.cpp b/modules/gapi/src/backends/common/serialization.cpp index 6fe924e61ba..89f0aa9ed1c 100644 --- a/modules/gapi/src/backends/common/serialization.cpp +++ b/modules/gapi/src/backends/common/serialization.cpp @@ -276,7 +276,7 @@ void read_mat_data(IIStream &is, cv::Mat &m) { IOStream& operator<< (IOStream& os, const cv::Mat &m) { #if !defined(GAPI_STANDALONE) - GAPI_Assert(m.size.dims() == 2 && "Only 2D images are supported now"); + GAPI_Assert(m.size.dims == 2 && "Only 2D images are supported now"); #else GAPI_Assert(m.dims.size() == 2 && "Only 2D images are supported now"); #endif diff --git a/modules/gapi/src/backends/cpu/gnnparsers.cpp b/modules/gapi/src/backends/cpu/gnnparsers.cpp index 26de960b7f7..a16b2462c06 100644 --- a/modules/gapi/src/backends/cpu/gnnparsers.cpp +++ b/modules/gapi/src/backends/cpu/gnnparsers.cpp @@ -102,7 +102,7 @@ class SSDParser : m_dims(in_ssd_dims), m_maxProp(in_ssd_dims[2]), m_objSize(in_ssd_dims[3]), m_data(data), m_surface(cv::Rect({0,0}, in_size)), m_size(in_size) { - GAPI_Assert(in_ssd_dims.dims() == 4u); // Fixed output layout + GAPI_Assert(in_ssd_dims.dims == 4); // Fixed output layout GAPI_Assert(m_objSize == 7); // Fixed SSD object size } @@ -220,7 +220,7 @@ void ParseSSD(const cv::Mat& in_ssd_result, } static void checkYoloDims(const MatSize& dims) { - const auto d = dims.dims(); + const auto d = dims.dims; // Accept 1x13x13xN and 13x13xN GAPI_Assert(d >= 2); if (d >= 3) { @@ -252,7 +252,7 @@ void parseYolo(const cv::Mat& in_yolo_result, const auto& dims = in_yolo_result.size; checkYoloDims(dims); int acc = 1; - for (int i = 0; i < dims.dims(); i++) { + for (int i = 0; i < dims.dims; i++) { acc *= dims[i]; } const auto num_classes = acc/(5*13*13)-5; diff --git a/modules/gapi/src/backends/ie/giebackend.cpp b/modules/gapi/src/backends/ie/giebackend.cpp index 119539db423..6cd9c89886f 100644 --- a/modules/gapi/src/backends/ie/giebackend.cpp +++ b/modules/gapi/src/backends/ie/giebackend.cpp @@ -236,7 +236,7 @@ cv::gapi::ie::TraitAs clarifyTrait(const cv::GMetaArg &meta, inline IE::TensorDesc toIE(const cv::Mat &mat, cv::gapi::ie::TraitAs hint) { const auto &sz = mat.size; - if (sz.dims() == 2 && hint == cv::gapi::ie::TraitAs::IMAGE) + if (sz.dims == 2 && hint == cv::gapi::ie::TraitAs::IMAGE) { // NB: This logic is mainly taken from IE samples const size_t channels = mat.channels(); @@ -253,7 +253,7 @@ inline IE::TensorDesc toIE(const cv::Mat &mat, cv::gapi::ie::TraitAs hint) { return IE::TensorDesc(toIE(mat.depth()), IE::SizeVector{1, channels, height, width}, bdesc); } - return IE::TensorDesc(toIE(mat.depth()), toIE(sz), toIELayout(sz.dims())); + return IE::TensorDesc(toIE(mat.depth()), toIE(sz), toIELayout(sz.dims)); } // NB: Inference dimmensions always follow NCDHW order @@ -296,7 +296,7 @@ inline IE::TensorDesc toIE(const cv::Mat &mat, const cv::gapi::ie::TraitAs hint, const IE::Layout layout) { const auto &sz = mat.size; - if (sz.dims() == 2 && hint == cv::gapi::ie::TraitAs::IMAGE) + if (sz.dims == 2 && hint == cv::gapi::ie::TraitAs::IMAGE) { // NB: This logic is mainly taken from IE samples const size_t channels = mat.channels(); diff --git a/modules/gapi/test/common/gapi_parsers_tests_common.hpp b/modules/gapi/test/common/gapi_parsers_tests_common.hpp index 328f86b8517..002b4edb4a3 100644 --- a/modules/gapi/test/common/gapi_parsers_tests_common.hpp +++ b/modules/gapi/test/common/gapi_parsers_tests_common.hpp @@ -48,7 +48,7 @@ class ParserSSDTest { out_boxes.clear(); const auto &in_ssd_dims = in_ssd_result.size; - CV_Assert(in_ssd_dims.dims() == 4u); + CV_Assert(in_ssd_dims.dims == 4); const int MAX_PROPOSALS = in_ssd_dims[2]; const int OBJECT_SIZE = in_ssd_dims[3]; @@ -99,7 +99,7 @@ class ParserSSDTest out_boxes.clear(); out_labels.clear(); const auto &in_ssd_dims = in_ssd_result.size; - CV_Assert(in_ssd_dims.dims() == 4u); + CV_Assert(in_ssd_dims.dims == 4); const int MAX_PROPOSALS = in_ssd_dims[2]; const int OBJECT_SIZE = in_ssd_dims[3]; diff --git a/modules/gapi/test/gapi_sample_pipelines.cpp b/modules/gapi/test/gapi_sample_pipelines.cpp index cae85f8af33..fabc29b69ca 100644 --- a/modules/gapi/test/gapi_sample_pipelines.cpp +++ b/modules/gapi/test/gapi_sample_pipelines.cpp @@ -495,13 +495,13 @@ TEST(DISABLED_GAPI_Pipeline, GraphOutputIs1DMat) // NB: Computation is able to write 1D output cv::Mat to empty out_mat. ASSERT_NO_THROW(cc(cv::gin(in_mat), cv::gout(out_mat))); - ASSERT_EQ(1, out_mat.size.dims()); + ASSERT_EQ(1, out_mat.size.dims); ASSERT_EQ(dim, out_mat.size[0]); // NB: Computation is able to write 1D output cv::Mat // to pre-allocated with the same meta out_mat. ASSERT_NO_THROW(cc(cv::gin(in_mat), cv::gout(out_mat))); - ASSERT_EQ(1, out_mat.size.dims()); + ASSERT_EQ(1, out_mat.size.dims); ASSERT_EQ(dim, out_mat.size[0]); } From d6622fa1e907ed672d32f3e4b84e82f2d4fd1ea7 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 8 Sep 2025 03:03:04 +0300 Subject: [PATCH 2/7] fixed another compile error --- modules/gapi/samples/pipeline_modeling_tool/utils.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gapi/samples/pipeline_modeling_tool/utils.hpp b/modules/gapi/samples/pipeline_modeling_tool/utils.hpp index 0297aed53a1..c0f87a49f8c 100644 --- a/modules/gapi/samples/pipeline_modeling_tool/utils.hpp +++ b/modules/gapi/samples/pipeline_modeling_tool/utils.hpp @@ -38,7 +38,7 @@ inline void generateRandom(cv::Mat& out) { break; case CV_16F: { std::vector dims; - for (int i = 0; i < out.size.dims(); ++i) { + for (int i = 0; i < out.size.dims; ++i) { dims.push_back(out.size[i]); } cv::Mat fp32_mat; From 2bbe9c788765b1b98b7a3e757c431e1a8f2294b8 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 8 Sep 2025 04:07:41 +0300 Subject: [PATCH 3/7] some more potential fixes (even though manually patching dims is a bad style, need to fix to properly). --- modules/gapi/src/api/gbackend.cpp | 2 +- modules/gapi/test/gapi_sample_pipelines.cpp | 4 ++-- modules/gapi/test/rmat/rmat_view_tests.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/gapi/src/api/gbackend.cpp b/modules/gapi/src/api/gbackend.cpp index dc51eef76df..91970f3779a 100644 --- a/modules/gapi/src/api/gbackend.cpp +++ b/modules/gapi/src/api/gbackend.cpp @@ -411,7 +411,7 @@ void createMat(const cv::GMatDesc &desc, cv::Mat& mat) #if !defined(GAPI_STANDALONE) // NB: WA for 1D mats. if (desc.dims.size() == 1u) { - mat.dims = 1; + mat.size.dims = mat.dims = 1; } #endif } diff --git a/modules/gapi/test/gapi_sample_pipelines.cpp b/modules/gapi/test/gapi_sample_pipelines.cpp index fabc29b69ca..d493a0d1f1a 100644 --- a/modules/gapi/test/gapi_sample_pipelines.cpp +++ b/modules/gapi/test/gapi_sample_pipelines.cpp @@ -512,7 +512,7 @@ TEST(DISABLED_GAPI_Pipeline, 1DMatBetweenIslands) cv::Mat out_mat; cv::Mat ref_mat({dim}, CV_8U); - ref_mat.dims = 1; + ref_mat.size.dims = ref_mat.dims = 1; ref_mat.setTo(0); cv::GMat in; @@ -534,7 +534,7 @@ TEST(DISABLED_GAPI_Pipeline, 1DMatWithinSingleIsland) cv::Mat out_mat; cv::Mat ref_mat({dim}, CV_8U); - ref_mat.dims = 1; + ref_mat.size.dims = ref_mat.dims = 1; ref_mat.setTo(0); cv::GMat in; diff --git a/modules/gapi/test/rmat/rmat_view_tests.cpp b/modules/gapi/test/rmat/rmat_view_tests.cpp index 36ff5adf5bb..74ba6680385 100644 --- a/modules/gapi/test/rmat/rmat_view_tests.cpp +++ b/modules/gapi/test/rmat/rmat_view_tests.cpp @@ -76,7 +76,7 @@ TEST_P(RMatViewNDTest, DefaultStep) { std::tie(depth, ndims) = GetParam(); std::vector dims(ndims, 12); GMatDesc desc; - desc.dims = dims; + desc.size.dims = desc.dims = dims; desc.depth = depth; GAPI_Assert(desc.chan == -1); auto elemSize = CV_ELEM_SIZE(depth); @@ -113,7 +113,7 @@ TEST_P(RMatViewNDTest, StepFromView) { std::vector dims(ndims, 12); std::vector aligned(ndims, 16); GMatDesc desc; - desc.dims = dims; + desc.size.dims = desc.dims = dims; desc.depth = depth; GAPI_Assert(desc.chan == -1); auto elemSize = CV_ELEM_SIZE(depth); @@ -145,7 +145,7 @@ TEST_P(RMatViewNDTestNegative, DefaultStep) { std::tie(depth, chan, ndims) = GetParam(); std::vector dims(ndims, 12); GMatDesc desc; - desc.dims = dims; + desc.size.dims = desc.dims = dims; desc.depth = depth; desc.chan = chan; auto elemSize = CV_ELEM_SIZE(depth); From 44adddc0add9d85afa0719745b5f436b2f022724 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 8 Sep 2025 04:14:02 +0300 Subject: [PATCH 4/7] reverted a few buggy changes --- modules/gapi/test/rmat/rmat_view_tests.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/gapi/test/rmat/rmat_view_tests.cpp b/modules/gapi/test/rmat/rmat_view_tests.cpp index 74ba6680385..36ff5adf5bb 100644 --- a/modules/gapi/test/rmat/rmat_view_tests.cpp +++ b/modules/gapi/test/rmat/rmat_view_tests.cpp @@ -76,7 +76,7 @@ TEST_P(RMatViewNDTest, DefaultStep) { std::tie(depth, ndims) = GetParam(); std::vector dims(ndims, 12); GMatDesc desc; - desc.size.dims = desc.dims = dims; + desc.dims = dims; desc.depth = depth; GAPI_Assert(desc.chan == -1); auto elemSize = CV_ELEM_SIZE(depth); @@ -113,7 +113,7 @@ TEST_P(RMatViewNDTest, StepFromView) { std::vector dims(ndims, 12); std::vector aligned(ndims, 16); GMatDesc desc; - desc.size.dims = desc.dims = dims; + desc.dims = dims; desc.depth = depth; GAPI_Assert(desc.chan == -1); auto elemSize = CV_ELEM_SIZE(depth); @@ -145,7 +145,7 @@ TEST_P(RMatViewNDTestNegative, DefaultStep) { std::tie(depth, chan, ndims) = GetParam(); std::vector dims(ndims, 12); GMatDesc desc; - desc.size.dims = desc.dims = dims; + desc.dims = dims; desc.depth = depth; desc.chan = chan; auto elemSize = CV_ELEM_SIZE(depth); From 7b7ad1ebe60e0aafe2da131601c97f05f8228eb1 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 8 Sep 2025 14:26:13 +0300 Subject: [PATCH 5/7] fixed another compile error --- modules/gapi/samples/text_detection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gapi/samples/text_detection.cpp b/modules/gapi/samples/text_detection.cpp index da1bab6ca97..145e2ef8e76 100644 --- a/modules/gapi/samples/text_detection.cpp +++ b/modules/gapi/samples/text_detection.cpp @@ -288,7 +288,7 @@ GAPI_OCV_KERNEL(OCVPostProcess, PostProcess) { } static std::vector dimsToShape(const cv::MatSize &sz) { - const int n_dims = sz.dims(); + const int n_dims = sz.dims; std::vector result; result.reserve(n_dims); From e0f083a234f03c6dd0929c9b6651aa81556d55cb Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Wed, 10 Sep 2025 23:35:51 +0300 Subject: [PATCH 6/7] hopefully fixed failure in opencv_test_tracking --- modules/tracking/src/twist.cpp | 49 +++++++++++++++++----------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/modules/tracking/src/twist.cpp b/modules/tracking/src/twist.cpp index bad6661ff1c..296d107a41b 100644 --- a/modules/tracking/src/twist.cpp +++ b/modules/tracking/src/twist.cpp @@ -9,20 +9,19 @@ namespace detail inline namespace tracking { -void computeInteractionMatrix(const cv::Mat& uv, const cv::Mat& depths, const cv::Mat& K, cv::Mat& J) +void computeInteractionMatrix(const cv::Mat& uv, const cv::Mat& depths, const cv::Mat& K_, cv::Mat& J) { CV_Assert(uv.cols == depths.cols); CV_Assert(depths.type() == CV_32F); - CV_Assert(K.cols == 3 && K.rows == 3); + CV_Assert(K_.cols == 3 && K_.rows == 3 && K_.type() == CV_32F); J.create(depths.cols * 2, 6, CV_32F); J.setTo(0); - cv::Mat Kinv; - cv::invert(K, Kinv); + Matx33f K, Kinv; + K_.copyTo(K); + Kinv = K.inv(); - cv::Mat xy(3, 1, CV_32F); - cv::Mat Jp(2, 6, CV_32F); for (int i = 0; i < uv.cols; i++) { const float z = depths.at(i); @@ -30,31 +29,33 @@ void computeInteractionMatrix(const cv::Mat& uv, const cv::Mat& depths, const cv if (cv::abs(z) < 0.001f) continue; - const cv::Point3f p(uv.at(0, i), uv.at(1, i), 1.0); + const cv::Matx31f p(uv.at(0, i), uv.at(1, i), 1.0); // convert to normalized image-plane coordinates - xy = Kinv * cv::Mat(p); - float x = xy.at(0); - float y = xy.at(1); + Matx31f xy = Kinv * p; + float x = xy(0,0); + float y = xy(1,0); + + Matx Jp; // 2x6 Jacobian for this point - Jp.at(0, 0) = -1 / z; - Jp.at(0, 1) = 0.0; - Jp.at(0, 2) = x / z; - Jp.at(0, 3) = x * y; - Jp.at(0, 4) = -(1 + x * x); - Jp.at(0, 5) = y; - Jp.at(1, 0) = 0.0; - Jp.at(1, 1) = -1 / z; - Jp.at(1, 2) = y / z; - Jp.at(1, 3) = 1 + y * y; - Jp.at(1, 4) = -x * y; - Jp.at(1, 5) = -x; + Jp(0, 0) = -1 / z; + Jp(0, 1) = 0.0; + Jp(0, 2) = x / z; + Jp(0, 3) = x * y; + Jp(0, 4) = -(1 + x * x); + Jp(0, 5) = y; + Jp(1, 0) = 0.0; + Jp(1, 1) = -1 / z; + Jp(1, 2) = y / z; + Jp(1, 3) = 1 + y * y; + Jp(1, 4) = -x * y; + Jp(1, 5) = -x; - Jp = K(cv::Rect(0, 0, 2, 2)) * Jp; + Jp = Matx22f(K(0,0), K(0,1), K(1,0), K(1,1)) * Jp; // push into Jacobian - Jp.copyTo(J(cv::Rect(0, 2 * i, 6, 2))); + Mat(2, 6, CV_32F, Jp.val).copyTo(J(cv::Rect(0, 2 * i, 6, 2))); } } From 00c05da7d5d98a4b9d55540913aed8355ae1c88d Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Thu, 11 Sep 2025 00:00:36 +0300 Subject: [PATCH 7/7] updated according to the new MatSize (~ MatShape) definition --- modules/fastcv/src/channel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/fastcv/src/channel.cpp b/modules/fastcv/src/channel.cpp index 0283ac4ab7c..bf5f396c80c 100644 --- a/modules/fastcv/src/channel.cpp +++ b/modules/fastcv/src/channel.cpp @@ -26,7 +26,7 @@ void merge(InputArrayOfArrays _mv, OutputArray _dst) CV_Assert(mv[i].size == mv[0].size && mv[i].step[0] == mv[0].step[0] && mv[i].type() == CV_8UC1); } - _dst.create(mv[0].dims, mv[0].size, CV_MAKE_TYPE(CV_8U,count)); + _dst.create(mv[0].size, CV_MAKE_TYPE(CV_8U,count)); Mat dst = _dst.getMat(); INITIALIZATION_CHECK; @@ -89,7 +89,7 @@ void split(InputArray _src, OutputArrayOfArrays _mv) _mv.create(cn, 1, depth); for( int k = 0; k < cn; k++ ) { - _mv.create(src.dims, src.size, depth, k); + _mv.create(src.size, depth, k); } std::vector mv(cn);