27
Дополненная Реальность в Облаке NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ Хведченя Евгений Computer Vision Talks

Дополненная Реальность в Облаке

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Дополненная Реальность в Облаке

Дополненная Реальность в Облаке NODE.JS И С++ ПОД ОДНОЙ КРЫШЕЙ

Хведченя Евгений Computer Vision Talks

Page 2: Дополненная Реальность в Облаке

Дополненная реальность

Дополненная реальность (англ. augmented reality, AR), — термин, относящийся ко всем проектам, направленным на дополнение реальности любыми виртуальными элементами.

Page 3: Дополненная Реальность в Облаке

Дополненная реальность сегодня

u  Возможности ограничены мощностью устройства

u  Высокое энергопотребление u  30FPS – это минимум u  Обилие и фрагментация платформ u  Разнообразие языков программирования

Page 4: Дополненная Реальность в Облаке

Дополненная реальность в облаке

u  Работает везде u  Потребляет меньше энергии u  С++ для алгоритмов u  Производительность и масштабируемость u  Легкий обмен данными между устройствами

Page 5: Дополненная Реальность в Облаке

Так появился CloudCV – Cloud Computer Vision Platform

Цель – Algorithms as a Service

Page 6: Дополненная Реальность в Облаке

Так появился CloudCV – Cloud Computer Vision Platform

u  Инфраструктура для алгоритмов в облаке: u  Дополненная реальность u  3Д реконструкция

u  Анализ видео (подсчет людей, выявление дефектов) u  Распознавание объектов и лиц

u  Node.js & C++

Page 7: Дополненная Реальность в Облаке

Альтернативы Node.js & C++

u  SWIG & JAVA u  RoR & C++ u  Boost.Python

Page 8: Дополненная Реальность в Облаке

Почему C++ и Node.js

С++ Node.js

•  Производительность

•  Библиотеки

•  Опыт разработки

•  Простая обработка запросов

•  Поддержка С++

•  Легковесный

•  Он прикольный J

Page 9: Дополненная Реальность в Облаке

Node.js и C++ такие разные

u  Компиляция vs Интерпретация u  Строгая типизация vs Слабая типизация u  Makefile vs nothing u  И это работает!

Page 10: Дополненная Реальность в Облаке

Взаимодействие Node.js и С++

u  Node.js построен на базе движка V8 u  V8 написан на С++ u  Можно грабить корованы писать свои модули u  ????? u  PROFIT!

Page 11: Дополненная Реальность в Облаке

Минимальный модуль

#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)  

Page 12: Дополненная Реальность в Облаке

Что тут неправильно?

#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)  

Page 13: Дополненная Реальность в Облаке

Неблокирующие вычисления в С++

u  Node.js работает асинхронно u  Блокирующие задачи - в отдельном потоке u  Код С++ также должен следовать парадигме

Page 14: Дополненная Реальность в Облаке

Как правильно

1.  Вызов функции С++ из JavaScript 2.  Создание рабочего потока (libuv) 3.  WorkerFn – чистый С++ код (без V8) 4.  Возврат результата через callback

Page 15: Дополненная Реальность в Облаке

Запуск обработчика

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();  

}  

Page 16: Дополненная Реальность в Облаке

Передача данных между потоками

struct  Task  {  

       uv_work_t  request;  

       Persistent<FuncPon>  callback;  

         

       //  Custom  data  

       int32_t  theAnswer;  

};  

Page 17: Дополненная Реальность в Облаке

Передача данных между потоками

struct  Task  {  

       uv_work_t  request;                                                

       Persistent<FuncPon>  callback;  

         

       //  Custom  data  

       int32_t  theAnswer;  

};  

//  Хранит  внутреннее  состояние  задачи

Page 18: Дополненная Реальность в Облаке

Передача данных между потоками

struct  Task  {  

       uv_work_t  request;  

       Persistent<FuncPon>  callback;  

         

       //  Custom  data  

       int32_t  theAnswer;  

};  

//  JavaScript  функция,  которая  будет  вызвана  по  выполнению  работы  

//  Хранит  внутреннее  состояние  задачи

Page 19: Дополненная Реальность в Облаке

Асинхронный обработчик

void  AsyncWork(uv_work_t*  req)  {  

       //  No  HandleScope!  

       Task*  task=  staPc_cast<  Task  *>(req-­‐>data);  

       sleep(1000);                                              //  Do  something  useful          task-­‐>theAnswer  =  42;  

}  

Page 20: Дополненная Реальность в Облаке

Получение результата

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;  

}  

Page 21: Дополненная Реальность в Облаке

О чем следует помнить

u  AsyncWork – блокирующая функция u  Внутри AsyncWork запрещен доступ к V8 u  Task хранит аргументы и результат u  Используйте TryCatch при обращениях к V8

Page 22: Дополненная Реальность в Облаке

Использование 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);  

}  

Page 23: Дополненная Реальность в Облаке

Демонстрация

Page 24: Дополненная Реальность в Облаке

Дополненная реальность в браузере

u  Используется только браузер и веб-камера u  Вся «магия» происходит на сервере u  Потоковая обработка в реальном времени

Захват кадра (JavaScript)

Отправка кадра

(node.js)

Обработка (С++)

Отправка ответа

(node.js)

Визуализация

Page 25: Дополненная Реальность в Облаке

u http://cloudcv.io/demo/ar/live u http://cloudcv.io

Посмотреть код u https://github.com/BloodAxe/CloudCV

https://github.com/BloodAxe/CloudCVBackend

Попробовать дома

Page 26: Дополненная Реальность в Облаке

А давайте поговорим?

Page 27: Дополненная Реальность в Облаке

Спасибо за внимание!

u  [email protected]  u @cvtalks  u  computer-­‐vision-­‐talks.com  u  cloudcv.io