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

Настройка Intel Perceptual Computing SDK для использования с openFrameworks приложениями

< Лекция 7 || Самостоятельная работа 6: 1234

Программирование

Разработаем программу, которая:

  1. отображает фигуру (например, круг) в окне openFramework;
  2. позволяет с помощью голосовых команд: "up", "down", "right", "left" двигать фигуру в соответствующем направлении.

Пустой проект MyExample содержит три файла: testApp.h, testApp.cpp, main.cpp

Файл main.cpp выполняет запуск приложения и его лучше не менять.

Файл main.cpp пустого проекта MyExample

увеличить изображение
Рис. 13.5. Файл main.cpp пустого проекта MyExample
Файл testApp.h пустого проекта MyExample

увеличить изображение
Рис. 13.6. Файл testApp.h пустого проекта MyExample

Файл testApp.h содержит объявления необходимых переменных, классов и функций. В этот файл необходимо внести изменения.

Подключим заголовочный файл:

#include "util_pipeline.h"

Добавим в класс testApp объявления методов:

void exit();
void OnVoiceRecognized(PXCVoiceRecognition::Recognition *data);

Дополнительно к классу testApp объявим класс VoiceReco, этот класс является наследником класса UtilPipeline, необходим для взаимодействия с модулем распознавания речи Perceptual Computing SDK:

class VoiceReco;
...
class VoiceReco : public UtilPipeline{
    private:
    testApp *of;
    public:
    void SetOFApp(testApp *app){
      of = app;
    }
    void PXCAPI OnRecognized(PXCVoiceRecognition::Recognition *data){
      of->OnVoiceRecognized(data);
    }
};

добавить поле

protected:
     VoiceReco *pipeline;

в класс testApp.

После всех изменений файл testApp.h будет выглядеть следующим образом:

#pragma once

#include "ofMain.h"
#include "util_pipeline.h"

class VoiceReco;
class testApp : public ofBaseApp{

  public:
    void setup();
    void update();
    void draw();
    void exit();
    void OnVoiceRecognized(PXCVoiceRecognition::Recognition *data);

  protected:
     VoiceReco *pipeline;  
};

class VoiceReco : public UtilPipeline{
    private:
    testApp *of;   
    public:
    void SetOFApp(testApp *app){
      of = app;
    }
    void PXCAPI OnRecognized(PXCVoiceRecognition::Recognition *data){
      of->OnVoiceRecognized(data);
    }
};
Файл testApp.cpp пустого проекта MyExample

увеличить изображение
Рис. 13.7. Файл testApp.cpp пустого проекта MyExample

Файл testApp.cpp содержит описание основных функций, чтобы получить требуемую программу в него необходимо внести изменения:

Подключим заголовочный файл:

#include "util_pipeline.h"

Объявим две переменные, которые будут отвечать за положение фигуры на экране, для фигуры круг, положение определяют координаты центра:

int centerX;
int centerY;

Напишем реализацию необходимых функций:

Функция setup() вызывается в самом начале жизненного цикла приложения, до появления окна программы, в этой функции обычно задаются все необходимые начальные значения и запускается функция Init() для инициализации конвейера.

void testApp::setup(){
  centerX=150;
  centerY=150;
  
      ofSetWindowShape(640,480);
  ofSetLogLevel(OF_LOG_NOTICE);

  // создаем список команд, которые будет выполнять приложение
  vector>lt;wstring> commands;
  commands.push_back(L>quot;up>quot;);
  commands.push_back(L>quot;down>quot;);
  commands.push_back(L>quot;right>quot;);
  commands.push_back(L>quot;left>quot;);

  // запускаем PCSDK распознавание речи
  pipeline = new VoiceReco();
  pipeline->SetOFApp(this);  // this will allow us to call 
  pipeline->EnableVoiceRecognition();

  pipeline->SetVoiceCommands(commands);
    
  pipeline->Init();
}

Функции update() и draw() запускаются после функции setup() и выполняются по очереди в цикле, пока программа не закончит работу. По умолчанию эти функции вызываются настолько быстро, насколько позволяет компьютер. Функция update() используется для обновления состояния программы, т.е. изменения значений переменных, функция draw() рисует объекты в окне приложения.

void testApp::update(){
  // захватывает аудио и позволяет SDK инициировать событие OnRecognized
  if(pipeline->AcquireFrame(false))
  {
    pipeline->ReleaseFrame();
  }
}

void testApp::draw(){
       //рисование фигуры
  ofCircle(сenterX,сenterY,25);
}

В классе testApp объявлена функция OnVoiceRecognized, в которую в качестве параметра передается переменная типа PXCVoiceRecognition::Recognition, в этой переменной хранится вся информация о захваченной и распознанной речи.

data->label - содержит номер распознанной команды в заданном списке команд

void testApp::OnVoiceRecognized(PXCVoiceRecognition::Recognition *data)
{
  wcout<<data->dictation<<endl;
  if (data->label==0) {
    сenterY=сenterY-10;
    if (сenterY<0) сenterY=ofGetWindowHeight()-25;
  }
  if (data->label==1) {
    сenterY=сenterY+10;
    if (сenterY>ofGetWindowHeight()) сenterY=25;
  }
  if (data->label==2) {
    сenterX=сenterX+10;
    if (сenterX>ofGetWindowWidth()) сenterX=25;
  }
  if (data->label==3) {
    сenterX=сenterX-10;
    if (сenterX<0) сenterX=ofGetWindowWidth()-25;
  }
}

В классе testApp объявлена функция exit, которая определяет действия выполняемые при завершении работы приложения, вызовем функцию Close для закрытия конвейера и освобождения всех ресурсов.

void testApp::exit(){
  pipeline->Close();
}

После определения всех вышеперечисленных функций в файле testApp.cpp, можно собрать и запустить приложение. После запуска можно увидеть следующую картинку. Не очень эффектно, но пока нас интересуют простые возможности.

Окно приложения MyExample сразу после запуска

увеличить изображение
Рис. 13.8. Окно приложения MyExample сразу после запуска

Теперь можно командовать, результаты работы можно увидеть на рисунке 8, кружок передвинулся, в консоли напечатаны голосовые команды, которые распознало и выполнило приложение.

Окно приложения MyExample после выполнения голосовых команд

увеличить изображение
Рис. 13.9. Окно приложения MyExample после выполнения голосовых команд

Для ознакомления с основами работы в openFrameworks с нуля хорошо подходит tutorial, размещенный по ссылке: http://www.openframeworks.cc/tutorials/

Набор простых примеров, демонстрирующих возможности Intel Perceptual Computing SDK и взаимодействие с игровыми процессорами и наборами базовых средств разработки: https://github.com/IntelPerceptual/

< Лекция 7 || Самостоятельная работа 6: 1234
Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко