cv::imread 和其他人不能使用 emscripten?

cv::imread and other does not working with emscripten?

我有以下带有 opencv 的 C++ 代码。它是显示图像的基本代码。 我正在尝试使用 emscripten 对其进行编译,但似乎 emscripten 无法加载 opencv 的某些功能。例如 cv::Mat 没问题。

build_js 的测试一切顺利。 你知道我做错了什么吗?

代码:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <emscripten/emscripten.h>

int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }
    cv::Mat image;
    image = cv::imread( argv[1], 1 );
    if ( !image.data )
    {
            printf("No image data \n");
            return -1;
    }
    cv::namedWindow("Display Image");
    cv::imshow("Display Image", image);
    cv::waitKey(0);
    return 0;
}

错误信息:

/home/vasek/project_test/opencv/opencvgcccmake_emscript/DisplayImage.cpp:15:13: error: use of undeclared identifier 'imread'
    image = cv::imread( argv[1], 1 );
            ^
/home/vasek/project_test/opencv/opencvgcccmake_emscript/DisplayImage.cpp:21:9: error: no member named 'namedWindow' in namespace 'cv'
    cv::namedWindow("Display Image");
    ~~~~^
/home/vasek/project_test/opencv/opencvgcccmake_emscript/DisplayImage.cpp:22:9: error: no member named 'imshow' in namespace 'cv'
    cv::imshow("Display Image", image);
    ~~~~^
/home/vasek/project_test/opencv/opencvgcccmake_emscript/DisplayImage.cpp:23:9: error: no member named 'waitKey' in namespace 'cv'
    cv::waitKey(0);
    ~~~~^
4 errors generated.

cmake 命令:

emcmake cmake -DOpenCV_DIR=/home/vasek/tools/opencv/build_js ..

编辑: None 函数工作除 cv::Mat.

这不是包含的问题,因为 opencv2/opencv.hpp 自动拉入所有模块 top-level headers if 模块可用.显而易见的结论是,这些模块在您构建的 OpenCV 中不可用,现在的问题是为什么会这样?

事实证明,某些 OpenCV 功能不适合 Web,opencv.js 构建时没有它。

函数cv::namedWindowcv::imshowcv::waitKey属于highgui模块。此模块的实现是 platform-dependent(在构建时你必须 select 将要使用的后端,可以是 WinAPI、WinRT、Gtk、Qt、cocoa 等)。此外,由于(AFAIK)浏览器中的 JavaScript 代码在沙箱中运行,因此无论如何都无法访问 API。

函数cv::imread属于imgcodecs module, yet another one that is not built in this case. I don't know the exact reason for this (perhaps due to some of it directly accessing filesystem), and the issue https://github.com/opencv/opencv/issues/17535表示第三方编解码器还没有集成到opencv.js并且绑定生成器中缺少一些机制。