diff --git a/modules/imgproc/src/contours_approx.cpp b/modules/imgproc/src/contours_approx.cpp index f98ea190f4..176c490468 100644 --- a/modules/imgproc/src/contours_approx.cpp +++ b/modules/imgproc/src/contours_approx.cpp @@ -248,10 +248,10 @@ static void pass_cleanup(vector& ares, size_t start_idx) if (s1 > s2 || (s1 == s2 && ares[prev].k <= ares[i].k)) /* remove second */ - clear_until(ares, prev, get_next_idx(ares, i)); + ares[i].removed = true; else /* remove first */ - clear_until(ares, get_next_idx(ares, first), i); + ares[prev].removed = true; } else { diff --git a/modules/imgproc/src/contours_link.cpp b/modules/imgproc/src/contours_link.cpp index 532519bc97..8df88fc123 100644 --- a/modules/imgproc/src/contours_link.cpp +++ b/modules/imgproc/src/contours_link.cpp @@ -252,7 +252,6 @@ void LinkRunner::establishLinks(int& prev_point, lower_run = rns[rns[lower_run].next].next; continue; } - rns[rns[lower_run].next] = rns[rns[lower_run].next]; rns[lower_run].link = rns[lower_run].next; // First point of contour @@ -269,7 +268,6 @@ void LinkRunner::establishLinks(int& prev_point, upper_run = rns[rns[upper_run].next].next; continue; } - rns[rns[upper_run].next] = rns[rns[upper_run].next]; rns[rns[upper_run].next].link = upper_run; upper_run = rns[rns[upper_run].next].next; } diff --git a/modules/imgproc/test/test_contours_new.cpp b/modules/imgproc/test/test_contours_new.cpp index ef4ce29155..fbeba06587 100644 --- a/modules/imgproc/test/test_contours_new.cpp +++ b/modules/imgproc/test/test_contours_new.cpp @@ -531,6 +531,9 @@ TEST_P(Imgproc_FindContours_Modes2, approx) findContours(img, contours, hierarchy, mode, method); #if CHECK_OLD + // NOTE: old and new function results might not match when approximation mode is TC89. + // Currently this test passes, but might fail for other random data. + // See https://github.com/opencv/opencv/issues/25663 for details. vector> contours_o; vector hierarchy_o; findContours_legacy(img, contours_o, hierarchy_o, mode, method); @@ -602,23 +605,4 @@ TEST(Imgproc_FindContours, link_runs) #endif } -TEST(Imgproc_FindContours, regression_25663) -{ - uint8_t data[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; - Mat1b img(32,32,data); - vector> contours; - vector hierarchy; - findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_TC89_L1); -#if CHECK_OLD - vector> contours_o; - findContours_legacy(img, contours_o, RETR_EXTERNAL, CHAIN_APPROX_TC89_L1); - ASSERT_EQ(contours_o.size(), contours.size()); - for (size_t i = 0; i < contours_o.size(); ++i) - { - SCOPED_TRACE(format("contour = %zu", i)); - EXPECT_MAT_NEAR(Mat(contours_o[i]), Mat(contours[i]), 0); - } -#endif -} - }} // namespace opencv_test