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

Разработка приложения c использованием модуля SDK распознавания жестов

< Лекция 3 || Самостоятельная работа 2: 12 || Лекция 4 >

Если в вашем проекте используются предварительно откомпилированные заголовки, то компиляция любого файла, не содержащего #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.5.

Консольное окно и глубинное изображение при запуске программы

Рис. 5.5. Консольное окно и глубинное изображение при запуске программы

Наше приложение позволяет обрабатывать 2 вида жестов и 3 позы, с помощью которых на консоль выводятся символы:

Скольжение влево – h

Скольжение вправо – e

Победа – l

Большой палец вверх – о

Большой палец вниз – !

На рис. 5.6 представлен результат работы программы – ввод строчки hello! на консоль с помощью жестов.

Результат работы программы – вывод на консоль строчки "hello!" на основе распознавания жестов

Рис. 5.6. Результат работы программы – вывод на консоль строчки "hello!" на основе распознавания жестов

Задания для самостоятельной работы:

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

    0 - большой палец вверх;

    1 - большой палец вниз;

    конец ввода числа - помахивание;

    арифметические операции +, -, /, * - жесты скольжения вверх, вниз, влево, вправо, соответственно.

  2. Разработайте с помощью модуля распознавания жестов приложение с "воздушным" манипулятором типа "мышь".
  3. С помощью модуля распознавания жестов разработайте модель "Машины Тьюринга"
< Лекция 3 || Самостоятельная работа 2: 12 || Лекция 4 >
Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко