Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Философия программирования > Генерация "рукописного" текста


Автор: Artemios 21.12.2006, 04:06
Год назад написал программку для генерации из текста картинки, как будто тот текст написан моим почерком.
Например, вот результат работы:
user posted image

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

Сейчас вернулся к мысли о той же задачке. Картинка выглядит вообще-то не очень по-человечески. 
Бродят в голове такие идеи, что надо бы физику моделировать -- моторику руки, чернила и нажим на лист...
Но что-то мне кажется, что это будет слишком сложно.

Может у кого-нибудь есть какие-либо идеи, или уже что-то подобное видели -- поделитесь пожалуста.

Автор: Rodman 21.12.2006, 10:22
А если сосканить текст написанный своей рукой и по нему создать матрицу каждой буквы...

там по идее и будут нажим (точки по краю буквы будут реже)...

Или я не в ту сторону размышляю...

Автор: LSD 21.12.2006, 12:05
Цитата(Artemios @  21.12.2006,  04:06 Найти цитируемый пост)
Принцип был такой: каждая буква представлена в БД набором контрольных точек, для конкретной строки символов строю список контрольных точек, затем точки случайно "колебаю", потом по точкам отрисовываю сплайны.

По мне идея хорошая. Для каждой буквы создаем набор "маршрутов" (ты же можешь одну и ту же букву написать несколькими способами). Плюс таблицу какой маршрут после какого может идти. Ну и дальше вносим небольшой шум в маршрут.

Автор: Artemios 21.12.2006, 12:11
Цитата

А если сосканить текст

Я думаю, в этом случае буквы будут статические, не получится сделать плавный переход от одной буквы к другой при непрерывном письме. Ну и морфинг ограничен.

Хотя... Если поверх скана буквы еще контрольные точки задать, и привязать к ним растр... Надо будет подумать...

Автор: Artemios 24.12.2006, 22:52
Цитата(LSD @  21.12.2006,  12:05 Найти цитируемый пост)
Для каждой буквы создаем набор "маршрутов" (ты же можешь одну и ту же букву написать несколькими способами). Плюс таблицу какой маршрут после какого может идти.

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

С формой букв вроде бы почти все нормально, я теперь хочу саму линию качественно смоделировать. Я представил здесь в первом посте картинку, но это конвертация в растровое изображение, низкого качества. В оригинале векторная графика. Пока что линия везде одинаковой толщины, везде однородная.
Думаю над такой задачей: допустим, уже построен маршрут, который будет представлять текст. То есть предполагаем, что при написании этого текста рука провела бы ручкой по заданному маршруту. А вот как бы выглядела линия в каждой точке маршрута?

Сопутствующий вопрос: от чего зависит форма линии в конкретной точке? Попробую перечислить:
- скорость движения ручки в данной точке
- кривизна маршрута
- удаленность от центра/краев листа
- направление движения ручки в данной точке
- фактура красящего вещества и бумаги
А вот как зависит -- для меня остается пока вопросом.

Возможно, на начальном этапе подойдет упрощенная модель: представим, что по траектории движется физическая точка, оставляющая за собой след. Ширина следа зависит от скорости точки -- чем медленней движение, тем шире линия. Скорость точки зависит от кривизны траектории -- чем больше кривизна, тем медленней движение. Следовательно, чем больше кривизна -- тем шире линия. А тут пока прервусь: вопрос к физикам, я вообще правильно рассуждаю?
(Ручка, например, перьевая)

Автор: nickless 25.12.2006, 01:36
Толщина линии зависит еще от силы нажима, который зависит от человека и формы линии, кроме того линия не обязательно образуется движущейся точкой, в случае карандаша или перьевой ручки это может быть и линия.

Потом еще можно добавить разные варианты написания для отдельных букв и букв в начале, конце и середине слова (я например пишу а и о в начале слова против часовой стрелки, а в середине наоборот)

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

Автор: Artemios 27.12.2006, 18:08
Цитата(nickless @  25.12.2006,  01:36 Найти цитируемый пост)
Потом еще можно добавить разные варианты написания для отдельных букв и букв в начале, конце и середине слова (я например пишу а и о в начале слова против часовой стрелки, а в середине наоборот)

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

Цитата(nickless @  25.12.2006,  01:36 Найти цитируемый пост)
проще если вместо физически точного моделирования обойтись описанием всех параметров линии, т.е. кроме позиции для каждой контрольной точки еще добавить скажем толщину, нажим (интенсивность цвета), границы для случайного изменения параметров функции, какая функция используется итд. 

Как раз мой вопрос и возник из мысли об автоматизации просчета всех этих параметров. С одной стороны, пока я экспериментирую с одним почерком, своим, и набором букв русского алфавита, возможно бы было и проще явно задавать все значения (хотя все равно трудоемко). В более широкой постановке: имитация человеческого письма. Необязательно только на русском, не обязательно только буквы алфавита (формулы, мелкие рисунки "от руки" и т.д.). В общем, в некоторой степени аналог LaTeX-а с "рукописным" выходом. Ну а набором параметров задавать именно общую характеристику письма некоторого человека (как жмет, как руку держит, как перо наклоняет... а может быть, производить обучение системы на отсканированных рукописях...)
Глобально, конечно, один врятли осилю (все-таки я не Кнут)), но если бы хоть что-то начало получаться -- можно было б единомышленников искать...


Автор: KpoHyc 11.1.2007, 03:28
Крайне интересная задачка скажу я вам...Наверно займусь в отрыве от Вас...факультативно так сказать...

Автор: Artemios 12.1.2007, 05:26
smile Да я пока еще и не занимаюсь ею, только обдумываю...

Теперь о том, что пока "надумал".
Выше я упоминал, что начальный вариант программы строит векторную графику. Только здесь я понимал низкоуровневую графику (конкретно -- gnuplot), а о профессиональном ПО для работы с векторной графикой я как-то не задумывался, и зря. Как выяснилось, все мои вопросы о внешнем виде, форме линии в зависимости от множества параметров (нажим, наклон, фактура поверхностей etc) -- уже разрешены. Статические параметры можно программе указать явно; динамические -- считываются с устройства ввода (скорость, направление -- если рисуем мышью, еще плюс к этому наклон пера и нажим -- если на планшете).

Траектория движения кончика пера рассчитывалась еще в первоначальном алгоритме.
Осталось:
 - скорость
 - наклон пера
 - нажим на перо
А имея расчет всех этих параметров в принципе можно будет организовать виртуальное устройство, эмулирующее ввод с планшета. Либо некий плагин к имеющемуся ПО... Хотя нет, к конкретному ПО лучше не привязываться...

Будущая математическая модель (возможная).
Имеется горизонтальная плоскость, либо плоскость под небольшим углом.
Задана некоторая траектория движения точки в этой плоскости.
Под меняющимся углом к этой плоскости -- "стило", конец которого и представляет точку, движущуюся по маршруту.
Задана система рычагов (5-8 штук, на шарнирных соединениях), стило жестко связано с этой системой, также система имеет одну абсолютно неподвижную точку. Для каждого соединения заданы степени свободы и коэффициенты сопротивления движениям в различных направлениях.
Задано время, за которое движущаяся в плоскости точка должна переместиться из начального положения в конечное.
Как мне кажется, всего этого должно быть достаточно для просчета и скоростей, и нажимов, и наклонов. Только самих расчетов будет немеряно, а сначала еще коэффициенты рычажно-шарнирной системы подгонять под конкретную человеческую руку...

Добавлено @ 05:30 
Как упростить сие можно?

Автор: Elio 16.2.2007, 22:00
Я не програмист но вообщем мне кажеться все немного проще... Я читал статью реалезации такой программы на Делфи, суть была в том, что ты печатал на принтере в рядок 20 клеточек в каждой из них ты писал:" а а а а а а а а", естественно каждая буква немного отличалась от предыдущей, ну так же поступали с со всеми остальными буквами... Суть весьма проста, но как реализовались переходы от букве к букве я уже не помню... Тем не менее мне кажиться что если сделать по 100-200 вариантов написания буквы в полурендомном режиме последующего отбора, то получиться весьма не плохо... Если же и этого будет не достаточно то ручку в руки и сканировать уже не буквы а слоги. Вообщем удачи, если бы я умел я бы смог сделать  smile  smile  smile .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)