Определение рукописных знаков.

При создании фигуры - по событию поля ввода OnMouseDown или OnMouseMove (с нажатой левой кнопкой) получаем очередные координаты Xi и Yi. В специальные динамические массивы DeltaX и DeltaY заносим значения dXi-1=dXi - dXi-1 и dYi-1=dYi - dYi-1

Т. обр. если фигура содержала K точек, то размер массивов DeltaX и DeltaY N=K-1 элементов. Эти массивы содержат динамику отклонений по X и по Y при начертании фигуры.

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

Такие графики не зависят от положения рисунка, но зависят от его размера - не формой, и не амплитудой, а количеством точек, длиной. Два символа:
DeltaX = [0,1,1,4,-3,2]
DeltaY = [3,2,0,-1,-2,4]
и
DeltaX = [0, 0,1,1,1,1,4,4,-3-3,2,2]
DeltaY = [3,3,2,2,0,0,-1,-1,-2,-2,4,4]
Отличаются лишь размерами - второй символ в два раза больше первого.

Чтоб распознавать символы разного размера, необходимо привести массивы к унифицированному виду - с фиксированным количеством ячеек. Предположим, полученные массивы имеют размер N, а унифицированные массивы - размер K. Тогда каждая ячейка:

DeltaXunif[i] = DeltaX[round(i*N/K)]
DeltaYunif[i] = DeltaY[round(i*N/K)]

И правда, нулевая ячейка DeltaXunif[0] примет значение нулевой DeltaX[0], последняя - последней, промежуточные - соответственно распределятся, независимо от того, K>N или наоборот.

Это унифицированные массивы можно подвергать анализу или занести в библиотеку как эталонные для символа, который укажет пользователь. Библиотека - это массив таких эталонных унифицированных массивов, там каждой паре массивов DeltaXlib[i], DeltaYlib[i] соответствует какой-то символ S[i].

Распознавание очередного символа происходит так. Получаем пару массивов DeltaXunif, DeltaYunif. Затем выбираем из библиотеки первую пару эталонных массивов DeltaX[0], DeltaY[0] и вычисляем значение

Замопинаем первое Dтек и соответствующий символ Sтек. Затем из библиотеки выбирается следующие массивы и для них вычисляется очередное D. Если оно оказалось меньше, чем Dтек - то значит этому эталону анализируемый символ соответствует сильнее, в этом случае присваиваем Dтек и Sтек новые значения.

И так со всеми массивами библиотеки. В конце Sтек и будет распознанным символом. Если символ распознал неправильно, пользователь может указать правильное значение S и занести массивы DeltaXunif, DeltaYunif в библиотеку.

Щурко Виталий. schur@gala.net


Soft: alife-soft@yandex.ru
My ICQ: 132330402

X