我目前正在考虑尝试基于网络的增强现实,并想知道如何处理计算机视觉(CV)任务,例如
Occlusion
或 SLAM
,特别是在不使用 WebXR
的情况下(因为它不是在所有浏览器中可用)。
我知道 C++ 社区中有一些完善的 CV 库,例如
OpenCV
,并且想知道是否有人尝试将其模块编译为 WebAssembly
以在 Web 应用程序中使用(例如与相机源配对等)。 )例如使用 Emscripten
。这可能吗?如果可以的话,我需要特别注意哪些事情?有没有人做过(成功过?)
我从
OpenCV
下载了整个 Github
存储库,然后在使用 WebAssembly
设置 emcmake 后尝试使用 Emscripten
将特定模块(在本例中为 rgbd)编译为 Ninja
。从概念上讲,该过程有效,但对于库中声明的某些组件总是会失败,但对于 WebAssembly build
来说可能不是必需的,例如“ittnotify”。我一直通过标志(例如DBUILD_ITT=OFF
)在我的编译设置中关闭它们,但是对于其他组件,编译过程会在很长一段时间后一次又一次地停止,而这些组件对于WebAssembly
构建来说似乎也不是特别必要。 3-4 小时后我停了下来,因为我不确定这是要去哪里。
当然,肯定有一种比尝试针对我的特定用例从头开始天真地实现所需的 CV 算法更聪明的方法。也许我的处理方式是错误的?有更好的方法来完成这件事吗?请原谅我,我不是这些库的专家,我只有 C/C++ 和构建等基础知识。
编辑:我找到了这个答案WebAssembly包括OpenCV,其中提供了大约6年前对此类任务的引用(https://hacks.mozilla.org/2017/09/bootcamps-web assembly-and-computer-愿景/)。不幸的是,这篇文章和相关的 github 存储库都没有真正解释他们如何执行编译过程,也不清楚 6 年后会发生什么变化。
我目前正在开发 SWIG Node-API,它完全可以满足您的要求。检查这个项目:https://github.com/mmomtchev/magickwand.js和媒体文章:https://mmomtchev.medium.com/effortless-porting-a-major-c-library-to-node -js-with-swig-napi-3c1a5c4a233f
它包含将此类主要库移植到 JavaScript 的教程 - 既作为本机 Node.js 模块,又作为浏览器的 WASM 二进制文件。
您需要的不仅仅是使用 Emscripten 构建 OpenCV 及其依赖项 - 您还需要一个 JavaScript 接口。 SWIG Node-API 可以自动为您完成此操作。否则你将面临一些非常严肃的工作。 WASM 代码是汇编代码。函数需要经典的 C/C++ 调用约定,并将变量放置在堆栈上。您必须编写大量粘合代码才能使其工作。