Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Работа с камерой и распознавание чисел в «Опере»

Распозновалка (43.68КиБ)

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

Доступ к камере — эксперментальный стандарт, поэтому мало кто из браузеров может им похвастаться, я использовал специальный билд «Opera-Labs-Camera», который можно взять с сайта снапшотов «Оперы». Работать мой пример, соответственно, будет только там.

АПИ оказалось несложным. Всё, что нужно сделать — соединить специальным образом тег VIDEO с источником стримового видео; потом я 10 раз в секунд забираю кадр с видео и кладу в CANVAS (на скриншоте он цветной), оттуда вырезаю небольшую область, перевожу в градации серого, беру за порог 75% от усреднённого цвета и перевожу всё в ч/б.

Больше всего из трёх часов, которые у меня ушли на это, я делал распознование цифр. Алгоритмы, которые я нашёл в интернете, были очень монструозными, да и переписывать готовое было скучно, поэтом я перепробовал несколько вариантов, которые пришли мне в голову.

В итоге, лучше всех распознаёт следующий алгоритм.

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

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

На скриншоте в большом текстовом поле записаны получившиеся комбинации. Первое — номер по порядку, далее (через двоеточие) — количество переходов по вертикали и потом описанная последовательность. Например, «ноль» записывается как «2:11» (два перехода по вертикали, потом одинаковые переходы по разу слева и справа разделительной линии).

Алгоритм «шумит», из-за того, что дрожит рука с бумагой, из-за освещения. Поэтому я накапливаю статистику и указываю ту цифру, которая в этом позиции распозначалась больше других. Статистику сбрасываю, если количество объектов на экране изменилось.

9 комментариев
U1itka 2012

Там над цифрами штрихкод, почему не использовал его? Было интересно попробовать именно с цифрами?

Евгений Степанищев (bolknote.ru) 2012

Комментарий для U1itka:

Штрих-код не так интересно, ага.

Денис Попов (besisland.name) 2012

Предлагаю новую задачу: распознать замазанные цифры на основании цветов получившихся квадратиков ;-)

Ваня (http://plunix.ru) 2012

В похожей задаче я использовал ресайз до квадратного размера (для цифр хватит квадратика примерно 10х10), а затем сравнение с эталоном (корреляцию). Такой метод позволяет идентифицировать сигнал при многократном уровне шума, так что рамытую и слегка повёрнутую цифру распознаёт без труда. (Алгоритм в данном случае очень простой: обходим обе картинки попиксельно и суммируем произведения яркостей в одинаковых точках: если получается пиковая сумма, то символ распознан.)

Интересно, описанный вами метод эффективнее? (по скорости он явно быстрее, да и вообще изящнее :)

Евгений Степанищев (bolknote.ru) 2012

Комментарий для besisland.name:

Предлагаю новую задачу: распознать замазанные цифры на основании цветов получившихся квадратиков ;-)

Ну вот, кстати, я думал как-то об этой задаче. Нереальной она не кажется :)

Евгений Степанищев (bolknote.ru) 2012

Комментарий для Ваня (http://plunix.ru):

Интересно, описанный вами метод эффективнее? (по скорости он явно быстрее, да и вообще изящнее :)

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

Евгений Степанищев (bolknote.ru) 2012

Теперь работает ещё и в «Опере Некст».

guest 2012

http://bolknote.ru/files/opera-cam-recog.html
Content-Type: text/html; charset=windows-1251

А комментарии там в UTF-8...

Евгений Степанищев (bolknote.ru) 2012

Комментарий для guest:

Я знаю, да пофигу :)