Распознавание цифр в табло с помощью OpenCV
Я пытаюсь извлечь цифры из типичного табло, которое вы найдете в спортзале средней школы. У меня есть каждый номер в цифровом шрифте "будильник", и ему удалось проецировать правильную, пороговую и извлечь определенную цифру из видеопотока.
![Sample input]()
Здесь образец ввода моего шаблона
![Template input]()
Моя проблема заключается в том, что ни один метод классификации не будет точно определять все цифры 0-9. Я пробовал несколько методов
1) Tesseract OCR - этот последовательно разваливается на 4 и часто возвращает странные результаты. Просто используйте версию командной строки. Если я на самом деле пытаюсь обучить его шрифту "будильник", я получаю неизвестный символ каждый раз.
2) kNearest с OpenCV - я ищу базу данных, состоящую из моих шаблонных изображений (0-9) и посмотрю, какая из них ближайшая. Я часто путаюсь между 3/1 и 7/1
3) cvMatchShapes - это довольно плохо, обычно он не может определить разницу между двумя цифрами для каждой цифры ввода
4) Касательное расстояние - это самое близкое, но наименьшее касательное расстояние между входом и моими шаблонами заканчивается отображением "7" на "1" каждый раз
Мне очень сложно получить алгоритм классификации для такой простой проблемы. Я чувствую, что я правильно очистил вход, и это довольно простой случай для классификации, но я не могу получить что-либо достаточно надежное, чтобы фактически использовать его на практике. Любые идеи о том, где искать алгоритмы классификации или как правильно их использовать, будут оценены. Я не убираю вход? Как насчет лучшей базы данных ввода? Я не знаю, что еще я буду использовать для ввода, каждая цифра и шаблон смотрят на это место.
Ответы
Ответ 1
Классическое распознавание цифр, которое должно хорошо работать в этом случае, состоит в том, чтобы обрезать изображение вокруг цифры и изменить его размер до 4x4 пикселей.
Дискретное косинусное преобразование (DCT) может быть использовано для дальнейшего сокращения пространства поиска. Вы можете выбрать первые 4-6 значений.
С этими значениями тренируйте классификатор. SVM хороший, легко доступный в OpenCV.
Это не так просто, как предложения Эммы или Мартина, но это более элегантно и, я думаю, более надежно.
Учитывая соотношение ширины и высоты вашего ввода, вы можете выбрать другое разрешение, например 3x4. Выберите самый маленький, который сохраняет читаемые цифры.
Ответ 2
Учитывая очень регулярный характер ввода, вы можете определить набор из 7 целевых областей изображения для проверки. Каждая область должна охватывать значительную часть одного из 7 сегментов каждого цифрового дисплея, но не перекрываться.
Затем вы можете проверить каждую область и усреднить цвет/яркость пикселей, чтобы генерировать вероятность для данного двоичного состояния. Если ваша вероятность высока во всех областях, вы можете легко понять, что такое цифра.
Это не так изящно, как чистый алгоритм типа ML, но ML намного больше подходит для входов, которые не являются регулярными, и в этом случае это, похоже, не применяется, поэтому вы торгуете элегантностью для точности.
Ответ 3
Может показаться глупым, но вы попробовали просто проверить черные полосы вертикально, а затем горизонтально в верхней и нижней половине - влево и вправо от центральной линии?
Ответ 4
Если вы пытаетесь распознать текст с помощью Tesseract, попробуйте передать не одну цифру, а количество дублированных цифр, иногда это может привести к лучшим результатам, здесь пример.
Однако, если вы планируете бизнес-программное обеспечение, вы можете посмотреть коммерческий OCR SDK. Например, попробуйте ABBYY FineReader Engine. Это не доступно для свободного использования приложений, но когда дело доходит до бизнеса, это может принести пользу вашему продукту. Насколько я знаю, ABBYY обеспечивает лучшее качество OCR, например, http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison