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