Настройка Intel Perceptual Computing SDK для использования с openFrameworks приложениями
Программирование
Разработаем программу, которая:
- отображает фигуру (например, круг) в окне openFramework;
- позволяет с помощью голосовых команд: "up", "down", "right", "left" двигать фигуру в соответствующем направлении.
Пустой проект MyExample содержит три файла: testApp.h, testApp.cpp, main.cpp
Файл main.cpp выполняет запуск приложения и его лучше не менять.
Файл 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 содержит описание основных функций, чтобы получить требуемую программу в него необходимо внести изменения:
Подключим заголовочный файл:
#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, можно собрать и запустить приложение. После запуска можно увидеть следующую картинку. Не очень эффектно, но пока нас интересуют простые возможности.
Теперь можно командовать, результаты работы можно увидеть на рисунке 8, кружок передвинулся, в консоли напечатаны голосовые команды, которые распознало и выполнило приложение.
Для ознакомления с основами работы в openFrameworks с нуля хорошо подходит tutorial, размещенный по ссылке: http://www.openframeworks.cc/tutorials/
Набор простых примеров, демонстрирующих возможности Intel Perceptual Computing SDK и взаимодействие с игровыми процессорами и наборами базовых средств разработки: https://github.com/IntelPerceptual/




