【问题标题】:cv::imread and other does not working with emscripten?cv::imread 和其他不能与 emscripten 一起使用?
【发布时间】:2021-06-25 11:09:45
【问题描述】:

我有以下带有 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 ..

编辑: 除了 cv::Mat 之外的任何功能都不起作用。

【问题讨论】:

  • 这是命名空间的情况吗? cv::imread(...
  • @Jeffrey 您好,感谢您的回答。不幸的是,忘记了 cv:: 前缀只是以前实验的错字。
  • 我建议关闭它,慢慢来,并提出一个干净、准确的问题。经常通过干净地陈述它的动作会暴露错误。
  • @Tsyvarev 好吧,所有这四个函数都来自 highgui 模块,但是如果模块可用,opencv2/opencv.hpp 会自动包含其标题...
  • @DanMašek:好的,所以问题实际上是 emscripten 特有的。我重新打开了这个问题。随时提供答案。

标签: c++ opencv cmake emscripten


【解决方案1】:

这不是包含问题,因为opencv2/opencv.hpp 自动拉入所有模块顶级标题如果模块可用。显而易见的结论是这些模块在您构建的 OpenCV 中不可用,现在的问题是为什么会出现这种情况?

事实证明,OpenCV 的某些功能并不适合 Web,而 opencv.js 是在没有它的情况下构建的。

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

函数cv::imread 属于imgcodecs 模块,在这种情况下还有另一个未构建的模块。我不知道这个的确切原因(可能是由于其中一些直接访问文件系统),问题https://github.com/opencv/opencv/issues/17535 表明第三方编解码器尚未集成到 opencv.js 中并且缺少一些机制绑定生成器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多