OpenCV实战——OpenCV.js介绍

news2025/1/19 23:27:35

OpenCV实战——OpenCV.js介绍

    • 0. 前言
    • 1. OpenCV.js 简介
    • 2. 网页编写
    • 3. 调用 OpenCV.js 库
    • 4. 完整代码
    • 相关链接

0. 前言

本节介绍如何使用 JavaScript 通过 OpenCV 开发计算机视觉算法。在 OpenCV.js 之前,如果想要在 Web 上执行一些计算机视觉任务,必须在服务器使用 C++ 进行开发,但在 OpenCV.js 中,使用 Web 浏览器的客户端拥有了直接使用计算机视觉应用的可能性。在本节中,我们将编写一个非常简单的应用,将图像加载到 HTML img 标签中,转换图像色彩空间并在 canvas 元素中绘制。

1. OpenCV.js 简介

OpenCV.jsOpenCV 函数的端口,将 C++ 代码编译为 JavaScriptOpenCV 使用 EmscriptenC++ 函数编译为 Asm.jsWebAssembly 目标

  • Asm.js 是经过高度优化的,其接近本机代码,但速度比相同的本机可执行应用程序大约慢 2 倍(具体取决于浏览器和计算机性能)
  • WebAssembly 是一种新 Web 标准,它定义了一种用于在网页中执行代码的二进制格式。旨在补充 JavaScript,加速代码运行速度以接近本机代码执行速度。该技术是提高计算机视觉性能和将 OpenCV 移植到 JavaScript 的最佳选择

WebAssembly 针对速度进行了高度优化,并实现了速度接近本机的代码。接下来,我们构建一个简单的网页结构,通过一个简单的按钮,可以将图像加载到用作输入图像的 img 元素中。读取 img 元素内容,可以将其加载到 cv::Mat 中并应用 OpenCV 可以提供的所有计算机视觉函数。在示例代码中,我们将彩色图像转换为灰度图像。OpenCV.js 修改了 imshow 函数,允许我们在 canvas 元素而不是新窗口中显示 cv::Mat,使我们能够与网页进行交互。

2. 网页编写

在使用 OpenCV.js 之前,我们需要编写一个网页作为用户界面。使用 imgcanvasbutton 元素创建一个 HTML 页面:

<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <style>
    #container {min-height:300px;}
    #canvasOutput, #imageSrc{
        background:#ccc;
        min-width:300px;
        min-height:300px;
        display:block;
        float:left;	
        margin-left:20px;
    }
    </style>
    <title>OpenCV Computer vision on Web. Packt Publishing.</title>
</head>
<body>
    <div id="status" class="alert alert-primary" role="alert">Loading OpenCV...</div>
    <div id="container">        
        <img id="imageSrc" alt="No Image" class="small" src="img/gray.png">
            <canvas id="canvasOutput" class="small" height="300px"></canvas>
    </div>        
    <input type="file" id="fileInput" name="file" accept="image/*">

3. 调用 OpenCV.js 库

(1) 在网页中加载 OpenCV JavaScript 库:

    <!-- OPENCV -->
    <script async="" src="data/opencv.js" type="text/javascript" onload="onOpenCvReady();" onerror="onOpenCvError();"></script>

(2)script 包装器中创建应用程序,我们需要获取输入按钮和图像元素的变量:

    <script type="text/javascript">
        let imgElement = document.getElementById('imageSrc');
        let inputElement = document.getElementById('fileInput');

(3) 点击按钮时,将选中的图片加载到 img 元素中:

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

(4) 当图像加载到 img 元素中时,使用 OpenCV 函数应用所需操作。在本节中,我们将 RGB 图像转换为灰度图像,使用 imshow 函数通过将结果传递给函数 canvasIDcanvas 元素中显示结果:

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

应用 OpenCV.js 结果

4. 完整代码

完整代码 opencvjs_example.html 如下所示:

<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <style>
    #container {min-height:300px;}
    #canvasOutput, #imageSrc{
        background:#ccc;
        min-width:300px;
        min-height:300px;
        display:block;
        float:left;	
        margin-left:20px;
    }
    </style>
    <title>OpenCV Computer vision on Web. Packt Publishing.</title>
</head>
<body>
    <div id="status" class="alert alert-primary" role="alert">Loading OpenCV...</div>
    <div id="container">        
        <img id="imageSrc" alt="No Image" class="small" src="img/gray.png">
            <canvas id="canvasOutput" class="small" height="300px"></canvas>
    </div>        
    <input type="file" id="fileInput" name="file" accept="image/*">

    <!-- Optional JavaScript -->
    <script src="data/common.js"></script>
    <!-- OPENCV -->
    <script async="" src="data/opencv.js" type="text/javascript" onload="onOpenCvReady();" onerror="onOpenCvError();"></script>

    <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.cvtColor(mat, mat, cv.COLOR_BGR2GRAY);
            cv.imshow('canvasOutput', mat);
            mat.delete();
        };
        
        function onOpenCvReady() { // eslint-disable-line no-unused-vars
            document.getElementById('status').innerHTML = '<b>OpenCV.js is ready</b>.' +
                'You can upload an image.<br>' +
                'The <b>imageSrc</b> is a &lt;img&gt; element used as cv.Mat input. ' +
                'The <b>canvasOutput</b> is a &lt;canvas&gt; element used as cv.Mat output.';
        }
        
        function onOpenCvError() { // eslint-disable-line no-unused-vars
            let element = document.getElementById('status');
            element.setAttribute('class', 'err');
            element.innerHTML = 'Failed to load opencv.js';
        }
        </script>
</body>
</html>

相关链接

OpenCV实战(1)——OpenCV与图像处理基础
OpenCV实战(2)——OpenCV核心数据结构
OpenCV实战(3)——图像感兴趣区域
OpenCV实战(4)——像素操作
OpenCV实战(5)——图像运算详解
OpenCV实战(6)——OpenCV策略设计模式
OpenCV实战(7)——OpenCV色彩空间转换
OpenCV实战(8)——直方图详解
OpenCV实战(9)——基于反向投影直方图检测图像内容
OpenCV实战(10)——积分图像详解
OpenCV实战(11)——形态学变换详解
OpenCV实战(12)——图像滤波详解
OpenCV实战(13)——高通滤波器及其应用
OpenCV实战(14)——图像线条提取
OpenCV实战(15)——轮廓检测详解
OpenCV实战(16)——角点检测详解
OpenCV实战(17)——FAST特征点检测
OpenCV实战(18)——特征匹配
OpenCV实战(19)——特征描述符
OpenCV实战(20)——图像投影关系
OpenCV实战(21)——基于随机样本一致匹配图像
OpenCV实战(22)——单应性及其应用
OpenCV实战(23)——相机标定
OpenCV实战(24)——相机姿态估计
OpenCV实战(25)——3D场景重建
OpenCV实战(26)——视频序列处理
OpenCV实战(27)——追踪视频中的特征点
OpenCV实战(28)——光流估计
OpenCV实战(29)——视频对象追踪
OpenCV实战(30)——OpenCV与机器学习的碰撞
OpenCV实战(31)——基于级联Haar特征的目标检测
OpenCV实战(32)——使用SVM和定向梯度直方图执行目标检测
OpenCV实战(33)——OpenCV与深度学习的碰撞

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

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

相关文章

Linux之sched_setscheduler调度策略总结(六十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

CMake:探究编译和编译命令

CMake:探究编译和编译命令 导言项目结构相关源码结果 导言 本篇通过展示如何使用来自对应的Check<LANG>SourceCompiles.cmake标准模块的check_<lang>_source_compiles函数&#xff0c;以评估给定编译器是否可以将预定义的代码编译成可执行文件。该命令可帮助确定:…

Idea 对容器中的 Java 程序断点远程调试

第一种&#xff1a;简单粗暴型 直接在java程序中添加log.info()&#xff0c;根据需要打印信息然后打包覆盖&#xff0c;根据日志查看相关信息 第二种&#xff1a;远程调试 在IDEA右上角点击编辑配置设置相关参数在Dockerfile中加入 "-jar", "-agentlib:jdwp…

数据库连接池大小的调整原则

配置连接池是开发人员经常犯的错误。配置池时需要理解几个原则&#xff08;对于某些人来说可能违反直觉&#xff09;。 想象一下&#xff0c;您有一个网站&#xff0c;虽然可能不是 Facebook 规模的&#xff0c;但仍然经常有 10,000 个用户同时发出数据库请求&#xff0c;每秒…

4.RDD编程指南

概述 spark 提供的重要的抽象是一个 弹性分布式数据集(RDD) &#xff0c;能被并行操作的&#xff0c;在集群上分区的集合元素。RDDs 可以通过 hadoop 文件(或共它的 hadoop 支持的文件系统)&#xff0c;或者编程中的 scala 集合&#xff0c;转换它创建 RDD。用户还可以要求 sp…

【Linux】:基础IO

基础IO 一.C语音文件操作1.fopen2.fwrite3.fopen以a方式打开 二.Linux下一切皆文件三.系统调用接口四.文件描述符-fd 共识原理&#xff1a; 1.文件属性内容。 2.文件分为打开文件和未打开文件。 3.打开的文件&#xff1a;进程打开。 4.未打开的文件&#xff1a;在磁盘里存放着。…

在Node.js中,什么是中间件(middleware)?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

企业中台如何进行测试(下篇)

《企业中台如何进行测试》包含了主数据治理测试、统一认证测试、业务集成测试、门户建设测试、数据分析测试等内容。由于篇幅较长&#xff0c;将分为上、下两个篇章与大家分享&#xff0c;在上篇主要从主数据治理和统一认证两个方面对企业中台的测试内容进行介绍&#xff0c;下…

Visual Studio Code 常用快捷键大全

Visual Studio Code 常用快捷键大全 快捷键是编码过程中经常使用&#xff0c;且能够极大提升效率的部分&#xff0c;这里给大家介绍一些VS Code中非常有用的快捷键。 打开和关闭侧边栏 Mac — Command B Windows — Ctrl B Ubuntu — Ctrl B 选择单词 Mac — Command D …

洗衣洗鞋柜洗衣洗鞋小程序

支持&#xff1a;一键投递、上门取衣、自主送店、多种支付方式 TEL: 17638103951(同V) -----------------用户下单-------------- -------------------------多种支付和投递方式------------------------- -----------------商家取鞋--------------

基于冠状病毒群体免疫算法的无人机航迹规划-附代码

基于冠状病毒群体免疫算法的无人机航迹规划 文章目录 基于冠状病毒群体免疫算法的无人机航迹规划1.冠状病毒群体免疫搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用冠状病毒群体…

从关键新闻和最新技术看AI行业发展(2023.10.9-10.22第八期) |【WeThinkIn老实人报】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&…

测试总结模板

​​​​​​​ ​​​​​​​ ​​​​​​​ xx电力工作计划管理系统 系统测试总结 评审核准单 时间 作者 工作内容 版本 确认人 确认时间 2007/11/6 姜全尧 创建延边电力工作计划管理系统测试总结 1.0 …

二叉树OJ题(用前序和中序遍历构建二叉树,用中序和后续遍历构建二叉树)

文章目录 二叉树OJ题一、用前序和中序遍历构建二叉树1.思路2.代码 二、用中序和后续遍历构建二叉树1.思路2.代码 二叉树OJ题 一、用前序和中序遍历构建二叉树 1.思路 1.根据前序遍历找到根结点root 2.在中序遍历中&#xff08;inBegin0和inEndelem.length-1范围之间&#xff09…

老外总结的14条Go接口最佳实践

最近几个月&#xff0c;没事喜欢看看老外写的技术文章&#xff0c;发现他们的一些思考维度真的有些不太一样。当然&#xff0c;他们写的文章大多数没有国内的那么卷。 今天这篇文章是关于Go语言中接口设计的一些最佳实践&#xff0c;与Java等语言不尽相似&#xff0c;但又带着…

Linux常用命令——chcon命令

在线Linux命令查询工具 chcon 修改对象&#xff08;文件&#xff09;的安全上下文 补充说明 chcon命令是修改对象&#xff08;文件&#xff09;的安全上下文&#xff0c;比如&#xff1a;用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用--ref…

Ubuntu连不上WiFi 或者虽然能连上校园网,但是浏览器打不开登录页面

写在前面 自己的电脑环境&#xff1a; Ubuntu20.04 一、问题描述 自己的 Ubuntu 遇到连接不上 除校园网之外的其他WiFi, 或者 虽然能连上校园网&#xff0c;但是浏览器打不开登录页面的问题。 二、解决方法 出现这种问题的原因可能是 之前开过VPN, 导致系统的网络设置出现…

上海亚商投顾:创业板指高开低走 传媒、游戏板块逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡调整&#xff0c;创业板指尾盘跌超1%。传媒、游戏板块逆势大涨&#xff0c;百纳千成、天龙集…

浮动模块布局

基本思路 若宽度和浏览器一样宽&#xff0c;则不需要设置width 一般父盒子使用标准流&#xff0c;然后标准流内使用浮动 一般父盒子需要居中显示&#xff0c;使用 margin: 0 auto; 注意浮动盒子之间的margin值 与 父盒子width、height值之间的相等关系&#xff0c;一定要计算…

APUS成为深圳市人工智能行业协会理事单位,CEO李涛受聘专家

近日&#xff0c;APUS正式成为深圳市人工智能行业协会理事单位&#xff0c;APUS董事长兼CEO李涛同时受聘为协会专家委员会专家。 深圳市人工智能行业协会成立于2017年&#xff0c;由电子通信、大数据、计算机视觉、自然语言处理等AI相关领域企事业单位组成&#xff0c;致力于加…