Высокоуровневые средства распознавания жестов в пакете Intel Perceptual Computing SDK
Особенности выполнения жестов
Все жесты и позы могут быть выполнены как правой, так или левой рукой, в жестах, выполняемых двумя руками (например, захват объекта двумя руками для изменения размера), не имеет значения, какая рука будет захватывать объект первой.
Для многих жестов, число пальцев участвующих в жесте не имеет значения. Например, панорамирование может быть выполнено, если все пальцы вытянуты, или только некоторые из них ( рис. 4.10). Ограничения по количеству пальцев существуют только там, где необходимо избежать конфликта. Например, указательный палец может быть зарезервирован для указания места, в котором будет выполняться операция масштабирования.
Положение пальцев руки в позах может слегка отличаться от описания. Например, на точность панорамирования не влияет, будут ли пальцы соединены вместе или веером ( рис. 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.