Распознавание цифр на табло с использованием OpenCV - PullRequest
15 голосов
/ 09 ноября 2011

Я пытаюсь извлечь цифры из типичного табло, которое вы найдете в спортзале средней школы.У меня есть каждый номер в цифровом шрифте «будильника», и мне удалось исправить в перспективе, порог и извлечь данную цифру из видеопотока

Sample input

Вот пример моего шаблонаinput

Template input

Моя проблема в том, что ни один метод классификации не может точно определить все цифры 0-9.Я испробовал несколько методов

1) Тессеракт OCR - этот метод постоянно портит 4 и часто возвращает странные результаты.Просто используя версию командной строки.Если я на самом деле пытаюсь обучить его шрифту «будильника», я каждый раз получаю неизвестный символ.

2) kNearest с OpenCV - я ищу базу данных, состоящую из изображений моего шаблона (0-9) и вижукакой из них ближайшийЯ часто получаю путаницу между 3/1 и 7/1

3) cvMatchShapes - это довольно плохо, обычно оно не может определить разницу между 2 цифрами для каждой входной цифры

4) Tangent Distance - Это самое близкое расстояние, но наименьшее касательное расстояние между входом и моими шаблонами заканчивается отображением «7» в «1» каждый раз

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

Ответы [ 4 ]

10 голосов
/ 09 ноября 2011

Классическое распознавание цифр, которое должно хорошо работать в этом случае, состоит в том, чтобы обрезать изображение вокруг цифры и изменить его размер до 4x4 пикселей.

Дискретное косинусное преобразование (DCT) может использоваться для дальнейшего уменьшения пространства поиска. Вы можете выбрать первые 4-6 значений.

С этими значениями обучите классификатор. SVM хороший, легко доступный в OpenCV.

Это не так просто, как предложения Эммы или Мартина, но это более элегантно и, я думаю, более надежно.

Учитывая соотношение ширины и высоты вашего ввода, вы можете выбрать другое разрешение, например 3x4. Выберите самый маленький, который сохраняет читаемые цифры.

4 голосов
/ 09 ноября 2011

Учитывая очень регулярный характер вашего ввода, вы можете определить набор из 7 целевых областей изображения для проверки.Каждая область должна охватывать значительную часть одного из 7 сегментов каждого цифрового дисплея, но не перекрываться.

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

Это не так элегантно, как алгоритм чистого типа ML, но ML гораздо больше подходит для входов, которые не являются регулярными,в этом случае это, кажется, не применимо - поэтому вы обмениваете элегантность на точность.

3 голосов
/ 09 ноября 2011

Звучит глупо, но вы пробовали просто проверять наличие черных полос по вертикали, а затем по горизонтали в верхней и нижней половине - слева и справа от центральной линии?

2 голосов
/ 10 ноября 2011

Если вы пытаетесь распознать текст с помощью Tesseract, попробуйте передать не одну цифру, а количество дублированных цифр, иногда это может привести к лучшим результатам, , вот пример .Однако, если вы планируете программное обеспечение для бизнеса, возможно, вы захотите взглянуть на коммерческий OCR SDK.Например, попробуйте ABBYY FineReader Engine .Это бесплатно по доступным для использования приложениям, но когда дело доходит до бизнеса, это может иметь хорошую ценность для вашего продукта.Насколько я знаю, ABBYY обеспечивает наилучшее качество распознавания текста, например, проверьте http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison

...