diff --git a/modules/core/src/merge.cpp b/modules/core/src/merge.cpp index b460d212d1..0aeaa829a0 100644 --- a/modules/core/src/merge.cpp +++ b/modules/core/src/merge.cpp @@ -305,7 +305,7 @@ void cv::merge(const Mat* mv, size_t n, OutputArray _dst) return; } - CV_IPP_RUN_FAST(ipp_merge(mv, dst, (int)n)); + CV_IPP_RUN(allch1, ipp_merge(mv, dst, (int)n)); if( !allch1 ) { diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index f585c4f28f..f69140bb8c 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -1888,6 +1888,29 @@ TEST(Core_Split, crash_12171) EXPECT_EQ(2, dst2.ptr(1)[1]); } +TEST(Core_Merge, bug_13544) +{ + Mat src1(2, 2, CV_8UC3, Scalar::all(1)); + Mat src2(2, 2, CV_8UC3, Scalar::all(2)); + Mat src3(2, 2, CV_8UC3, Scalar::all(3)); + Mat src_arr[] = { src1, src2, src3 }; + Mat dst; + merge(src_arr, 3, dst); + ASSERT_EQ(9, dst.channels()); // Avoid memory access out of buffer + EXPECT_EQ(3, (int)dst.ptr(0)[6]); + EXPECT_EQ(3, (int)dst.ptr(0)[7]); + EXPECT_EQ(3, (int)dst.ptr(0)[8]); + EXPECT_EQ(1, (int)dst.ptr(1)[0]); + EXPECT_EQ(1, (int)dst.ptr(1)[1]); + EXPECT_EQ(1, (int)dst.ptr(1)[2]); + EXPECT_EQ(2, (int)dst.ptr(1)[3]); + EXPECT_EQ(2, (int)dst.ptr(1)[4]); + EXPECT_EQ(2, (int)dst.ptr(1)[5]); + EXPECT_EQ(3, (int)dst.ptr(1)[6]); + EXPECT_EQ(3, (int)dst.ptr(1)[7]); + EXPECT_EQ(3, (int)dst.ptr(1)[8]); +} + struct CustomType // like cv::Keypoint { Point2f pt;