编译opencv.js

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 dofaceCascade.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 expectedcv.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 startconst FS = global.Module.FS// create rootDir if it doesn't existsif (!FS.analyzePath(rootDir).exists) {FS.mkdir(rootDir);}// create localRootFolder if it doesn't existsif (!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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】元宇宙技术如何赋能传统工业企业?

随着科技的飞速发展&#xff0c;我们正处于工业革命4.0的时代&#xff0c;数字化、网络化和智能化正在深刻地改变着我们的生活和工作方式。在这个变革的大潮中&#xff0c;工业元宇宙平台应运而生&#xff0c;为企业带来了前所未有的机遇和挑战。 广州华锐互动开发的工业元宇宙…

咖啡店小程序:吸引顾客的创新营销手段

近日&#xff0c;“酱香拿铁”的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上。现在咖啡已经成为年轻一代的社交硬通货&#xff0c;咖啡店也遍地开花。而随着移动互联网的快速发展&#xff0c;咖啡店小程序已经成为了各大咖啡店主的选择&#xff0c;因为它提供了便捷的方式…

pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

本来&#xff0c;前辈们用caffe搭建了一个squeezenet的工程&#xff0c;用起来也还行&#xff0c;但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的。 以下的环境搭建不再细说&#xff0c;主要就是pyorch&#xff0c;其余的需要什么p…

Gradle下载库速度过慢解决办法

最近搞了个Gradle的项目&#xff0c;项目下载依赖库太慢了&#xff0c;于是… Gradle下载库速度过慢的问题可能由多种原因导致&#xff0c;以下是一些可能的解决方案&#xff1a; 1、使用国内镜像站点&#xff1a; 你可以改变Gradle的配置&#xff0c;使用国内的镜像站点来下…

go开发之个人微信的开发

简要描述&#xff1a; 检测好友状态 请求URL&#xff1a; http://域名地址/checkZombie 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

SpringCloudAlibaba Gateway(一)简单集成

SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加&#xff0c;一定会产生多个接口地址&#xff0c;那么客户端调用多个接口只能使用多个地址&#xff0c;维护多个地址是很不方便的&#xff0c;这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服…

go语言基础操作---七

socket简单介绍—套接字编程 什么是Socket Socket&#xff0c;英文含义是【插座、插孔】&#xff0c;一般称之为套接字&#xff0c;用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix&#xff0c;而Unix基本哲学之一就是“一切皆文件”&#xff0c;都可…

[移动通讯]【Carrier Aggregation in LTE】【 Log analysis-2】

前言&#xff1a; 接 [移动通讯]【Carrier Aggregation in LTE】【 Theory Log analysis-1】 这里面 主要讲解一下日志分析 目录&#xff1a; 总体流程 UE Capbaility Information MeasurementReport RRC Connection Reconfiguration RRCConnectionReconfiguration…

如何阅读一本书(上)

《如何阅读一本书》是一本经典的阅读指南&#xff0c;旨在帮助读者在阅读过程中实现不同层次的理解和享受阅读的最大化。全书分为四个部分&#xff0c;介绍了阅读的不同层次、检查性阅读的艺术、分析性阅读的方法和同题阅读的技巧。该书提供了实用的建议和例子&#xff0c;适用…

开源药店商城系统源码比较:哪个适合你的药品电商业务

在构建药品电商业务时&#xff0c;选择适合的药店商城系统源码是至关重要的决策之一。开源药店商城系统源码提供了快速入门的机会&#xff0c;但在选择之前&#xff0c;您需要仔细考虑您的需求、技术要求和可扩展性。本文将比较几个流行的开源药店商城系统源码&#xff0c;以帮…

LSTM基础

LSTM 视频讲得非常好 https://www.bilibili.com/video/BV1644y1W7sD/?spm_id_from333.788&vd_source3b42b36e44d271f58e90f86679d77db7门的概念 过去&#xff0c;不过去&#xff0c;过去一部分 点乘&#xff0c;0 concatenation&#xff0c;pointwise LSTM RNN 上一…

深度学习Pytorch常用api详解记录

深度学习常用的torch函数 torch.cat()torch.Tensor.repeat()&#xff1a;持续更新中... torch.cat() 对象&#xff1a;给定的序列化张量&#xff0c;即Tensor型。 功能&#xff1a;实现两个张量在指定维度上的拼接。 输出&#xff1a;拼接后的张量。 函数以及参数&#xff1a;…

C/C++之链表的建立

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.头插 1.1简介 1.2代码实现头插 …

Spring Cloud Gateway 实现原理

Spring Cloud Gateway是Spring Cloud生态系统中的一个组件&#xff0c;用于构建基于Spring Boot的微服务架构中的网关服务。它的主要目的是提供一种灵活的方式来路由、过滤和转换HTTP请求&#xff0c;从而允许您构建强大、高性能的微服务应用程序。 以下是Spring Cloud Gatewa…

系统报错“由于找不到msvcp140.dll无法继续执行代码”的处理方法

我在使用电脑时&#xff0c;突然发现了一个错误提示&#xff1a;“无法启动程序&#xff0c;因为找不到msvcp140.dll文件”。这让我非常困惑&#xff0c;因为我确定这个文件应该存在于我的电脑上。但是电脑依然报错“由于找不到msvcp140.dll无法继续执行代码”&#xff0c;这个…

Java为什么有流,流的设计原则是什么?

目录 流的设计原则 为什么是一次性的&#xff1f; 流的设计原则 流的设计原则主要包括以下几个方面&#xff1a; 简单性和一致性&#xff1a;流的接口应该尽可能简单和一致&#xff0c;以使其易于使用和理解。流的操作应该在不同类型的流之间具有一致的行为&#xff0c;使程序…

java jpa查询没有id的表的方法

一、前言 jpa中&#xff0c;如果想查询数据库&#xff0c;必须有一个Entity实体类&#xff0c;这个类的内容要与数据库表的列一一对应&#xff1b; 并且这个类中&#xff0c;必须有一个Long id字段&#xff0c;对应数据库表中的id列。 IdGeneratedValue(strategy GenerationT…

vue仿企微文档给页面加水印(水印内容可自定义,超简单)

1.在src下得到utils里新建一个文件watermark.js /** 水印添加方法 */let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) ! null) {document.body.removeChild(document.getElementById(id))}let can document.createE…

数据结构类型

1.在C和C中static关键字的用法 在C中 1.static修饰未初始化全局变量&#xff0c;默认结果为0 2.static修饰局部变量&#xff0c;延长生命周期&#xff0c;生命周期不是作用域&#xff0c;它依旧是局部变量 3.static修饰函数只能在当前文件中调用&#xff0c;不可用跨文件调用…

安装对应版本pytorch和torchvision

遇见报错&#xff1a; ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决方法&#xff1a; 1、网站找到对应torch和torchvision版本&#xff0c;cp对应python版本&#xff…