zoukankan      html  css  js  c++  java
  • opencv.js编译

    一. 官方版本

    后面发现官方有给https://github.com/opencv/opencv/releases

     

     想查看支持哪些函数,即看./opencv-4.5.3/platforms/js/opencv_js.config.py

    二.自己编译

    参考https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html

    1.安装emsdk

    https://github.com/emscripten-core/emsdk

    首先下载:

    git clone https://github.com/emscripten-core/emsdk.git

    安装:

    cd emsdk
    ./emsdk install latest
    ./emsdk activate latest

    最后一个命令后返回:

    Next steps:
    - To conveniently access emsdk tools from the command line,
      consider adding the following directories to your PATH:
        /var/user_download_data/remotedata/make_opencv_js/emsdk
        /var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin
        /var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten
    - This can be done for the current shell by running:
        source "/var/user_download_data/remotedata/make_opencv_js/emsdk/emsdk_env.sh"
    - Configure emsdk in your shell startup scripts by running:
        echo 'source "/var/user_download_data/remotedata/make_opencv_js/emsdk/emsdk_env.sh"' >> $HOME/.bash_profile 

    然后运行:

    source ./emsdk_env.sh

    现在重新尝试在103机器上安装,返回:

    (base) [root@machine emsdk]# source ./emsdk_env.sh
    Adding directories to PATH:
    PATH += /var/user_download_data/remotedata/make_opencv_js/emsdk
    PATH += /var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten
    PATH += /var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin
    
    Setting environment variables:
    PATH = /var/user_download_data/remotedata/make_opencv_js/emsdk:/var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten:/var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin:/var/u01/hadoop/anaconda3/bin:/var/u01/hadoop/anaconda3/condabin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/cuda-10.1/bin
    EMSDK = /var/user_download_data/remotedata/make_opencv_js/emsdk
    EM_CONFIG = /var/user_download_data/remotedata/make_opencv_js/emsdk/.emscripten
    EMSDK_NODE = /var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin/node

    然后发现有一个变量没有命名:

    export EMSCRIPTEN=/var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten

    这样运行下面的build_js.py时就不会报:

    EMSCRIPTEN environment variable is not available. Please properly activate Emscripten SDK and consider using 'emcmake' launcher 

    2.下载opencv

    git clone https://github.com/opencv/opencv.git

    运行:

    (base) [root@machine make_opencv_js]# emcmake python ./opencv-4.5.3/platforms/js/build_js.py build_js 

    报错:

    build_js.py: error: unrecognized arguments: -DCMAKE_TOOLCHAIN_FILE=/var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin/node
    emcmake: error: 'python3 ./opencv-4.5.3/platforms/js/build_js.py build_js -DCMAKE_TOOLCHAIN_FILE=/var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin/node' failed (returned 2)
    (base) [root@machine make_opencv_js]# exit

    然后我看了下./opencv-4.5.3/platforms/js/build_js.py文件

    直接添加进这两个参数即可:

        parser.add_argument('-DCMAKE_TOOLCHAIN_FILE', default='', help='DCMAKE_TOOLCHAIN_FILE')
        parser.add_argument('-DCMAKE_CROSSCOMPILING_EMULATOR', default='', help="DCMAKE_CROSSCOMPILING_EMULATOR")

    但是又报错:

    CMake Error at CMakeLists.txt:27 (cmake_minimum_required):
      CMake 3.5.1 or higher is required.  You are running version 2.8.11
    
    
    -- Configuring incomplete, errors occurred!
    Traceback (most recent call last):
      File "./build_js.py", line 286, in <module>
        builder.config()
      File "./build_js.py", line 192, in config
        execute(cmd)
      File "./build_js.py", line 23, in execute
        raise Fail("Child returned: %s" % retcode)
    __main__.Fail: Child returned: 1
    emcmake: error: 'python ./build_js.py build_js -DCMAKE_TOOLCHAIN_FILE=/var/user_download_data/remotedata/make_opencv_js/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/var/user_download_data/remotedata/make_opencv_js/emsdk/node/14.15.5_64bit/bin/node' failed (returned 1)

    应该是cmake的版本太低了,更新新版本

    现在是:

    (base) [root@machine js]# cmake --version
    cmake version 2.8.11

    安装新的版本:

    wget https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz

    然后:

    cd cmake-3.9.2
    
    ./configure
    
    make
    
    sudo make install

    然后这样子得到的cmake文件就能够使用了,更改build_js.py的:

        def get_cmake_cmd(self):
            cmd = [
                "cmake",
                "-DPYTHON_DEFAULT_EXECUTABLE=%s" % sys.executable,

    为:

        def get_cmake_cmd(self):
            cmd = [
                "/var/user_download_data/remotedata/make_opencv_js/cmake-3.9.2/bin/cmake",
                "-DPYTHON_DEFAULT_EXECUTABLE=%s" % sys.executable,

     指定使用新版本的cmake

    然后再运行:

    emcmake python /var/user_download_data/remotedata/make_opencv_js/opencv-4.5.3/platforms/js/build_js.py build_js

    就成功生成了:

    OpenCV.js location: /var/user_download_data/remotedata/make_opencv_js/opencv-4.5.3/platforms/js/build_js/bin/opencv.js

     得到的opencv.js大小大概是8.3M

     3.局部函数编译

    如果你只想要编译opencv的一部分功能,可以通过更改/var/user_download_data/remotedata/make_opencv_js/opencv-4.5.3/platforms/js下的opencv_js.config.py,即只保留想要的函数即可

    比如我只留下:

    core = {'': ['gemm', 'norm']}
    calib3d = {'': ['solvePnP']}
    white_list = makeWhiteList([core, calib3d])

    但是使用生成的opencv.js的时候报错:

    cv.matFromArray is not a function

    使用这个发现没有cv.matFromArray, 

    使用console.log(cv),发现连这个都没有出来:

    Uncaught ReferenceError: cv is not defined

    参考:https://github.com/opencv/opencv/issues/17620

    发现是加载的问题,但是使用上面说的方法也没有成功加载,反而是使用下面的写法能成功加载:

        <script type='text/javascript'>
          async function onOpenCvReady() {
              console.log('hello');
              console.log(cv);
              if (cv instanceof Promise) {
                cv = await cv;
                console.log(cv.Mat);
                console.log(cv.matFromArray);
              }
          }
    
        </script>
    
        <script src="js/opencv.js" onload="onOpenCvReady();" ></script>

    可见,原因其实是cv还没有调用进来你就使用了,难怪没有调用到

    这样就成功调用了opencv.js,现在这个模型的大小是2.1M

  • 相关阅读:
    《软件工程》第十六周学习进度
    个人总结
    构建之法阅读笔记06
    《软件工程》第十五周学习进度
    构建之法阅读笔记05
    《软件工程》第十四周学习进度
    买书问题
    第二阶段团队项目冲刺第十天
    第二阶段团队项目冲刺第九天
    第二阶段团队项目冲刺第八天
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/15331595.html
Copyright © 2011-2022 走看看