学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

opencv.js是什么

OpenCV.js 是 OpenCV(Open Source Computer Vision Library)的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库,提供了一系列功能强大的算法和工具,用于处理图像、视频、特征提取、对象识别等计算机视觉任务。

OpenCV.js 是将 OpenCV 库编译为 JavaScript 的版本,使得开发者可以在浏览器环境中使用 JavaScript 来访问和调用 OpenCV 的功能。它提供了一组基本的 API,允许开发者使用 JavaScript 进行图像处理、计算机视觉和机器学习任务,而无需依赖其他语言或平台。

使用 OpenCV.js,你可以在 Web 应用程序中进行实时图像处理,从摄像头或图像源获取图像数据,并使用 OpenCV.js 提供的功能进行分析和处理。它使得图像处理和计算机视觉变得更加便捷,同时充分利用了 JavaScript 在 Web 开发中的广泛应用性和便利性。

需要注意的是,由于 JavaScript 的性能限制,OpenCV.js 的执行速度可能相对较慢,尤其是在处理大规模图像或进行复杂计算时。然而,它仍然是一个有用的工具,特别适用于简单的图像处理任务和小规模的计算机视觉应用。

总结起来,OpenCV.js 是 OpenCV 的 JavaScript 版本,提供了一组基本的 API,使得开发者可以在浏览器环境中使用 JavaScript 进行图像处理和计算机视觉任务。


OpenCV.js 4.x 版本:约为 10 MB 到 20 MB 之间。
OpenCV.js 3.x 版本:约为 7 MB 到 15 MB 之间。


基本使用手段

OpenCV.js 是 OpenCV 库的 JavaScript 版本,它提供了一组基本的 API 和函数,用于图像处理、计算机视觉和机器学习任务。下面是一些常用的基本 API 和它们的原理:

  1. cv.imread(): 这个函数用于加载图像文件,并将其转换为 OpenCV.js 中的图像对象。它基于底层的 JavaScript 图像对象或者 HTML 元素创建了一个 OpenCV.js 的图像对象。参数是在nodejs中是图像的图片地址,而在前端页面中是img标签的document元素返回值是一个图像矩阵。OpenCV.js 中的许多函数返回的结果通常是一个矩阵或多维数组,用于表示图像或其他计算机视觉数据。

OpenCV.js 中的许多函数返回的结果通常是一个矩阵或多维数组,用于表示图像或其他计算机视觉数据。在 OpenCV.js 中,图像通常以矩阵的形式表示,使用 cv.Mat 对象来表示图像数据。cv.Mat 是一个多维数组,用于存储像素值和其他图像相关的信息,如宽度、高度、通道数等。
许多 OpenCV.js 函数会接受一个输入矩阵(例如源图像),并返回一个输出矩阵(例如处理后的图像)。这些输出矩阵可以进一步传递给其他 OpenCV.js 函数进行进一步的处理。除了图像数据,OpenCV.js 中的其他计算机视觉功能(例如特征检测、对象识别等)也常常使用矩阵或多维数组来表示输入和输出数据。因此,在使用 OpenCV.js 进行图像处理和计算机视觉任务时,你通常会与矩阵(cv.Mat 对象)和多维数组打交道,并对它们进行操作和处理。
需要注意的是,OpenCV.js 的函数返回的矩阵通常是通过引用传递,而不是复制矩阵数据。这意味着对返回的矩阵进行修改可能会影响原始数据。如果需要保留原始数据,可以使用 .clone() 方法创建副本进行操作。

  1. cv.imshow(): 这个函数用于显示图像在 HTML 页面中的指定位置。它将 OpenCV.js 图像对象转换为 HTML 图像元素,并将其显示在指定的 HTML 元素中。这个指定的元素就是canvas元素,两个从参数,一个是canvas的ID,或者canvas的document元素对象,另一个是获取的Mat矩阵对象。

  2. cv.cvtColor(): 这个函数用于将图像从一个颜色空间转换到另一个颜色空间,比如从 RGB 到灰度图像,或者从 BGR 到 HSV。

  3. cv.threshold(): 这个函数用于对图像进行阈值处理,将图像分割为二值图像。它可以根据像素的灰度值将像素分为两个类别,比如前景和背景。

  4. cv.findContours(): 这个函数用于在二值图像中查找轮廓。它基于图像中的像素值找到对象的边界,并返回一个包含边界点的轮廓。

  5. cv.matchTemplate(): 这个函数用于在图像中进行模板匹配。它在目标图像中寻找与给定模板最相似的图像区域,并返回匹配的结果。

  6. cv.Canny(image, threshold1, threshold2, apertureSize, L2gradient): 这个函数用于执行 Canny 边缘检测算法。它接受以下参数:
    image: 输入图像,可以是灰度图像或彩色图像。
    threshold1 和 threshold2: 阈值参数,用于控制边缘的检测灵敏度。
    apertureSize: Sobel 算子的孔径大小,默认值为 3。
    L2gradient: 一个布尔值,用于指定是否使用 L2 范数计算梯度大小,默认为 false。

这些只是 OpenCV.js 提供的一些基本 API 的示例,还有更多的函数和方法可用于各种图像处理和计算机视觉任务。OpenCV.js 的基本原理是将 C++ 版本的 OpenCV 库编译为 JavaScript,并在浏览器环境中执行。这允许开发者在 JavaScript 中利用 OpenCV 库的功能来处理图像和执行计算机视觉任务,而无需使用其他语言或平台。
在这里插入图片描述

图像的读取与输出

在这里插入图片描述

<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Opencv JS</title><script async src="/opencv.js" onload="opencvLoad()" type="text/javascript"></script><style>.container{display: flex;}.inputoutput{width: 300px;height: 300px;border: 1px solid red;}#imageSrc{width: 300px;/* height: 400px; */}#canvasOutput{width: 300px;/* height: 400px; */}</style></head>
<body><h2>Program of OpenCV.js</h2><p id="status">OpenCV.js is loading...</p><div class="container"><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>
</body>
<script type="text/JavaScript">var imgSrcElement=document.getElementById('imageSrc');var imageInput=document.getElementById('fileInput');imageInput.addEventListener('change',(e)=>{imgSrcElement.src=URL.createObjectURL(e.target.files[0]);})// 因为是异步操作,所以需要onload等图像加载完毕后执行,也是回调imgSrcElement.onload=function(){// 读取获取矩阵(步骤1)let mat=cv.imread(imgSrcElement);// 输出获取矩阵(步骤2)cv.imshow('canvasOutput',mat);// 调用delete释放堆的内存mat.delete();}
var opencvLoad=function(){document.getElementById('status').innerHTML='opencv is ready';//回调函数,用来显示opencv.js加载完成
}
</script>
</html>

灰度化

在这里插入图片描述

<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Opencv JS</title><script async src="/opencv.js" onload="opencvLoad()" type="text/javascript"></script><style>.container{display: flex;}.inputoutput{width: 300px;height: 300px;border: 1px solid red;}#imageSrc{width: 300px;/* height: 400px; */}#canvasOutput{width: 300px;/* height: 400px; */}</style></head>
<body><h2>Program of OpenCV.js</h2><p id="status">OpenCV.js is loading...</p><div class="container"><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>
</body>
<script type="text/JavaScript">var imgSrcElement=document.getElementById('imageSrc');var imageInput=document.getElementById('fileInput');imageInput.addEventListener('change',(e)=>{imgSrcElement.src=URL.createObjectURL(e.target.files[0]);})// 因为是异步操作,所以需要onload等图像加载完毕后执行,也是回调imgSrcElement.onload=function(){// 读取获取矩阵(步骤1)let mat=cv.imread(imgSrcElement);// 新建图像矩阵(步骤2)let gray = new cv.Mat();// 将图像从一个颜色空间转换到另一个颜色空间(步骤3)cv.cvtColor(mat, gray, cv.COLOR_RGBA2GRAY);// 展现这个新的图像空间矩阵(步骤4)cv.imshow('canvasOutput',gray);// 调用delete释放堆的内存mat.delete();gray.delete();}
var opencvLoad=function(){document.getElementById('status').innerHTML='opencv is ready';//回调函数,用来显示opencv.js加载完成
}
</script>
</html>

边缘检测

在这里插入图片描述

<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Opencv JS</title><script async src="/opencv.js" onload="opencvLoad()" type="text/javascript"></script><style>.container{display: flex;}.inputoutput{width: 300px;height: 300px;border: 1px solid red;}#imageSrc{width: 300px;/* height: 400px; */}#canvasOutput{width: 300px;/* height: 400px; */}</style></head>
<body><h2>Program of OpenCV.js</h2><p id="status">OpenCV.js is loading...</p><div class="container"><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>
</body>
<script type="text/JavaScript">var imgSrcElement=document.getElementById('imageSrc');var imageInput=document.getElementById('fileInput');imageInput.addEventListener('change',(e)=>{imgSrcElement.src=URL.createObjectURL(e.target.files[0]);})// 因为是异步操作,所以需要onload等图像加载完毕后执行,也是回调imgSrcElement.onload=function(){// 读取获取矩阵(步骤1)let mat=cv.imread(imgSrcElement);// 新建图像矩阵(步骤2,灰度)let gray = new cv.Mat();// 将图像从一个颜色空间转换到另一个颜色空间(步骤3)cv.cvtColor(mat, gray, cv.COLOR_RGBA2GRAY);// 新建图像矩阵(步骤4,边缘)const edges = new cv.Mat();// 灰度转为边缘检测(步骤5)cv.Canny(gray, edges, 50, 150);// 展示边缘检测转化后的图像空间矩阵cv.imshow('canvasOutput',edges);// 调用delete释放堆的内存mat.delete();gray.delete();edges.delete();}
var opencvLoad=function(){// document.getElementById('status').innerHTML='opencv is ready';//回调函数,用来显示opencv.js加载完成document.getElementById('status').innerHTML='opencv is ready';//回调函数,用来显示opencv.js加载完成
}
</script>
</html>

特征点检测

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

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

相关文章

Storage、正则表达式

1 LocalStorage 2 SessionStorage 3 正则表达式的使用 4 正则表达式常见规则 5 正则练习-歌词解析 6 正则练习-日期格式化 Storage-Storage的基本操作 // storage基本使用// 1.token的操作let token localStorage.getItem("token")if (!token) {console.log(&q…

python开发项目基于语音识别的智能垃圾分类系统的设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

平安养老险党委书记、董事长甘为民:助推养老保障事业高质量发展

随着人口老龄化趋势加剧&#xff0c;中国养老金融市场呈现出巨大的潜力&#xff0c;逐步迈入养老新时代。 平安养老险党委书记、董事长甘为民提出&#xff0c;养老保险公司要想在市场中展现出独特的市场影响力&#xff0c;需要聚焦养老主业&#xff0c;发挥自身专业特色&#…

详解c++---特殊类设计

目录标题 设计一个不能被拷贝的类设计一个只能从堆上创建对象的类设计一个只能在栈上创建对象的类设计一个无法被继承的类什么是单例模式饿汉模式饿汉模式的缺点懒汉模式懒汉模式的优点懒汉模式的缺点特殊的懒汉 设计一个不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能&#xff0c;来源&#xff0c;选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及…

自学网络安全究竟该从何学起?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行…

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中&#xff0c;网络抖动和延迟是常见的问题&#xff0c;会导致音视频质量下降和用户体验不佳。为了解决这些问题&#xff0c;WebRTC引入了Jitter Buffer&#xff08;抖动缓冲区&#xff09;这一重要组件。Jitter Buffer是一个缓冲区&#xff0c;用于接收和处理网络…

未来驾驶新标配;CarLuncher车载开发塑造智能娱乐导航系统

车载开发在新能源汽车的快速市场占有率增长背景下具有广阔的前景。随着环境保护意识的增强和政府对清洁能源的支持&#xff0c;新能源汽车&#xff08;如电动汽车&#xff09;在全球范围内呈现出快速增长的趋势。这种趋势为车载开发提供了许多机会和潜在市场。 新能源汽车的普…

基于SpringBoot+微信小程序的医院预约叫号小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 该项目是基于uniappWe…

【C++初阶】构造函数和析构函数

文章目录 一、类的六个默认成员函数二、构造函数三、析构函数 一、类的六个默认成员函数 &#x1f4d6;默认成员函数 用户没有显式实现&#xff0c;编译器会自动生成的成员函数&#xff0c;称为默认成员函数。 构造函数&#xff1a;完成对象的初始化工作。析构函数&#xff…

【http-server】http-server的安装、前端使用http-server启动本地dist文件服务:

文章目录 一、http-server 简介:二、安装node.js:[https://nodejs.org/en](https://nodejs.org/en)三、安装http-server:[https://www.npmjs.com/package/http-server](https://www.npmjs.com/package/http-server)四、开启服务&#xff1a;五、http-server参数&#xff1a;【1…

docker FTP服务器搭建与排坑

在使用FTP时&#xff0c;如果客户端机器和FTP服务器双方之间的所有端口都是开放的&#xff0c;那连接不存在问题。如果客户端与服务器之间有防火墙&#xff0c;如果没配置好防火策略和采用合适的连接模式&#xff0c;会导致登录成功&#xff0c;但无法List列表的问题。要避免出…

rust的函数和注释

1.函数 声明函数使用 fn 关键字rust使用snake case 命名规范&#xff0c;即所有的字母都是小写的&#xff0c;单词之间使用下划线分开 fn main(){println!("hello world");another_function(); fn another_function(){println!("Another function"); }函…

Vscode配置grpc+c#+proto

首先是环境配置&#xff0c;用的dotnet5.0的sdk&#xff0c;所以Vscode的C#插件版本要选择1.24&#xff0c;然后需要配置C# Snippets、NuGget Package Manager、vscode-proto3、vscode-solution-extension&#xff08;可选&#xff09;。 以vscode-solution-extension为例新建A…

学习day47

Vue 现在开始学Vue了&#xff0c;问了同学&#xff0c;他说这个东西的内容很多。然后就跟着尚硅谷来学Vue了 用的是visual studio code&#xff0c;所以又下了一个visual。 首先时下载Vue&#xff0c;我再Vue3的官网是没有看到下载的&#xff0c;所以是跑到Vue2去下载的 将它…

G1垃圾收集分类-JVM(十四)

上篇文章说了G1不在是连续的老年代年轻代&#xff0c;而是分为不同的region&#xff0c;有eden&#xff0c;survivor&#xff0c;old&#xff0c;humongous&#xff0c;当大于百分之50region的数据则直接进入humongous&#xff0c;如果对象太大&#xff0c;会连续的存储&#x…

P8271 [USACO22OPEN] COW Operations S 奶牛操作

P8271 [USACO22OPEN] COW Operations S 奶牛操作 文章目录 P8271 [USACO22OPEN] COW Operations S 奶牛操作[USACO22OPEN] COW Operations S题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示分析code [P8271 USACO22OPEN] COW Operations S - 洛谷 | 计算机科学教…

使用Python的requests库发送HTTPS请求时的SSL证书验证问题

问题描述 使用python的requests库去发送https请求&#xff0c;有时候不设置verifyFalse不报错&#xff0c;有时候又报错。 问题原因 使用Python的requests库发送HTTPS请求时&#xff0c;设置verifyFalse参数可以跳过SSL证书验证。默认情况下&#xff0c;requests库会验证SSL…

在 Linux 系统上下载 Android SDK

使用ubuntu系统进行车机开发&#xff0c;今天开始配置环境&#xff0c;首先是下载android studio&#xff0c;然后下载android sdk&#xff0c;这里需要注意的是linux系统不能使用windows系统下的Android sdk&#xff0c;亲测会出现各种问题。 常规思路&#xff0c;下载sdk&am…

Jenkins的几种安装方式以及邮件配置

目录 Jenkins介绍 Jenkins下载、安装 一、通过war包安装 二、通过docker安装 jenkins 容器中添加 git, maven 等组件 jenkins 容器中的公钥私钥 在 jenkins 容器中调用 docker 简单的方式启动 Docker server REST API 一个 jenkins 示例 三、通过Homebrew安装 访问Je…