Введение в естественно-интуитивное взаимодействие с компьютером

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

Разбить на страницы
Показывать лекцию целиком

Дополнительный материал к лабораторной работе можно скачать здесь.

1. Для начала создайте новый проект и настройте его для работы с Intel SDK, так это делали на практическом занятии №1.

2. Для упрощения работы в нашем первом приложении мы воспользуемся утилитой gesture_render для визуализации пальцев и жестов. Для этого нам необходимо скопировать эту утилиту в наш проект следующим образом:

  • Скопируйте из архива M51-lect-3-lab-2-prg.zip (приложение к практическому заданию) из каталога First_gesture_app файл gesture_render.cpp в каталог проекта;
  • Скопируйте из M51-lect-3-lab-2-prg.zip папку res в каталог проекта.
  • Добавьте gesture_render.cpp и res/gesture_viewer.rc к вашему проекту. Для этого в Solution Explorer кликните правой кнопкой мышки по Source Files, а затем выберите Add -> Existing Item, в открывшемся окне выберите gesture_render.cpp, gesture_viewer.rc добавьте в Resources Files аналогичным способом.
  • (рис 5.1) Добавление утилиты к проекту
  • Добавьте каталог res в дополнительные директории проекта в Project ->Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories
  • (рис 5.2) Добавление каталога в дополнительные директории проекта
  • Теперь добавим msimg32.lib в дополнительные библиотеки проекта.
  • (рис 5.3) Добавление библиотеки в дополнительные библиотеки проекта

    3. Следующий шаг необходимо выполнить, если в вашем проекте используются предварительно откомпилированные заголовки. Понять это можно, если в папке проекта есть файл stdafx.h - предкомпилируемый заголовок со стандартным именем (рис 5.4).

    (рис 5.4) Предкомпилируемый заголовок со стандартным именем stdafx.h

    Предварительно откомпилированные заголовки используются для ускорения компиляции программ за счёт предварительной обработки заголовочных файлов, которые содержат интерфейсы модулей и, согласно нормам данных языков программирования, подключаются к программе путём прямой вставки их текстов в тело основной программы с помощью специальной директивы препроцессора #include.

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

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

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

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

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

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

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

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

  • Разработайте с помощью модуля распознавания жестов приложение с "воздушным" манипулятором типа "мышь".
  • С помощью модуля распознавания жестов разработайте модель "Машины Тьюринга"
  • Страницы:

    Дополнительный материал к лабораторной работе можно скачать здесь.

    1. Для начала создайте новый проект и настройте его для работы с Intel SDK, так это делали на практическом занятии №1.

    2. Для упрощения работы в нашем первом приложении мы воспользуемся утилитой gesture_render для визуализации пальцев и жестов. Для этого нам необходимо скопировать эту утилиту в наш проект следующим образом:

  • Скопируйте из архива M51-lect-3-lab-2-prg.zip (приложение к практическому заданию) из каталога First_gesture_app файл gesture_render.cpp в каталог проекта;
  • Скопируйте из M51-lect-3-lab-2-prg.zip папку res в каталог проекта.
  • Добавьте gesture_render.cpp и res/gesture_viewer.rc к вашему проекту. Для этого в Solution Explorer кликните правой кнопкой мышки по Source Files, а затем выберите Add -> Existing Item, в открывшемся окне выберите gesture_render.cpp, gesture_viewer.rc добавьте в Resources Files аналогичным способом.
  • (рис 5.1) Добавление утилиты к проекту
  • Добавьте каталог res в дополнительные директории проекта в Project ->Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories
  • (рис 5.2) Добавление каталога в дополнительные директории проекта
  • Теперь добавим msimg32.lib в дополнительные библиотеки проекта.
  • (рис 5.3) Добавление библиотеки в дополнительные библиотеки проекта

    3. Следующий шаг необходимо выполнить, если в вашем проекте используются предварительно откомпилированные заголовки. Понять это можно, если в папке проекта есть файл stdafx.h - предкомпилируемый заголовок со стандартным именем (рис 5.4).

    (рис 5.4) Предкомпилируемый заголовок со стандартным именем stdafx.h

    Предварительно откомпилированные заголовки используются для ускорения компиляции программ за счёт предварительной обработки заголовочных файлов, которые содержат интерфейсы модулей и, согласно нормам данных языков программирования, подключаются к программе путём прямой вставки их текстов в тело основной программы с помощью специальной директивы препроцессора #include.

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

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

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

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

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

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

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

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

  • Разработайте с помощью модуля распознавания жестов приложение с "воздушным" манипулятором типа "мышь".
  • С помощью модуля распознавания жестов разработайте модель "Машины Тьюринга"
  • Вернуться к учебному плану