У меня есть черно-белое изображение штриховых рисунков, которое может выглядеть примерно так:
, но может быть намного сложнее.
Я хочу преобразовать этот рисунок в std::vector<std::vector<cv::Point>>
(в значительной степени контур). За исключением проблемы, я не могу просто назвать контур. Вызов контура даст мне упорядоченный набор точек, которые очерчивают эту форму. Я хочу упорядоченный набор точек (возможно, даже несколько), которые вернут мне саму линию.
Это очень близко к проблеме контура, за исключением того, что требуется "половина" количества точек.
Я написал метод, который найдет мне точки, которые являются "соединителями", и точки которые являются «конечными точками».
Итак, в этом примере есть 3 конечных точки и 1 соединитель.
Мой алгоритм следующий:
get actual contours = [[contour]]
classify points to get [endPoints], [connections] map
criticalSeen = 0
for each contour in contours
If seen[current point] continue;
If criticalSeen >= 1
append current point to currPoints
seen[current point] = true
If criticalSeen == 0
continue
If criticalSeen == 2
criticalSeen = 1
append currPoints to result
reset currPoints to empty
return result