Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 23.10.2013 | Доступ: свободный | Студентов: 1822 / 663 | Длительность: 09:26:00
Специальности: Программист
Лекция 3:

Высокоуровневые средства распознавания жестов в пакете Intel Perceptual Computing SDK

Особенности выполнения жестов

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

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

Выполнение масштабирования при участии всех пальцев и при участии не всех пальцев

Рис. 4.10. Выполнение масштабирования при участии всех пальцев и при участии не всех пальцев

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

Выполнение операции панорамирование ладонью с пальцами веером и соединенными пальцами

Рис. 4.11. Выполнение операции панорамирование ладонью с пальцами веером и соединенными пальцами

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

Общий алгоритм создания приложений по распознаванию жестов, положения рук, пальцев, уровень открытости ладони

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

  • Приложению необходимо вызвать функцию EnableGesture, позволяющую распознавать и идентифицировать пальцы и жесты. Это обычно делается в конструкторе от производного класса UtilPipeline.
  • Дополнительно, приложение может переопределить функцию OnGestureSetup для точной настройки каких-либо параметров во время инициализации модуля.
  • Если приложение должно получить уведомление о распознании позы/жеста, приложение может переопределить функцию OnGesture. Кроме того, приложение может переопределить функцию OnAlert для получения предупреждающих уведомлений.
  • В каждом кадре, приложение может использовать функцию QueryGesture для получения экземпляра PXCGesture и предоставления параметрам функции доступа к деталям геометрического узла или BLOB данным.
class MyPipeline: public UtilPipeline {
...
 MyPipeline(...):UtilPipeline(...) {
   ...
   EnableGesture();
   ...
 }
 virtual void OnGestureSetup(PXCGesture::Profile *profile) {}
 virtual void PXCAPI OnGesture(PXCGesture::Gesture *data) {}
 virtual void PXCAPI OnAlert(PXCGesture::Alert *data) {}
 virtual bool OnNewFrame(void) {
   ...
   QueryGesture()->QueryNodeData(...);
   ...
   QueryGesture()->QueryBlobData(...);
   ...
 }
 ...
}
4.1. Распознавания и идентификации пальцев и жестов в UtilPipeline

Если приложение напрямую обращается к интерфейсу PXCGesture, то должна выполняться следующая процедура:

1. Расположение модуля реализации: Приложение использует функцию PXCSession::CreateImpl для создания экземпляра интерфейса PXCGesture, как показано на примере 4.2. Дополнительные пути расположения модуля реализации можно узнать из описания функции CreateImpl.

PXCGesture *gesture=0;
session->CreateImpl(PXCGesture::CUID,(void**)&gesture);
4.2. Создание экземпляра PXCGesture

2. Инициализация модуля: Для инициализации модуля используются две функции QueryProfile и SetProfile. Первая функция возвращает доступные конфигурации. Последняя содержит одну конфигурацию в качестве текущей активной конфигурации. В примере 4.3, приложение запрашивает первую поддерживаемую конфигурацию, использует ее, чтобы найти устройство ввода, которое может предоставить данные, а затем инициализирует модуль с конфигурацией. Следует отметить, что характеристики ввода модуля жестов задаются как часть ProfileInfo структуры, которая может быть как глубинным изображением, и/или цветным изображением. Служебный класс UtilCapture обнаружит устройство ввода, соответствующее входным характеристикам модуля жестов.

PXCGesture::ProfileInfo pinfo;
gesture->QueryProfile(0,&pinfo);
UtilCapture capture(&session);
capture.LocateStreams(&pinfo.inputs);
gesture->SetProfile(&pinfo);
4.3. Инициализация модуля Gesture

Кроме того, приложение может создать обработчик уведомлений обнаружения жестов (SubcribeGesture) или уведомление обработчика (SubscribeAlert).

3. Цикл обработки данных: В цикле приложение передает данных от устройства ввода в Gesture модуль для распознавания и идентификации. Для передачи данных приложение вызывает функцию ProcessImageAsync, как показано в примере 4.4. Следует отметить, что данные из устройства ввода могут содержать комбинированные изображения, такие как цветные и глубинные изображения. Приложение может использовать набор функций PXCSmartArray<PXCImage> для упрощения программирования.

PXCSmartArray<PXCImage> images;
PXCSmartSPArray sps(2);
for (;;) {
// Получение выборок с входного устройства и передача их модулю распознавания жестов
capture.ReadStreamAsync(images.ReleaseRefs(),sps.ReleaseRef(0));
gesture->ProcessImageAsync(images,sps.ReleaseRef(1));
sps.SynchronizeEx();
// Отслеживание и распознавания результатов закончено. Сейчас идет их обработка...
...
}
4.4. Цикл обработки данных модуле Gesture

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

Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко