На главную

Библиотека Интернет Индустрии I2R.ru

Rambler's Top100

Малобюджетные сайты...

Продвижение веб-сайта...

Контент и авторское право...

Забобрить эту страницу! Забобрить! Блог Библиотека Сайтостроительства на toodoo
  Поиск:   
Рассылки для занятых...»
I2R » Сайтостроительство » Инструменты вебмастера

Программирование графического планшета: теория и практика

Графический планшет — устройство, незаслуженно обойденное вниманием пользователей. Безусловно, профессиональные художники знают и ценят его, но широкие массы до сих пор относятся к планшетам довольно настороженно. Причины в основном связаны с историей этого устройства: долгое время планшет считался профессиональным инструментом художника, а поскольку рисовать умеют далеко не все... Сегодня ситуация меняется. Графический планшет (точнее, специальная его модификация) стал стандартным компонентом машин класса Tablet PC. Ретуширование цифровых фотографий тоже задача, возникающая достаточно часто. А развитие технологий рукописного ввода приводит к тому, что планшет проникает даже в столь консервативную сферу деятельности, как бухгалтерский учет — заполнять разнообразные бланки «от руки» намного проще и удобнее, чем постоянно перебрасывать руку с мыши на клавиатуру и обратно.

На сегодня графическим планшетам Wacom альтернативы практически нет. Хотя эти устройства выпускаются никак не менее чем десятком компаний, профессионально планшетами занимается только Wacom. Дело в том, что на ранних стадиях развития этого рынка компания запатентовала ряд весьма прогрессивных технических решений, без которых практически невозможно создать «бесконтактные» модели. Главная особенность планшетов Wacom состоит прежде всего в том, что для работы пера не нужны батарейки или кабели питания. С точки зрения пользователя, это обстоятельство кардинально улучшает эргономику, особенно когда речь идет о длительной работе с планшетом, поэтому неудивительно, что Wacom вытеснила практически всех соперников.

С технической точки зрения графический планшет — довольно сложная конструкция, состоящая из собственно планшета и устройства ввода (пера или мыши). Перо Wacom — приемник, основанный на эффекте магнитной индукции, который используется как для определения координат пера, так и для питания внутренних схемотехнических элементов планшета. Горизонтальные и вертикальные проводники, играющие роль своеобразных «антенн», генерируют импульсы в режиме «опрос/передача» с периодом 20 мс. Электромагнитный сигнал активизирует колебательный контур, состоящий из катушки и конденсатора и размещенный в кончике пера. Полученный сигнал поступает через модулятор в контроллер. Сигналы же, регистрирующие прикосновение пера к планшету и нажатие боковой кнопки, сначала поступают в контроллер, а оттуда — в модулятор, который возвращает сигнал в колебательный контур, откуда он передается обратно на планшет. Планшет позволяет фиксировать не только координаты точки прикосновения пера, но и целый ряд других параметров, как основных (сила нажатия, угол наклона, поворота), так и дополнительных (идентификатор пера, тип устройства — перо или мышь, коды клавиш и т. д.). Модельный ряд планшетов Wacom довольно обширен, в него входят модели как начального уровня (PenPartner, Volito), так и профессиональные (Graphire, Intuos, Cintiq, PL-720), планшеты разнятся форматами, разрешением и количеством фиксируемых параметров. Впрочем, подробные обзоры ряда моделей Wacom можно найти на нашем сайте (www.pcmag.ru) или в других номерах журнала. Предмет данной статьи — небольшая демонстрация организации программно-аппаратного взаимодействия в реальных прикладных разработках.

Программирование графического планшета: теория и практика

Планшет, который умеет читать

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

Нужно заметить, что задача распознавания имеет давнюю историю. Самый, пожалуй, известный пример — Apple Newton Message Pad, где рукописное распознавание (пусть и весьма несовершенное) было основным методом ввода информации. В России... точнее, еще в СССР также имелись серьезные наработки в области распознавания (не только рукописного), многие из которых позднее стали основой для ряда хорошо известных сегодня программных продуктов.

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

Теория: распознавание рукописного ввода

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

Основной единицей «измерения» в системе распознавания выступает штрих, нарисованный пользователем без отрыва пера. При этом символ, соответствующий одной букве алфавита, может быть написан одним (скажем, е, с) или несколькими (х, ж) росчерками. Как известно, с распознаванием разных типов почерка человеческий глаз справляется без ощутимых затруднений, что, в общем, неудивительно, если вспомнить, что за работу одного только фоторецептора сетчатки отвечает около 700 нейронов. В программной системе, связанной естественными ограничениями, которые налагает аппаратная база, этап распознавания, очевидно, упрощен, но тем не менее все равно предполагает большой объем вычислительной работы и анализ огромного количества параметров (до 1000), таких, как количество росчерков, кривизна, направление движения, пересечения и др. В ходе процедуры распознавания анализируется траектория пера, причем в несколько этапов. Первый из них — фильтрация, устранение неровностей (шумов) траектории, появление которых неизбежно при написании символов (дрожание руки и т. д.). По завершении процедуры фильтрации и первоначального анализа символ сопоставляется с эталоном. Эталон — набор устойчивых признаков, характеризующих букву. За каждой буквой закреплено несколько эталонов, соответствующих наиболее распространенным способам ее написания. Сопоставление параметров, полученных в результате анализа траектории введенного символа, выполняется для каждой буквы алфавита, вероятность совпадения выражается в некоторой обобщенной оценке или процентах. Далее вполне закономерной выглядит гипотеза, что совпадение максимального числа параметров символа и эталона означает появление искомого символа. В ряде случае также имеется этап постобучения, когда пользователь из нескольких предлагаемых системой распознавания символов вручную выбирает правильный, таким образом «обучая» ее (впрочем, при достаточно большой БД почерков эта процедура обычно опускается).

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

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

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

Практика: на программной стороне

Если говорить о графических планшетах Wacom (а обсуждать другие варианты, как уже отмечалось, не имеет практического смысла), то следует заметить, что относительная сложность программно-аппаратной организации работы планшета инкапсулирована в системные модули, для работы с которыми предусматривается весьма простой и удобный API. За более подробной информацией имеет смысл обратиться на сайт Wacom для разработчиков (см. врезку «Полезные ссылки»), здесь мы рассмотрим лишь краткий пример. Предоставляемые компанией Wacom инструментальные средства позволяют интегрировать работу с планшетами в прикладные программы для практически любой платформы, от Windows и Macintosh до UNIX/Linux и Tablet PC (вопросы программирования для Tablet PC мы пока рассматривать не будем; хотя эта платформа и представляет собой модификацию Windows, но имеет ряд специфических особенностей). Пользователям Linux также можно порекомендовать ознакомиться с информацией Linux Wacom Project, независимой реализацией драйверов планшетов Wacom для подсистемы XInput в XFree86/X11R6 (X Window System).

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

После инсталляции SDK в первую очередь следует настроить параметры будущего проекта, В частности добавить пути к заголовочным и библиотечным файлам SDK, а также подключить файл wintab32.lib. В этом случае инициализация соответствующих библиотек будет выполняться автоматически, и вмешиваться в этот процесс обычно не требуется. Фактически единственный резон сделать это — перехват невразумительного сообщения об ошибке при отсутствии драйверов или каких-то проблемах с планшетом (по умолчанию выводится малопонятное сообщение об отсутствии необходимых DLL). Ну и, разумеется, если планшет — не единственный способ ввода графической информации в будущем проекте, то имеет смысл сделать динамическую загрузку библиотеки планшета и самостоятельную обработку всех возможных ошибок.

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

#include "wintab.h"
#define PACKETDATA PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE
#define PACKETMODE 0
#include "pktdef.h"

Так описан контекст, определяющий получение сообщений об изменении горизонтальных координат пера, состояний кнопок и величине давления, создаваемого пером. Таких описаний может быть несколько, нужно лишь повторить вторую, третью и четвертую строки, заменив 0 на порядковый номер определения. Комбинируя различные константы в PACKETDATA, можно получить контексты с самыми разнообразными свойствами: контекст, контролирующий касательные давления, угол наклона пера и другие параметры во всех возможных комбинациях.

Далее следует описать класс, где инкапсулированы функции работы с планшетом. Его интерфейс выглядит так:

class wacom_receiver{
public:
   wacom_receiver(HWND window);
   ~wacom_receiver();
   struct packet{
      bool pushed;
      int x;
      int y;
   };
   packet get_packet(WPARAM wParam) const;
private:
   HCTX hContext_; // Контекст устройства
   HWND window_; // Дескриптор окна
   LOGCONTEXT log_context_; //
};

Как и полагается, перед началом работы выполняем инициализацию, по завершении — освобождаем занятые ресурсы. В конструкторе для этого выполняются два вызова функций API. Сначала получаем информацию об устройстве (WTInfo), а затем происходит регистрация контекста (WTOpen). Единственный параметр конструктора — дескриптор окна, которое будет получать сообщения об изменении состояний пера и планшета. Деструктор делает единственный вызов, закрывающий контекст.

wacom_receiver::wacom_receiver(HWND window) : window_(window){
WTInfo(WTI_DEFCONTEXT, 0, &log_context_);
//Статическая информация.
log_context_.lcPktData = PACKETDATA;
log_context_.lcPktMode = PACKETMODE;
log_context_.lcOptions = CXO_MESSAGES;
hContext_ = WTOpen( window_, &log_context_, TRUE );// Контекст.
if(!hContext_)
   throw bad_function_result("WTOpen");
}

wacom_receiver::~wacom_receiver(){
   WTClose(hContext_);
}

Последним действием будет реализация функции, получающей информацию от планшета. При получении сообщения WT_PACKET функция окна, описанного дескриптором, переданным в конструктор wacom_receiver, должна вызвать wacom_receiver::get_packet и затем предпринять какие-то действия. Одному получению сообщения WT_PACKET должен соответствовать один вызов WTPacket, а значит, и один вызов wacom_receiver::get_packet. При получении пакета можно выяснить, касалось ли перо планшета при перемещении на планшет, или его просто переносили «по воздуху». Сделать это можно, проверив значение packet::pushed. Здесь стоит обратить внимание на аккуратную обработку возможных блокировок, чтобы не войти в обработчик сообщения WT_PACKET дважды, не завершив обработку первого ввода.

wacom_receiver::packet
wacom_receiver::get_packet(WPARAM wParam)
const{
   PACKET pkt;
   WTPacket( hContext_, wParam, &pkt );
   packet pack;
   pack.pushed = pkt.pkButtons != 0;
   pack.x = pkt.pkX;
   pack.y = pkt.pkY;
   return pack;
}

Обратите внимание: приведенный выше класс не имеет никаких функций для проверки активности программы и допустимости получения сообщений от планшета. Эти проблемы решают библиотеки Wintab API. Если программа теряет фокус ввода, то она автоматически перестает получать сообщения; при возвращении фокуса поток сообщений возобновится. Конечно же, можно изменить такой порядок вещей, но, как правило, это не требуется.

Собственно это все. С точки зрения программиста, API планшетов Wacom организовано весьма стройно и логично, при разработке программ никаких проблем обычно не возникает (разумеется, при условии внимательного чтения документации). Подготовленный нами класс прост, но его уже достаточно для работы с планшетом. Фактически этот пример представляет собой несколько сокращенную версию модуля, используемого в пакете распознавания рукописного ввода PenReader для планшетов Wacom (в скобках заметим, что интеграция модулей подсистемы распознавания в прикладное ПО может быть еще более упрощена, если воспользоваться пакетом PenReader SDK). Данный пример легко развить для применения в реальных задачах, например извлечения дополнительной информации, которая затем будет передаваться соответствующим модулям программы.

Статьи по теме:

Авторы: Николай Аблязов, Сергей Петров
Источник: PC Magazine/RE №6/2006

Рассылки Subscribe.ru:

Библиотека сайтостроительства - новости, статьи, обзоры
Дискуссионный лист для web-разработчиков
Подписка на MailList.Ru
Автор: NunDesign
Другие разделы
Оптимизация сайтов
Web-студии
» Новое в разделе
Web-дизайн
Web-программирование
Интернет-реклама
Раскрутка сайта
Web-графика
Flash
Adobe Photoshop
Рассылка
Инструменты вебмастера
Контент для сайта
HTML/DHTML
Управление web-проектами
CSS
I2R-Журналы
I2R Business
I2R Web Creation
I2R Computer
рассылки библиотеки +
И2Р Программы
Всё о Windows
Программирование
Софт
Мир Linux
Галерея Попова
Каталог I2R
Партнеры
Amicus Studio
NunDesign
Горящие путевки, идеи путешествийMegaTIS.Ru

2000-2008 г.   
Все авторские права соблюдены.
Rambler's Top100