From d10138fa1c30f9f992925dfe354d5cf11ff70b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=99=A8=E5=AE=87?= <12410918@mail.sustech.edu.cn> Date: Wed, 10 Jun 2026 18:11:27 +0800 Subject: [PATCH] Merge pull request #29132 from hcy11123323:4.x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit core: fix inverted continuity check in cvReshapeMatND() #29132 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [√] I agree to contribute to the project under Apache 2 License. - [√] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [ ] The PR is proposed to the proper branch - [ ] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake --- modules/core/src/array.cpp | 2 +- modules/core/test/test_mat.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/core/src/array.cpp b/modules/core/src/array.cpp index 252ac13ca0..db8f8c1bb4 100644 --- a/modules/core/src/array.cpp +++ b/modules/core/src/array.cpp @@ -2660,7 +2660,7 @@ cvReshapeMatND( const CvArr* arr, mat = &stub; } - if( CV_IS_MAT_CONT( mat->type )) + if( !CV_IS_MAT_CONT( mat->type )) CV_Error( cv::Error::StsBadArg, "Non-continuous nD arrays are not supported" ); size1 = mat->dim[0].size; diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index 846bff6d94..dfd17db8d1 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -2626,6 +2626,24 @@ TEST(Mat1D, DISABLED_basic) } } +TEST(Mat, regression_cvReshapeMatND_continuous) +{ + int sizes[] = {2, 3, 4}; + Mat mat(3, sizes, CV_32SC1); + CvMatND src = cvMatND(mat); + CvMatND reshaped; + int new_sizes[] = {4, 3, 2}; + CvArr* result = 0; + + ASSERT_NO_THROW(result = cvReshapeMatND(&src, sizeof(reshaped), &reshaped, 0, 3, new_sizes)); + ASSERT_NE((CvArr*)0, result); + EXPECT_EQ(3, reshaped.dims); + EXPECT_EQ(new_sizes[0], reshaped.dim[0].size); + EXPECT_EQ(new_sizes[1], reshaped.dim[1].size); + EXPECT_EQ(new_sizes[2], reshaped.dim[2].size); + EXPECT_EQ(src.data.ptr, reshaped.data.ptr); +} + TEST(Mat, ptrVecni_20044) { Mat_ m(3,4); m << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;