使用Emscripten将C++ OpenCV代码编译为Javascript

3

我可以帮助你翻译。需要翻译的内容与IT技术有关,涉及将C++代码包含OpenCV头文件转换为使用Emscripten转换为WebAssembly。当我尝试使用以下命令进行编译时:

em++ main.cpp -s WASM=1 -o seamCarve.html

我收到了以下错误信息:

#include <opencv2/imgproc/imgproc.hpp>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
shared:ERROR: compiler frontend failed to generate LLVM bitcode, halting

这是我第一次使用WebAssembler,我不太确定该怎么做。根据以下链接中的步骤,我已经编译了OpenCV库以创建一个opencv.js文件:https://docs.opencv.org/3.4/d4/da1/tutorial_js_setup.html
我不确定是否需要在编译时包含这个js文件,或者是否需要在编译时包含每个头文件。

那么你的意思是你已经拥有了opencv.js以及它的.wasm文件? - Bumsik Kim
@BumsikKim 我编译了 opencv.js 文件,但并不确定我是否需要它。如果我错了,请纠正我,但似乎它是用于在 JavaScript 中调用 OpenCV 函数,而不是将包含 OpenCV 函数的 C++ 代码编译为 JavaScript。我没有任何 .wasm 文件。 - Kar Singh
2个回答

3

通常在使用C/C++代码时,如果要使用库(library),则需要在生成可执行二进制文件时将其链接。

因此,在使用emscripten时,您需要先编译库文件,然后可以在链接时使用例如静态库文件mylib.a,这样您的emcc命令将类似于以下内容:

em++ -s WASM=1 main.cpp libopencv.a -o seamCarve.html


1
谢谢!您能否描述一下如何编译像opencv这样的库,如何获取libopencv.a? - Paul Moers

2

OpenCV.js旨在像任何JavaScript代码一样包含在您的HTML文档中。然后,您可以从JavaScript代码中访问几乎所有OpenCV函数。

现在,您可以为WebAssembly构建OpenCV。好处是,您不需要更改JavaScript代码,因为WASM模块已包含在OpenCV.js文件中,但是您需要为WASM(WebAssembly)编译。

请查看此链接 https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html


谢谢您的解释。在我获得OpenCV的wasm格式之后,我该如何将包含OpenCV的自己的C++代码编译成wasm文件?您能否为我指导必须使用的命令? - HAMED
获取OpenCV wasm版本后,我通常通过JavaScript访问它进行操作。你可以在JavaScript中实现C++版本所能做的(虽然并不是全部)。需要注意的是,尽管使用了JavaScript,但实际上是wasm在进行图像处理。 - J A
我已经尝试过了,但是C++的WASM版本代码比JavaScript的WASM版本快大约两倍。这就是使用C++而不是JS的主要原因。 - HAMED

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接