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

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

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

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

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

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

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

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

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

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

U1itka (инкогнито)
6 апреля 2012, 14:53

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

bolk (bolknote.ru)
6 апреля 2012, 15:07, ответ предназначен U1itka

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

Денис Попов (besisland.name)
6 апреля 2012, 21:00

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

Ваня (http://plunix.ru) (инкогнито)
7 апреля 2012, 01:49

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

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

bolk (bolknote.ru)
7 апреля 2012, 10:20, ответ предназначен Денис Попов (besisland.name):

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

bolk (bolknote.ru)
7 апреля 2012, 10:22, ответ предназначен Ване (http://plunix.ru)

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

bolk (bolknote.ru)
18 апреля 2012, 10:18

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

guest (инкогнито)
23 апреля 2012, 20:36

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

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

bolk (bolknote.ru)
23 апреля 2012, 21:30, ответ предназначен guest

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)