Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Поиск контуров на изображении

#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 градусов), и так пройтись по массиву прямоугольников, пока все не исчерпаем. В нашем проекте этот алгоритм идеально нас удовлетворяет. Думаю, даже в самой примитивной форме (как я описал выше) он будет отличным первым приближением.

Комментариев нет:

Отправить комментарий