Upload
geekslab
View
272
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Дополненная Реальность в Облаке NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ
Хведченя Евгений Computer Vision Talks
Дополненная реальность
Дополненная реальность (англ. augmented reality, AR), — термин, относящийся ко всем проектам, направленным на дополнение реальности любыми виртуальными элементами.
Дополненная реальность сегодня
u Возможности ограничены мощностью устройства
u Высокое энергопотребление u 30FPS – это минимум u Обилие и фрагментация платформ u Разнообразие языков программирования
Дополненная реальность в облаке
u Работает везде u Потребляет меньше энергии u С++ для алгоритмов u Производительность и масштабируемость u Легкий обмен данными между устройствами
Так появился CloudCV – Cloud Computer Vision Platform
Цель – Algorithms as a Service
Так появился CloudCV – Cloud Computer Vision Platform
u Инфраструктура для алгоритмов в облаке: u Дополненная реальность u 3Д реконструкция
u Анализ видео (подсчет людей, выявление дефектов) u Распознавание объектов и лиц
u Node.js & C++
Альтернативы Node.js & C++
u SWIG & JAVA u RoR & C++ u Boost.Python
Почему C++ и Node.js
С++ Node.js
• Производительность
• Библиотеки
• Опыт разработки
• Простая обработка запросов
• Поддержка С++
• Легковесный
• Он прикольный J
Node.js и C++ такие разные
u Компиляция vs Интерпретация u Строгая типизация vs Слабая типизация u Makefile vs nothing u И это работает!
Взаимодействие Node.js и С++
u Node.js построен на базе движка V8 u V8 написан на С++ u Можно грабить корованы писать свои модули u ????? u PROFIT!
Минимальный модуль
#include <node.h> #include <v8.h> using namespace v8; Handle<Value> Method(const Arguments& args) { HandleScope scope; return scope.Close(String::New("world")); } void init(Handle<Object> exports) { exports-‐>Set(String::NewSymbol("hello"), FuncPonTemplate::New(Method)-‐>GetFuncPon()); } NODE_MODULE(hello, init)
Что тут неправильно?
#include <node.h> #include <v8.h> using namespace v8; Handle<Value> Method(const Arguments& args) { HandleScope scope; return scope.Close(String::New("world")); } void init(Handle<Object> exports) { exports-‐>Set(String::NewSymbol("hello"), FuncPonTemplate::New(Method)-‐>GetFuncPon()); } NODE_MODULE(hello, init)
Неблокирующие вычисления в С++
u Node.js работает асинхронно u Блокирующие задачи - в отдельном потоке u Код С++ также должен следовать парадигме
Как правильно
1. Вызов функции С++ из JavaScript 2. Создание рабочего потока (libuv) 3. WorkerFn – чистый С++ код (без V8) 4. Возврат результата через callback
Запуск обработчика
Handle<Value> Async(const Arguments& args) {
HandleScope scope;
Local<FuncPon> callback = Local<FuncPon>::Cast(args[0]);
Task* task = new Task();
task-‐>request.data = baton;
task-‐>callback = Persistent<FuncPon>::New(callback);
uv_queue_work(uv_default_loop(), &task-‐>request,
AsyncWork, AsyncAber);
return Undefined();
}
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<FuncPon> callback;
// Custom data
int32_t theAnswer;
};
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<FuncPon> callback;
// Custom data
int32_t theAnswer;
};
// Хранит внутреннее состояние задачи
Передача данных между потоками
struct Task {
uv_work_t request;
Persistent<FuncPon> callback;
// Custom data
int32_t theAnswer;
};
// JavaScript функция, которая будет вызвана по выполнению работы
// Хранит внутреннее состояние задачи
Асинхронный обработчик
void AsyncWork(uv_work_t* req) {
// No HandleScope!
Task* task= staPc_cast< Task *>(req-‐>data);
sleep(1000); // Do something useful task-‐>theAnswer = 42;
}
Получение результата
void AsyncAber(uv_work_t* req) {
HandleScope scope;
Task* task = staPc_cast< Task *>(req-‐>data);
task-‐>callback-‐>Call(…); // Call Task-‐>callback with results.
task-‐>callback.Dispose(); // Clean-‐up memory:
delete baton;
}
О чем следует помнить
u AsyncWork – блокирующая функция u Внутри AsyncWork запрещен доступ к V8 u Task хранит аргументы и результат u Используйте TryCatch при обращениях к V8
Использование TryCatch
// Trying to call JavaScript callback:
TryCatch try_catch;
callback-‐>Call(Context::GetCurrent()-‐>Global(),
1, /* Number of arguments of callback */
res /* Array of arguments */);
if (try_catch.HasCaught()) {
node::FatalExcepPon(try_catch);
}
Демонстрация
Дополненная реальность в браузере
u Используется только браузер и веб-камера u Вся «магия» происходит на сервере u Потоковая обработка в реальном времени
Захват кадра (JavaScript)
Отправка кадра
(node.js)
Обработка (С++)
Отправка ответа
(node.js)
Визуализация
u http://cloudcv.io/demo/ar/live u http://cloudcv.io
Посмотреть код u https://github.com/BloodAxe/CloudCV
https://github.com/BloodAxe/CloudCVBackend
Попробовать дома
А давайте поговорим?
Спасибо за внимание!
u [email protected] u @cvtalks u computer-‐vision-‐talks.com u cloudcv.io