Разработка приложения 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 - большой палец вниз;
конец ввода числа - помахивание;
арифметические операции +, -, /, * - жесты скольжения вверх, вниз, влево, вправо, соответственно.
- Разработайте с помощью модуля распознавания жестов приложение с "воздушным" манипулятором типа "мышь".
- С помощью модуля распознавания жестов разработайте модель "Машины Тьюринга"