У меня есть двоичное изображение: На этом изображении я легко могу отсортировать контуры, которые я нашел сверху вниз и слева направо, используя перегруженные std::sort
.
Iсначала сортируйте сверху вниз с помощью:
sort(contours.begin(), contours.end(), top_to_bottom_contour_sorter());
Затем я сортирую слева направо по:
for (int i = 0; i < contours.size(); i = i + no_of_contours_horizontally)
{
sort(i, i + no_of_contours_horizontally, left_to_right_contour_sorter);
}
Где top_to_bottom
и left_to_right
- отдельные функции, которые я передаюфункция сортировки.И no_of_contours_horizontally
по отношению к первому изображению составляет три (3).
Однако это работает, только если я знаю количество контуров по горизонтали.Если изображение, которое я использую, будет иметь различное количество горизонтальных контуров, как на этом изображении. contours_sample .Программа не работает.Я мог бы грубой силой и определить для конкретного индекса, чтобы изменить количество найденных контуров.Тем не менее, это ограничило бы программу для работы с определенным входом вместо гибкости.Я имею в виду создание линий или линий, которые я могу наложить поверх изображения, и с этим посчитать количество контуров внутри, чтобы я мог получить значение количества горизонтальных контуров.Если бы было более элегантное решение, я был бы признателен.
Вот мои функции сортировки
bool top_to_bottom_contour_sorter(const std::vector<Point> &lhs, const std::vector<Point> &rhs)
{
Rect rectLhs = boundingRect(Mat(lhs));
Rect rectRhs = boundingRect(Mat(rhs));
return rectLhs.y < rectRhs.y;
}
bool left_to_right_contour_sorter(const std::vector<Point> &lhs, const std::vector<Point> &rhs)
{
Rect rectLhs = boundingRect(Mat(lhs));
Rect rectRhs = boundingRect(Mat(rhs));
return rectLhs.x < rectRhs.x;
}
РЕДАКТИРОВАТЬ Вот мои текущие и желаемые выходные данные для каждого изображения,Используя первое изображение и мой текущий рабочий код. Current_Output
Мой желаемый вывод для второго изображения. Desired_Output