编译opencv.js

2023-11-11

opencv 支持编译多个平台,其中还支持JavaScript,不过编译需要emscripten

编译环境:centos7,Python2.7

1.下载OpenCV源码
官网:https://opencv.org/releases/

例如下载4.8.0版本:
https://github.com/opencv/opencv/archive/4.8.0.zip

2.利用镜像 trzeci/emscripten 构建

#解压OpenCV
unzip opencv-4.8.0.zip
#进入opencv-4.8.0
cd opencv-4.8.0
#拉最新的trzeci/emscripten
docker pull trzeci/emscripten
#开始编译
docker run --rm --workdir /code -v “$PWD”:/code “trzeci/emscripten” python ./platforms/js/build_js.py buildjs

最后编译结果都放在buildjs,其中opencv.js 在 buildjs/bin 下面,拷贝出来就可以用了
当然,也可以直接线上已经编译好的:
https://docs.opencv.org/4.8.0/opencv.js

附上 nodejs 示例

const { Canvas, createCanvas, Image, ImageData, loadImage } = require('canvas');
const { JSDOM } = require('jsdom');
const { writeFileSync, existsSync, mkdirSync } = require('fs');
(async () => {
    await loadOpenCV();
    await detect('../out/imgs/lena.jpg')
})();



const detect = async(imgPath) => {
    console.time(imgPath)
    const image = await loadImage(imgPath);
    const src = cv.imread(image);
    let gray = new cv.Mat();
    cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);
    let faces = new cv.RectVector();
    let eyes = new cv.RectVector();
    let faceCascade = new cv.CascadeClassifier();
    let eyeCascade = new cv.CascadeClassifier();
    // Load pre-trained classifier files. Notice how we reference local files using relative paths just
    // like we normally would do
    faceCascade.load('./models/haarcascade_frontalface_alt2.xml');
    eyeCascade.load('./models/haarcascade_eye.xml');
    let mSize = new cv.Size(100, 100);
    faceCascade.detectMultiScale(gray, faces, 1.11, 6, 0, mSize);
    console.timeEnd(imgPath)
    console.log('face size: ',faces.size())
    for(let i=0;i<faces.size();i++) {
        console.log(faces.get(i))
    }
    for (let i = 0; i < faces.size(); ++i) {
        let roiGray = gray.roi(faces.get(i));
        let roiSrc = src.roi(faces.get(i));
        let point1 = new cv.Point(faces.get(i).x, faces.get(i).y);
        let point2 = new cv.Point(faces.get(i).x + faces.get(i).width, faces.get(i).y + faces.get(i).height);
        cv.rectangle(src, point1, point2, [255, 0, 0, 255]);
        eyeCascade.detectMultiScale(roiGray, eyes);
        console.log(eyes.size(),'eyes')
        for (let j = 0; j < eyes.size(); ++j) {
            let point1 = new cv.Point(eyes.get(j).x, eyes.get(j).y);
            let point2 = new cv.Point(eyes.get(j).x + eyes.get(j).width, eyes.get(j).y + eyes.get(j).height);
            cv.rectangle(roiSrc, point1, point2, [0, 0, 255, 255]);
        }
        roiGray.delete();
        roiSrc.delete();
    }
     const canvas = createCanvas(image.width, image.height);
     cv.imshow(canvas, src);
     writeFileSync(imgPath+'-output.jpg', canvas.toBuffer('image/jpeg'));
    src.delete(); gray.delete(); faceCascade.delete(); 
    eyeCascade.delete(); 
    faces.delete(); 
    eyes.delete()
}

/**
 * Loads opencv.js.
 *
 * Installs HTML Canvas emulation to support `cv.imread()` and `cv.imshow`
 *
 * Mounts given local folder `localRootDir` in emscripten filesystem folder `rootDir`. By default it will mount the local current directory in emscripten `/work` directory. This means that `/work/foo.txt` will be resolved to the local file `./foo.txt`
 * @param {string} rootDir The directory in emscripten filesystem in which the local filesystem will be mount.
 * @param {string} localRootDir The local directory to mount in emscripten filesystem.
 * @returns {Promise} resolved when the library is ready to use.
 */
function loadOpenCV (rootDir = './work', localRootDir = process.cwd()) {
    if (global.Module && global.Module.onRuntimeInitialized && global.cv && global.cv.imread) {
        return Promise.resolve()
    }
    return new Promise(resolve => {
        installDOM()
        global.Module = {
            onRuntimeInitialized () {
                // We change emscripten current work directory to 'rootDir' so relative paths are resolved
                // relative to the current local folder, as expected
                cv.FS.chdir(rootDir)
                resolve()
            },
            preRun () {
                // preRun() is another callback like onRuntimeInitialized() but is called just before the
                // library code runs. Here we mount a local folder in emscripten filesystem and we want to
                // do this before the library is executed so the filesystem is accessible from the start
                const FS = global.Module.FS
                // create rootDir if it doesn't exists
                if (!FS.analyzePath(rootDir).exists) {
                    FS.mkdir(rootDir);
                }
                // create localRootFolder if it doesn't exists
                if (!existsSync(localRootDir)) {
                    mkdirSync(localRootDir, { recursive: true });
                }
                // FS.mount() is similar to Linux/POSIX mount operation. It basically mounts an external
                // filesystem with given format, in given current filesystem directory.
                FS.mount(FS.filesystems.NODEFS, { root: localRootDir }, rootDir);
            }
        };
        global.cv = require('./opencv.js')
    });
}
function installDOM () {
    const dom = new JSDOM();
    global.document = dom.window.document;
    global.Image = Image;
    global.HTMLCanvasElement = Canvas;
    global.ImageData = ImageData;
    global.HTMLImageElement = Image;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译opencv.js 的相关文章

  • 如何使用Create React App安装React

    嗨 我对反应真的很陌生 我不知道如何实际安装它 也不知道我需要做什么才能在其中编写代码 我下载了node js并且安装了v12 18 3以及NPM 6 14 6 但是每次我尝试在许多网站上提到的create react app安装方法中输入
  • 如何在超级测试中模拟中间件?

    我想测试中间件是否在app js叫做 虽然我嘲笑该模块work js 它仍然运行原始代码 app js const work require work const express require require const app expr
  • 在 Node.js 中,setTimeout() 会阻止事件循环吗?

    如果我有一个简单的 setTimeout 函数 并将其设置为 10 秒 整个服务器在那10秒内就死机了 这是真的 这就是我听到的 答案是no 你的链接是什么Node js 如何重新创建 setTimeout 函数而不阻塞事件循环 https
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类
  • 如何使用对象数组创建猫鼬模式

    我有这个 json data id 1 name Sample test description this is a sample test category tests points 100 startDate 2018 02 15 00
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 具有 Firebase (FCM) 推送通知的 Node js

    我正在使用 Node js 开发 REST api 并且有一个休息端点来发送 firebase 推送通知 我的代码如下 const bodyParser require body parser var cors require cors v
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 如何检查请求是否通过 Express 中的 https 发送

    我想强制某些路线始终在我的 Express 应用程序中使用安全连接 我如何检查以确保它使用 https 我在 heroku 上使用搭载 ssl 进行部署 我也在 Heroku 上部署 当他们使用 nginx 进行反向代理时 他们添加了一堆标
  • Mongoose 和 Promise:如何获取查询结果数组?

    使用猫鼬从数据库和 Q 中查询结果以获取承诺 但发现很难只获取可用用户列表 目前我有一些这样的东西 var checkForPerson function person people mongoose model Person Person
  • 流星内存不足

    我正在使用流星来制作报废引擎 我必须执行一个 HTTP GET 请求 这会向我发送一个 xml 但这个 xml 大于 400 ko 我得到一个异常 内存不足 result Meteor http get http SomeUrl com 致
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • PrototypeJS 版本 1.6.0.2 覆盖 JSON.parse 和 JSON.stringify 并破坏 socket.io 功能

    基本上 socket io 使用 nativeJSON 来编码和解码数据包 而我的问题是我必须使用这个版本的原型来改变 JSON 行为 当我应该进入服务器时 如下所示 socket on event function a b c 我明白了s
  • 在 mac-os-x Yosemite 上调用“npm”时,Jenkins 构建步骤失败

    在开始之前 我想说我已经检查过这些答案 Jenkins 构建步骤在 npm install 上失败 https stackoverflow com questions 11564508 jenkins build step fails on
  • Phonegap使用命令行工具添加插件

    我是phonegap的新手 我按照phonegap官方网站中定义的步骤使用命令行工具创建项目 nodejs 我成功创建项目并添加平台 但是 当我尝试添加插件时出现以下错误 命令 cordova plugin add https git wi
  • node.js 安装向导提前结束

    我无法安装 node js 0 8 9 我是通过安装向导完成的 每次安装结束时我都会收到消息 Node js 安装向导提前结束 会是什么呢 谢谢 这可能会对将来的某人有所帮助 我从安装程序中收到类似的消息 发现我可以转到命令提示符并使用命令
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • 运行“npm install”:Node-gyp 错误 - MSBUILD.exe 失败,退出代码:1

    我在跑npm install在 Windows 上安装我的项目中的所有软件包 然后我收到有关 MSBUILD exe 的错误 gyp ERR stack Error C Program Files x86 Microsoft Visual
  • Node + Express 会话过期?

    我有一个 Express 应用程序 并且有一个登录表单 我需要持续 1 个月的会话 我是否将 maxAge 设置为一个月 以毫秒为单位 我让两台计算机保持打开状态并登录了 24 小时 当我回来时 两台计算机都已注销 我该如何解决这个问题 实
  • MongoDB 仅插入唯一电子邮件条件不起作用

    在我的猫鼬模式中 我有以下两个字段 username type String required true user name required trim true unique true email type String required

随机推荐

  • No Dialect mapping for JDBC type :0

    data service 架构 spring Roo hibernate mysql 在调用stored procedure的时候 出现 No Dialect mapping for JDBC type 0 通过反编译java sql Ty
  • kubectl exec 执行 容器命令

    格式如下 kubectl exec it podName c containerName n namespace shell comand 1 创建目录 kubectl exec it spark master xksl c spark m
  • IDEA 常用快捷键

    一 界面操作 进入设置界面 与QQ截图相冲 ctrl alt s 在窗口之间移动 alt 左右箭头 二 光标操作 按字跳转 非常好用 ctrl 左右箭头 选中当前单词 非常好用 ctrl w Idea 多光标操作 alt j alt shi
  • Python安装pip

    文章转载自 https blog csdn net LCCFlccf article details 80095348 python2 7安装目录下没有Scripts文件夹 这种问题可能是你装的python安装包年代久远了 到官网下载最新的
  • 微信小程序打开pdf文件

    前言 使用原生的微信小程序打开pdf文件 注意使用的是文件流的形式 后端接口也需要流的形式来接收 wxml页面
  • window10安装minio

    1 首先第一步我们先下载minio 可以从官网上下不同的版本 下载地址 MinIO Code and downloads to create high performance object storage 2 启动minio 切记不要双击m
  • 众享比特李刘海:国密在超级账本Fabric中的应用

    导读 4月22日 超级账本Hyperledger北京Meetup在北京大学信息学院举行 本次会议由Hyperledger中国工作组和Linux基金会主办 安妮股份 版权区块链联盟 北京大学协办 专注于技术交流 实践分享 案例解析 作为Hyp
  • 六、ResNet网络详细解析(超详细哦)

    1 RestNet网络 1 1 RestNet网络结构 ResNet在2015年被提出 在ImageNet比赛classification任务上获得第一名 因为它 简单与实用 并存 之后很多方法都建立在ResNet50或者ResNet101
  • 《86盒应用于家居中控》——实现智能家居的灵动掌控

    近年来 智能家居产品受到越来越多消费者的关注 其便捷 舒适的生活方式让人们对未来生活充满期待 作为智能家居方案领域的方案商 启明智显生产设计的86盒凭借出色的性能和良好的用户体验 成功应用于家居中控系统 让家庭变得更加智能便捷 一 智能化生
  • 【Flink】flink提交到yarn时 自定义container的提交命令

    文章目录 1 概述 2 yarn 1 概述 在 Flink FLink 是如何与Yarn交互请求Container的 文章中 我们知道了Flink是如何启动ApplicationMaster的 以及如何申请Container的 然后在里面我
  • 如何做好一个BI项目的规划和需求定义?

    正所谓磨刀不误砍柴工 一个项目的启动 先得从金字塔顶端做好规划 摸清楚需求 背景 客观条件 可投入资源等 本文 BI项目详解的第一篇 先来谈谈BI项目的规划和需求定义 全文共3000字 读完需要 8分钟 一 如何启动一个BI项目 Q 一个项
  • 设计模式------适配器模式

    设计模式 适配器模式 文章目录 设计模式 适配器模式 前言 一 两种形式 二 UML图 对象的适配器模式 类的适配器模式 三 实现要点 四 应用场景 五 优点 六 缺点 七 本质 前言 适配器模式 Adapter Pattern 将一个接口
  • C语言实现两个整数相加

    思路 定义两个变量啊 存放要输入的整数 两个整数相加要存放在一个变量sum 此时可以先定义int sum 0 也可以直接int sum a b 这个意思是a b的值存放在sum 类型是int整型 输出sum即可 我犯的错误 是最后一个pri
  • OpenWrt源码目录

    分析的OpenWrt源码目录有助于分析OpenWrt的源码 一 原始目录 1 1 scripts 构建期间用到的各类脚本文件 它存放了一些脚本 使用了bash python perl等多种脚本语言 编译过程中 用于第三方软件包管理的feed
  • 开关稳压器详解(四)-Buck降压型开关稳压器自举电路

    在Buck开关中 常使用N MOS管作为功率开关管 相比于P MOS N MOS具有导通电阻低价格便宜且流过电流较大等优势 在同步结构中对于开关管的使用一般有两种方式 上管为P MOS 下管为N MOS 无需外部自举电路 上下管均为N MO
  • 建立任务,OSTaskCreate()源码解析

    想让uC OS 管理用户的任务 用户必须要先建立任务 用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务 OSTaskCreate 或 OSTaskCreateExt OSTaskCreate 与uC OS是向下兼容的 OSTa
  • matlab通过两点画线问题&&plot,line的用法和区别。

    先马 1 LINE并不等同于PLOT 我查过HELP 很多属性不同 2 对与外框的问题 PLOT可以用法BOX控制 LINE无外框 3 图形删除的问题 PLOT可用HOLD ON或OFF控制 LINE要是用DELET 因此建议使用PLOT
  • 尾行3解3D马赛克补丁

    尾行3解3D马赛克补丁 尾行3下载尾行3补丁尾行3图片尾行3去马赛克尾行3怎么玩尾行3下载尾行3视频illusion尾行3秘籍尾行3攻略秘籍 尾行3作弊单机游戏尾行3下载尾行3外挂尾行3对话单机游戏尾行3 尾行3中文补丁 尾行3黑屏补丁尾行
  • M1 Mac 安装Python及相关库|pytorch安装M1 Mac

    今天安装pytorch的时候发现安装的anaconda是x86版本的 自己的电脑是arm64架构的 所以一直安装不上 之后找到一个方法 以后可以通过命令行直接安装在arm64上运行的库了很方便 1 安装homebrew 这是一个mac上的包
  • 编译opencv.js

    opencv 支持编译多个平台 其中还支持JavaScript 不过编译需要emscripten 编译环境 centos7 Python2 7 1 下载OpenCV源码 官网 https opencv org releases 例如下载4