Разработка приложения c использованием модуля SDK распознавания жестов
Если в вашем проекте используются предварительно откомпилированные заголовки, то компиляция любого файла, не содержащего #include "stdafx.h", будет остановлена с ошибкой. Что бы этого не случилось в нашем случае необходимо сделать следующее: добавить в начало файла gesture_render.cpp строчку
#include "stdafx.h"
4. Теперь можно переходить непосредственно к коду программы.
Мы создадим приложение, которое позволит с помощью жестов вводить текст на консольное окно. В данном примере, можно будет посимвольно ввести слово "hello!".
Для начала добавим в наше приложение следующие предопределенные заголовки:
#include "util_pipeline.h" – предоставляет доступ к видео-потоку
#include "gesture_render.h" – подключение утилиты gesture_render
#include "pxcgesture.h" – подключение интерфейса PXCgesture
Для создания нашего первого простого приложения по распознаванию жестов, мы будем использовать UtilPipeline класс и определим новый класс GesturePipeline, который является наследником утилитного класса.
class GesturePipeline: public UtilPipeline {
...
};
В классе определим конструктор GesturePipeline, в котором будем вызывать функцию EnableGesture(). Данная функция конфигурирует конвейер и позволяет отслеживать ладони и пальцы и распознавать жесты.
class GesturePipeline: public UtilPipeline {
public:
GesturePipeline (void):UtilPipeline(),m_render(L"Gesture Viewer") {
EnableGesture();
}}
SDK информирует наше приложение, когда жест распознан вызовом метода OnGesture. Переменная data предоставляет информацию, которая позволяет нам распознать жест.
virtual void PXCAPI OnGesture(PXCGesture::Gesture *data) {}
На основе того какой жест был распознан, мы можем выполнять различные действия, в нашем случае вывод на консоль.
switch (data->label) {
case PXCGesture::Gesture::LABEL_NAV_SWIPE_LEFT: wprintf_s(L"h"); break;
}
В нашем приложении воспользуемся жестами скольжение влево, скольжение вправо и позами победа, большой палец вверх и большой палец вниз. При распознавании жеста будет выводиться буква.
Когда SDK может предоставить новый фрейм для обработки вызывается метод OnNewFrame.
virtual bool OnNewFrame(void) {
return m_render.RenderFrame(QueryImage(PXCImage::IMAGE_TYPE_DEPTH),
QueryGesture(), &m_gdata);
}
Ниже представлен весь код класса GesturePipeline:
#include "stdafx.h"
#include "util_pipeline.h"
#include "gesture_render.h"
#include "pxcgesture.h"
//Создание наследника класса UtilPipeline
class GesturePipeline: public UtilPipeline {
public:
//создание конструктора
GesturePipeline (void):UtilPipeline(),m_render(L"Gesture Viewer") {
//вызов функции позволяющей распознавать жесты
EnableGesture();
}
//функция OnGesture вызывается, когда жест распознан
virtual void PXCAPI OnGesture(PXCGesture::Gesture *data) {
if (data-"active) m_gdata = (*data);
switch (data-"label) {
case PXCGesture::Gesture::LABEL_NAV_SWIPE_LEFT: wprintf_s(L"h"); break; //действие на жест скольжение влево
case PXCGesture::Gesture::LABEL_NAV_SWIPE_RIGHT: wprintf_s(L"e"); break; //действие на жест скольжение вправо
case PXCGesture::Gesture::LABEL_POSE_PEACE: wprintf_s(L"l"); break;//действие на позу победа
case PXCGesture::Gesture::LABEL_POSE_THUMB_DOWN: wprintf_s(L"!"); break; //действие на позу большой палец вниз
case PXCGesture::Gesture::LABEL_POSE_THUMB_UP: wprintf_s(L"o"); break;//действие на позу большой палец вверх
case PXCGesture::Gesture::LABEL_HAND_WAVE: wprintf_s(L"God buy!!"); break; //действие на жест помахивание
}
}
//обнаружение нового фрейма
virtual bool OnNewFrame(void) {
return m_render.RenderFrame(QueryImage(PXCImage::IMAGE_TYPE_DEPTH),
QueryGesture(), &m_gdata);
}
protected:
GestureRender m_render;
PXCGesture::Gesture m_gdata;
};
В главный код программы добавьте следующий код:
GesturePipeline pipeline; pipeline.LoopFrames();
В этом коде создается GesturePipeline объект, который вызывает функцию LoopFrames() для обработки любого входящего с камеры фрейма.
При запуске программы у нас появится консольное окно и глубинное изображение с камеры, как на рис. 5.5.
Наше приложение позволяет обрабатывать 2 вида жестов и 3 позы, с помощью которых на консоль выводятся символы:
Скольжение влево – h
Скольжение вправо – e
Победа – l
Большой палец вверх – о
Большой палец вниз – !
На рис. 5.6 представлен результат работы программы – ввод строчки hello! на консоль с помощью жестов.

Рис. 5.6. Результат работы программы – вывод на консоль строчки "hello!" на основе распознавания жестов
Задания для самостоятельной работы:
- Разработайте приложение для двоичной арифметики, используя позы и жесты, данного модуля (модуля распознавания жестов). Например,
0 - большой палец вверх;
1 - большой палец вниз;
конец ввода числа - помахивание;
арифметические операции +, -, /, * - жесты скольжения вверх, вниз, влево, вправо, соответственно.
- Разработайте с помощью модуля распознавания жестов приложение с "воздушным" манипулятором типа "мышь".
- С помощью модуля распознавания жестов разработайте модель "Машины Тьюринга"
