Нахождение ограничительной рамки текста в изображении JPG - PullRequest
1 голос
/ 14 июля 2011

Мой вопрос похож на этот , но более конкретен по объему.

В моем приложении для карточных игр я бы хотел, чтобы пользователи могли нажимать на слова, находящиеся на отсканированном изображении в формате JPEG. Пожалуйста, посмотрите этот образец Торговая карта покемонов .

В этом случае пользователь должен иметь возможность навести указатель мыши на текст «Царапина», на котором вокруг текста появится пульсирующая прямоугольная рамка, указывающая на то, что он доступен для нажатия. Проблема в том, как определить границы текста. Там будет массив слов, ИЗВЕСТНЫХ ПЕРЕД НАЧАЛОМ, на которые пользователь может щелкнуть (они будут извлечены из базы данных для каждой карты отдельно). Чтобы продолжить наш пример, массив в этом случае будет [Scratch, Live Coal]. Когда пользователь нажимает кнопку «Царапина», приложение должно через обратный вызов узнать, что вместо «Живого угля» было выбрано «Царапина».

Я думал об использовании библиотек оптического распознавания символов для решения этой проблемы, но варианты с открытым исходным кодом для этого имеют низкое качество (например, GOCR) и / или не были хорошо протестированы на нескольких платформах (например, Tesseract). Я забочусь только о совместимости Windows и Mac. Я пропускаю очевидное / более простое решение / алгоритм, который не требует OCR? Я не могу просто вручную кодировать в ограничивающие рамки для каждой карты, так как в моей базе данных будут тысячи отсканированных карт. Пользователь также может загрузить свои собственные отсканированные карточки с сопровождающим массивом кликабельного текста.

Цвет текста не всегда черный. Посмотрите эту панораму различных карточных и текстовых стилей, которые будут разрешены. Черные карточки имеют белый текст, а третья (Зекром) карта имеет черный текст с белым контуром.

Решения на любом языке программирования приветствуются. Тем не менее, обратите внимание, что я ищу алгоритмы и / или библиотеки с открытым исходным кодом. Если есть решение на Ruby или Java, даже лучше, так как мой код в основном на этих двух языках.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что порядок слов / фраз в массиве будет такой же, как на карте. Таким образом, массив будет ["Scratch", "Live Coal"] вместо ["Live Coal", "Scratch"]. Я упоминаю об этом, потому что это может потенциально упростить задачу. Таким образом, для этого примера я могу просто искать черные пиксели (хотя я должен следить за черной звездой в белом круге). Однако в более трудных случаях под именем атаки будет написан текст с меньшим шрифтом (опять же, см. Примеры на панораме).

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Я бы просто написал программу, которая позволит вам визуально нарисовать ограничивающую рамку вокруг вашего текста для простоты, но может сделать это, обнаруживая различия в цвете пикселей.Поскольку текст чёрный, вы можете видеть, где левый верхний чёрный пиксель находится без больших отступов и в нижней половине карты.

0 голосов
/ 15 июля 2011

Когда курсор неподвижен, проверьте, есть ли черный пиксель под или до 4 пикселей вокруг курсора.Если это так, проверьте первые три последовательных (потому что все еще может быть не черный пиксель между буквами) не черные пиксели слева от курсора, вправо, вверху и внизу.Если да, используйте эти места, чтобы нарисовать квадрат.Вы можете использовать OpenCV .

...