最近picojs上了Github Trending,这是一个小巧的人脸检测库,200行JS,2K大小,性能很好,效果也还还行。于是我想有没其他的能在浏览器跑的人脸检测库,一查才发现OpenCV已经支持编译到WebAssembly,也就可以直接在浏览器里使用了。

编译OpenCV.js

环境:ubuntu18.04

1.安装Emscripten SDK:

  git clone https://github.com/juj/emsdk.git
  cd emsdk
  #获取最新版本的emsdk(第一次克隆时不需要)
  ./emsdk update-tags  # or git pull
  #下载并安装最新的SDK工具。
  ./emsdk install latest
  #使当前用户的“最新”SDK处于“活动”状态(写入~/.emscripten文件)
  ./emsdk activate latest
  #添加环境变量 
  source ./emsdk_env.sh 
  #打印环境变量,确保已添加,最新版本打印没有内容也没关系,下面有解决办法
  echo ${EMSCRIPTEN}

如果不出意外应该就完成了安装

2.现在开始下载OpenCV并编译

  #拉取OpenCV
  git clone https://github.com/opencv/opencv.git
  # 进入CV目录
  cd opencv
  # 构建JS版本,--emscripten_dir 指定emsdk的目录,因为最新版的source ./emsdk_env.sh 都失败了
  python3 ./platforms/js/build_js.py --emscripten_dir ../emsdk/upstream/emscripten build_js
  # 构建JS版本
  python3 ./platforms/js/build_js.py --emscripten_dir ../emsdk/upstream/emscripten build_wasm --build_wasm
  # 文档
  python3 ./platforms/js/build_js.py --emscripten_dir ../emsdk/upstream/emscripten build_js --build_doc
  # 测试案列
  python3 ./platforms/js/build_js.py --emscripten_dir ../emsdk/upstream/emscripten build_js --build_test

接下来进行测试即可:

//进入build_js目录
cd build_js/bin

//安装全局http服务器
npm install http-server -g

//启动http服务器
http-server

打开浏览器输入:http://localhost:8080/tests.html,查看结果。如果不能链接就表示配置失败,成功后的截图:

3.demo(上传图片与展示)

html代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Hello OpenCV.js</title>
</head>
<body>
<h2>Hello OpenCV.js</h2>
<p id="status">OpenCV.js is loading...</p>
<div>
    <div class="inputoutput">
        <img id="imageSrc" alt="No Image" />
        <div class="caption">
            imageSrc
            <input type="file" id="fileInput" name="file" />
        </div>
    </div>
    <div class="inputoutput">
        <canvas id="canvasOutput" ></canvas>
        <div class="caption">canvasOutput</div>
    </div>
</div>
<script type="text/javascript">
    let imgElement = document.getElementById(\'imageSrc\');

    let inputElement = document.getElementById(\'fileInput\');
    inputElement.addEventListener(\'change\', (e) => {
        imgElement.src = URL.createObjectURL(e.target.files[0]);
    }, false);

    imgElement.onload = function() {
        let mat = cv.imread(imgElement);
        cv.imshow(\'canvasOutput\', mat);
        mat.delete();
    };

    function onOpenCvReady() {
        document.getElementById(\'status\').innerHTML = \'OpenCV.js is ready.\';
    }
</script>
<!--  由于 opencv.js 文件体积较大,需要异步执行加载,避免阻塞 DOM 渲染。 -->
<script async src="./build_wasm/bin/opencv.js" onload="onOpenCvReady();" type="text/javascript"></script>
</body>
</html>

demo效果:

本篇主要是记录opencv.js的编译流程,后续继续完善基于js的视频检测播放等,

版权声明:本文为KdeS原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/KdeS/p/15103911.html