前言本文主要讲一下如何为win10系统编译opencv.js。主要编译过程和官网一样,先安装Emscripten,然后获取opencv源码,再编译opencv源码。本文主要要解决的问题是如何在win10中完成编译。先说一下WSL的背景。公司电脑是win10。构建opencv.js需要Emscripten,Emscripten官网不建议直接在windows系统上运行。对于windows用户,推荐使用windows的Linux子系统。一开始不知道windows的linux子系统是什么,也就是WSL,所以直接在windows中运行(不想装虚拟机,不想重装系统,而且我不想带mac去公司),结果弄得乱七八糟。编译的时候各种报错2天了还没解决。一个接一个报错,一个接一个……最后还是决定看一下WSL,发现非常好用。一举编译opencv.js成功!安装WSL1,检查Linux的windows子系统路径是“控制面板”-“程序”-“启用或禁用Windows功能”2.打开MicrosoftStore,搜索“WSL”,选择一个安装,比如第一个我安装了Ubantu20.04。3、安装完成后自动打开终端。如果没有自动打开,请手动打开。和linux系统一样,设置用户名和密码进入linux系统。编译opencvjs1,确保安装了git、cmake、python,如果没有安装,运行以下命令安装:sudoaptinstallgitsudoaptinstallcmakesudoaptinstallpython安装完成后,可以通过以下命令查看安装的版本:2.安装Emscripten#创建customopencv目录mkdircustomopencv#进入customopencv目录cdcustomopencv/#拉取emscripten源码gitclonehttps://github.com/emscripten-core/emsdk.git#进入emsdk目录cdemsdk/#安装emsdk./emsdkinstalllatest#启动emsdk.com/opencv/opencv.git4,编译opencvjs并运行以下编译命令:pythonplatforms/js/build_js.pybuild_out--emscripten_dir/home/lovelyun/customopencv/emsdk/upstream/emscripten--build_wasm--clean_build_dir否ext,喝一杯水,然后就可以看到编译成功了:==========Buildfinished=====OpenCV.jslocation:/home/loveyun/customopencv/opencv/build_out/bin/opencv.js进入上面的bin文件夹,运行ls-l可以看到文件详细信息:或者使用du-sh*查看它们占用的空间:这里的opencv.js是我们最后需要的文件,now在linux子系统中,如何将其转移到windows系统中?最简单的是在文件资源管理器的地址栏中输入\\wsl$并回车以查看所有子系统。点击查看以上文件,比如我的路径是\\wsl$\Ubuntu-20.04\home\lovelyun\customopencv\opencv\build_out\bin。自定义opencv构建模块接下来我们去掉DNN模块,先用vscode打开subsystem中的opencv文件夹,打开/platforms/js/build_js.py文件,将get_cmake_cmd(self)函数中的-DBUILD_opencv_dnn=ON改为-DBUILD_opencv_dnn=关闭。重建后可以看到opencv.js从一开始的860万减少到550万。我们也可以修改opencv_js.config.py,去掉不用的函数,比如只保留core和imgproc。此时编译好的opencv.js只有3.7M。可能你觉得3.7M也很大,当然大了,但是core和imgproc中用不到的函数可以删掉。demo直接将bin目录下的opencv.js复制到工程中,比如如下引用:然后发现调用cvAPI会报错,比如cv.imread不是函数。print发现cv是一个promise,这里我们简单处理一下,将cv重新赋值给promise返回的结果,然后就可以运行了。asyncfunctiononOpenCvReady(){window.cv=awaitwindow.cv}按照官网的说法,应该可以直接使用编译好的opencv.js,也就是直接替换官网编译好的opencv.js。这里实测直接替换有问题,解决一下。我们暂时不去担心为什么会出现问题。总结一下需要linux环境的问题,用linux代替windows环境。这次编译大部分时间是为了解决windows上的报错问题。虽然在windows上安装成功,但是验证是否安装成功结果ok,但是编译的时候报各种错误,最后还是用了WSL。一开始为了节省时间,我直接使用windows上下载的emsdk文件夹cp,WSL中的python环境默认是python3。这些因素也造成了编译错误。最后想重来一遍,重新下载WSL中的emscripten。重装python,终于用python2,一次编译成功。用linux编译,感觉超级幸运,做什么都成功了。虽然觉得浪费时间去解决这种环境问题导致的报错是没有意义的,但是编译成功的时候还是很兴奋的,哈哈哈。。。
