Привет, Гиктаймс!
UPD: Есть видео демонстрация.
Как видно из названия речь в этой статье пойдет о распознавании цифр на микроконтроллере. Сразу хочу оговориться, что в данной статье не будет приведен исходный код, рассматриваться технология или алгоритм распознавания, скажу лишь, что используются идеи системного подхода. Некоторые из них изложены в наших статьях (здесь, здесь и вот здесь). Это связано с тем, что наш подход тянет на оригинальность, но требует уточнения некоторых вопросов. Кто-то может сказать: «очередная статья про программирование микроконтроллеров». Отнюдь нет, поиск подобных проектов не дал каких-то внятных результатов, за исключением этого видео. Из обсуждений на форумах понятно одно: идея получения подобного устройства (камера + микроконтроллер = результат распознавания на выходе, а не просто снятая картинка) приходила многим, но оставалась без реализации. Да и распознавание, по общему мнению, требует много вычислительных ресурсов и микроконтроллеры для этого не подходят, в частности про Arduino были высказывания, что это вообще невозможно. Если стало интересно прошу под кат.

Что бы не возникало очевидных вопросов, ответим на них:
Если кратко, то все началось с того, что было желание попробовать свои силы и проверить свои идеи в распознавании изображений. В процессе обсуждения пришли к выводу, что можем обойтись небольшими вычислительными мощностями для решения данно�� задачи. По понятным причинам подробности этих обсуждений описывать не будем.
Итак, задача поставлена, нужна реализация. Не отступая от уже устоявшихся принципов
берем то, что есть под рукой. А было под рукой парочка Arduino Uno, старая оптическая мышь и CD привод. Кстати, на то что бы использовать сенсор оптической мыши в качестве камеры для получения изображения нас натолкнула статья прочитанная когда то давно, ну и собственно весь остальной около «мышиный» материал. Единственное нам пришлось выпаять сенсор и всю его обвязку для удобства использования, а также приклеить к нему линзу, которую мы бережно «выдрали» из CD привода. Это было нужно для того, что бы увеличить расстояние от объекта съемки до камеры иначе цифры нашего размера не помещались и была видна лишь небольшая часть. Кстати говоря перед линзой из CD привода, мы пробовали прикрепить оптику от веб камеры, но как-то не срослось.

Затем встал вопрос как эту камеру позиционировать над объектом съемки. Тут нам очень помог старый сломанный микроскоп, который лежал без дела. С уважением сняли с него механизм управления предметным столиком. Этот механизм нам позволил перемещать камеру лишь по двум осям, тут же пришла мысль использовать направляющую лазерной головки от CD приво��а. Все это закрепили на корпусе от многострадального CD привода. В итоге мы получили классный механизм позиционирования камеры.

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

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

слева изображение в градациях серого полученное с индикатора (такое изображение мы получаем с сенсора), справа бинаризованное.




Немаловажную роль в нашей установке играет, так называемый блок распознавания (на картинке выше). Как видно, он состоит из Arduino Uno и всем известного wifi передатчика ESP8266. Поясняю, wifi передатчик нам нужен для того, что бы результат распознавания увидеть на планшете. Приложение на планшете отправляет запрос, «ардуинка», получая запрос, «снимает» изображение с сенсора мыши, затем бинаризует его. После бинаризации происходит распознавание, а после его завершения формируется ответ. В ответе мы посылаем результат распознавания и 41 байт для построения бинаризованного изображения на экране планшета, так сказать, для наглядности.
Если оглянуться, то на «на ардуинку» возложен неплохой функционал: и работа с камерой, и распознавание, и работа с esp8266. Что не могло не отразится на работе — пришлось бороться с нехваткой памяти. Вот уж не думал, что когда либо придется отвоевывать каждый байт памяти.
На этом собственно и все. Впереди еще очень много работы. И первая задача: распознавание чисел (строки цифр) снимаемых «человеческой» камерой (а не «мышиным сенсором») и переносом разработанной технологии на ESP8266 и снижением накала борьбы за каждый байт памяти.
С радостью ответим на вопросы.
UPD: Есть видео демонстрация.
Как видно из названия речь в этой статье пойдет о распознавании цифр на микроконтроллере. Сразу хочу оговориться, что в данной статье не будет приведен исходный код, рассматриваться технология или алгоритм распознавания, скажу лишь, что используются идеи системного подхода. Некоторые из них изложены в наших статьях (здесь, здесь и вот здесь). Это связано с тем, что наш подход тянет на оригинальность, но требует уточнения некоторых вопросов. Кто-то может сказать: «очередная статья про программирование микроконтроллеров». Отнюдь нет, поиск подобных проектов не дал каких-то внятных результатов, за исключением этого видео. Из обсуждений на форумах понятно одно: идея получения подобного устройства (камера + микроконтроллер = результат распознавания на выходе, а не просто снятая картинка) приходила многим, но оставалась без реализации. Да и распознавание, по общему мнению, требует много вычислительных ресурсов и микроконтроллеры для этого не подходят, в частности про Arduino были высказывания, что это вообще невозможно. Если стало интересно прошу под кат.

Что бы не возникало очевидных вопросов, ответим на них:
- Нет, это не сервис по распознаванию изображений
- Нет, это не OpenCV
- Нет, это не нейронные сети
- Используется морфологический анализ объектов из которых состоит цифра
- Да, распознавание производится именно микроконтроллером!
Идея
Если кратко, то все началось с того, что было желание попробовать свои силы и проверить свои идеи в распознавании изображений. В процессе обсуждения пришли к выводу, что можем обойтись небольшими вычислительными мощностями для решения данно�� задачи. По понятным причинам подробности этих обсуждений описывать не будем.
Установка
Итак, задача поставлена, нужна реализация. Не отступая от уже устоявшихся принципов
берем то, что есть под рукой. А было под рукой парочка Arduino Uno, старая оптическая мышь и CD привод. Кстати, на то что бы использовать сенсор оптической мыши в качестве камеры для получения изображения нас натолкнула статья прочитанная когда то давно, ну и собственно весь остальной около «мышиный» материал. Единственное нам пришлось выпаять сенсор и всю его обвязку для удобства использования, а также приклеить к нему линзу, которую мы бережно «выдрали» из CD привода. Это было нужно для того, что бы увеличить расстояние от объекта съемки до камеры иначе цифры нашего размера не помещались и была видна лишь небольшая часть. Кстати говоря перед линзой из CD привода, мы пробовали прикрепить оптику от веб камеры, но как-то не срослось.
Ещё

Затем встал вопрос как эту камеру позиционировать над объектом съемки. Тут нам очень помог старый сломанный микроскоп, который лежал без дела. С уважением сняли с него механизм управления предметным столиком. Этот механизм нам позволил перемещать камеру лишь по двум осям, тут же пришла мысль использовать направляющую лазерной головки от CD приво��а. Все это закрепили на корпусе от многострадального CD привода. В итоге мы получили классный механизм позиционирования камеры.
Ещё


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

Ещё





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

слева изображение в градациях серого полученное с индикатора (такое изображение мы получаем с сенсора), справа бинаризованное.
Ещё

Общий вид установки в сборе
ранний вариант устан��вки







Блок распознавания
Немаловажную роль в нашей установке играет, так называемый блок распознавания (на картинке выше). Как видно, он состоит из Arduino Uno и всем известного wifi передатчика ESP8266. Поясняю, wifi передатчик нам нужен для того, что бы результат распознавания увидеть на планшете. Приложение на планшете отправляет запрос, «ардуинка», получая запрос, «снимает» изображение с сенсора мыши, затем бинаризует его. После бинаризации происходит распознавание, а после его завершения формируется ответ. В ответе мы посылаем результат распознавания и 41 байт для построения бинаризованного изображения на экране планшета, так сказать, для наглядности.
Если оглянуться, то на «на ардуинку» возложен неплохой функционал: и работа с камерой, и распознавание, и работа с esp8266. Что не могло не отразится на работе — пришлось бороться с нехваткой памяти. Вот уж не думал, что когда либо придется отвоевывать каждый байт памяти.
Демонстрация процесса распознавания
Вместо заключения
На этом собственно и все. Впереди еще очень много работы. И первая задача: распознавание чисел (строки цифр) снимаемых «человеческой» камерой (а не «мышиным сенсором») и переносом разработанной технологии на ESP8266 и снижением накала борьбы за каждый байт памяти.
С радостью ответим на вопросы.
