mirror of
https://github.com/opencv/opencv.git
synced 2024-11-24 11:10:21 +08:00
Merge pull request #25672 from mshabunin:fix-approx
imgproc: fix contour approximation, added test
This commit is contained in:
commit
2624929ec6
@ -231,7 +231,7 @@ static void pass_cleanup(vector<ApproxItem>& ares, size_t start_idx)
|
||||
|
||||
const size_t len = ares.size();
|
||||
size_t first = start_idx;
|
||||
for (size_t i = start_idx, prev = i; i < len; ++i)
|
||||
for (size_t i = start_idx, prev = start_idx; i < len; ++i)
|
||||
{
|
||||
ApproxItem& item = ares[i];
|
||||
if (item.removed)
|
||||
@ -248,10 +248,10 @@ static void pass_cleanup(vector<ApproxItem>& ares, size_t start_idx)
|
||||
|
||||
if (s1 > s2 || (s1 == s2 && ares[prev].k <= ares[i].k))
|
||||
/* remove second */
|
||||
clear_until(ares, get_next_idx(ares, prev), get_next_idx(ares, i));
|
||||
clear_until(ares, prev, get_next_idx(ares, i));
|
||||
else
|
||||
/* remove first */
|
||||
clear_until(ares, first, i);
|
||||
clear_until(ares, get_next_idx(ares, first), i);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -259,7 +259,6 @@ static void pass_cleanup(vector<ApproxItem>& ares, size_t start_idx)
|
||||
clear_until(ares, first, i);
|
||||
}
|
||||
}
|
||||
clear_until(ares, first, i);
|
||||
first = i;
|
||||
count = 1;
|
||||
}
|
||||
|
@ -602,4 +602,23 @@ 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<vector<Point>> contours;
|
||||
vector<Vec4i> hierarchy;
|
||||
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_TC89_L1);
|
||||
#if CHECK_OLD
|
||||
vector<vector<Point>> 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
|
||||
|
Loading…
Reference in New Issue
Block a user