Распознавание Рукописного Ввода



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

Позволь мне объяснить.

Почерк — это рисование определенной формы воображаемой «ручкой».

Рисование в компьютерных системах — это хранение информации обо всех пикселях графического контекста в графической памяти.

«Точка на плоскости» в математике — абстрактное понятие.

В компьютерной графике под этим понятием скрывается «пиксель».

Этот алгоритм распознавания будет анализировать предоставленный ему набор точек (пикселей) и пытаться найти в нем максимально возможную и похожую фигуру.

Фигура, в свою очередь, представляет собой кадр, содержащий только основные (контрольные) точки, делающие фигуру уникальной.



Материальная часть
В общем, суть алгоритма всем известна еще со школы.

Теорема о косинусе , что является обобщенной теоремой Пифагор .

Зная координаты трех точек на плоскости и порядок их «появления» на ней, мы легко можем определить угол, описываемый этими точками (Вершиной угла является вторая точка):



Распознавание рукописного ввода

А(х1;у1) Б(х2;у2) С(х3;у3) расстояния между точками находятся с помощью теоремы Пифагора a^2 = b^2 + c^2 — 2*b*c*cos(АЛЬФА) потому что (АЛЬФА) = (b^+c^-a^) / 2*b*c
Зная косинус, можно легко вычислить угол.

Среди множества точек, подаваемых на вход алгоритма, необходимо «подставить» точки в различные рамки фигур (о них выше) и выбрать лучшее решение среди найденных.

Это делается следующим образом:

  1. Берем первую и последнюю точки рамок фигуры.

    Их уже два, осталось найти третий (найти угол).

  2. Поиск третьего осуществляется путем перебора всех последующих точек после первой.

    Решение о включении точки в предлагаемую рамку рисунка принимается на основе двух анализов:

    • Попытка вставить точку в угол (как третью, заключительную) и проверить ее на соответствие значению того же угла в кадре реальной фигуры.

    • Сверьте соотношение сторон полученного угла с таким же соотношением сторон угла в рамке реальной фигуры.

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

Если, скажем, у нас есть несколько анализируемых кадров, например, «8» и «6».

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

Процент сходства между набором точек и точками в кадре рассчитывается просто: все точки, сходящиеся с такими же точками в кадре, суммируются и находится связь.

Допустим, если в кадре N контрольных точек, а у нас M, то процент сходства равен

M / N * 100

На словах что-то может быть не понятно.

Поэтому всё так же, но наглядно (на примере цифры «6»):

Распознавание рукописного ввода

Наборы точек обозначены черным цветом, рамка, в соответствии с которой происходит анализ, – красным.

Цифрами обозначены точки углов (начиная с последней), если считать, что мы рисуем шестерку от точки «2» и заканчиваем точкой «1», то первые две точки, с которых начинается разбор кадра — «1» и «2», затем происходит поиск точки «3», чтобы ее параметры относительно образуемого ею угла совпадали с такими же параметрами в кадре.

Далее, как мы нашли точку «3», ищем точку «4» (уже опираясь на точки «2» и «3»), опять же в соответствии с реальным кадром и т.д. Буквы обозначают стороны углов.

То есть, следуя правилам алгоритма, точка из множества (точек плоскости) может войти в предложенный кадр, если (примеры):

(угол 2 ~= угол 2 в кадре) И (a/b ~= a1/b1) тогда будет включена точка «3» (угол 3 ~= угол 3 в кадре) И (b/c ~= b1/c1), тогда будет включена точка «4».

и т. д.

На этом описание алгоритма заканчивается.



Код
Легко сказать, но прежде чем это сказать, нужно хорошо подумать, как сделать то, что ты сказал.

Что ж, я уже подумал и реализовал придуманный алгоритм с помощью C++ и графической библиотеки OpenGL (+ надстройка GLUT).

Графическая библиотека используется для рисования набора точек в двухмерном пространстве.

Кода оказалось не так уж и мало, но и не так уж и много.

Почти весь код распространяется в заголовочных файлах C++.

Проект выложен в открытый доступ для всех, кто хоть немного заинтересован.

Исходники расположены по адресу Битбакет .

В проекте используется система контроля версий GIT, поэтому у желающих скачать исходный код проекта не должно возникнуть с этим никаких затруднений.

Для перехода в режим программирования фигур необходимо щелкнуть правой кнопкой мыши в главном окне.

Затем нарисуйте рамку (используя точки, соединенные по порядку отрезками) и нажмите среднюю кнопку мыши.

"Сделанный!" появится на экране.

После этого перезапустите приложение.



Подводные скалы
Они есть практически везде.

и этот алгоритм не исключение.

Скажу откровенно, алгоритм допускает периодические осечки в правильном распознавании.

Взять, к примеру, символы «S» и «5», где осечки практически неизбежны.

Хотя, если все контрольные точки будут четко обозначены, то, скорее всего, осечек удастся избежать.

Осечки могут возникать и при анализе фигур, имеющих сложную округлость.

Если на разнородных символах возникают осечки (например, у меня были осечки с «6» и «8»: 6 — 100%, 8 — 83%), то можно запрограммировать кадр каждой из цифр заново (количество повторы не ограничены).

Таким образом, вы сможете избежать ошибок распознавания.

И последнее, на что следует обратить внимание, это угол, образованный последней, первой и второй точками + надо запомнить соотношение его сторон.

Для этого можно «выровнять» этот угол до 90 градусов, как показано на демонстрационном видео ниже.

В статье я упомянул только цифры, как вы могли заметить.

Но на самом деле распознавание применимо к абсолютно любым фигурам в двухмерном пространстве.

Еще я сделал небольшое приложение к статье - видео , демонстрирующий работу алгоритма.

Если есть вопросы, задавайте - с удовольствием на них отвечу.

Теги: #Алгоритмы #математика #c++ #программирование #программирование #C++ #Алгоритмы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.