#cpp #opencv #обработка_изображений
Добрый вечер!
Работаю над задачей распознавания текста.
Использую OpenCV.
Проблема такая: Есть текст(ниже), я хочу выделить каждый отдельный символ с помощью
метода:
CVAPI(int) cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
int header_size CV_DEFAULT(sizeof(CvContour)),
int mode CV_DEFAULT(CV_RETR_LIST),
int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
CvPoint offset CV_DEFAULT(cvPoint(0,0)));
Выделять(выделяю только внешние контуры - CV_RETR_EXTERNAL) и прорисовывать контуры
получается отлично, но проблема в том, что cvFindContours(...) возвращает найденные
контуры в произвольном порядке, но для моей задачи порядок очень важен. Вопрос в том,
как восстанавливать порядок обхода контуров или как сделать так, чтобы cvFindContours(...)
возвращал контуры в том порядке, который на картинке, а не так как ему вздумается?
При необходимости могу привести код.
Ответы
Ответ 1
Возможно ответ довольно банален, но можно просто отсортировать найденные прямоугольники по возрастанию x-координаты. Единственное, в чём могут возникнуть трудности - если текст многоэтажный, тут могу посоветовать из своей практики написать алгоритм анализа, наподобие трассировки целей, который начиная с самого левого контура будет искать следующего кандидата на слово из раствора по определённому углу (скажем, чтобы тангенс угла уплывания не превышал 45 градусов), и так пройтись по массиву прямоугольников, пока все не исчерпаем. В нашем проекте этот алгоритм идеально нас удовлетворяет. Думаю, даже в самой примитивной форме (как я описал выше) он будет отличным первым приближением.
Комментариев нет:
Отправить комментарий