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

news2024/11/30 10:56:55

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.coloradmin.cn/o/768658.html

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

相关文章

php裁剪图片,并给图片加上水印

本次以裁剪四个图片为例&#xff0c;图片如下 代码如下 public function cutImg($imgUrl){try{// 读取原始图片$src_img imagecreatefromjpeg($imgUrl);// 获取原始图片的宽度和高度$src_width imagesx($src_img);$src_height imagesy($src_img);// 计算每个部分的宽度和高…

【C语言督学训练营 第十九天】关于C语言语法的一些补充

文章目录 1.条件运算符与逗号运算符2.自增自减运算符3.位运算4.switch do-while补充5.二维数组&二级指针6.总结 1.条件运算符与逗号运算符 条件运算符是C语言中唯一的一种三目运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑与运算符就是双目运算符…

传统工厂不再使用蓝牙LoRa而选择使用星斗1号之原因详解

物联网技术在不断发展的同时&#xff0c;化工企业对安全生产的重视也在逐渐增强。 在传统工厂进行安全管理数字化转型前&#xff0c;蓝牙Lora是其最为常用的化工人员定位技术&#xff0c;也曾广泛应用于工厂设备监控、数据传输、人员管理等。 然而&#xff0c;定位技术升级&a…

linux driver probe deferral 机制

1. 背景介绍 在偶然的一次实验中(具体是pinctrl实验)&#xff0c;我发现有些平台的pincontroller驱动起得很晚&#xff0c;而pinctrl client驱动却起得很早&#xff0c;在设备驱动模型中probe之前又会进行管脚复用的相关设置&#xff0c;按照常理来讲&#xff0c;这就产生了某…

前端工程中的设计模式应用

本文旨在系统性介绍一下23种设计模式&#xff0c;给出通俗易懂的案例、结构图及代码示例&#xff0c;这也是我自身学习理解的过程。或许其中的几种设计模式写的并不是很清晰明了易懂&#xff0c;更详细的可根据提到的参考文献进行深入学习。 什么是设计模式 设计模式这个概念是…

Python 算法基础篇之字符串操作:索引、切片、常用方法

Python 算法基础篇之字符串操作&#xff1a;索引、切片、常用方法 引言 1. 字符串的概念和创建2. 字符串的索引3. 字符串的切片4. 字符串的常用方法 a ) 查找子字符串 b ) 替换子字符串 c ) 拆分和连接字符串 总结 引言 字符串是一种常见的数据类型&#xff0c;在 Python 中对…

又整新活,新版 IntelliJ IDEA 有点东西!

作为一个经常使用IntelliJ IDEA来写代码的老用户&#xff0c;每次对于JetBrains软件的更新都是非常关注的。 这不最近这段时间&#xff0c;JetBrains连发了多个软件的EAP版本&#xff1a; 同时JetBrains的官博中也宣布了一个重要的新特性&#xff0c;那就是&#xff1a; 在所…

X.509数字证书的基本原理

一、前言 数字证书是现代互联网中个体间相互信任的基石。 如果没有了数字证书&#xff0c;那么也就没有了各式各样的电商平台以及方便的电子支付服务。 数字证书是网络安全中的一个非常重要组成部分。如果要学好网络安全&#xff0c;那么必须充分理解它的原理。 目前我们所…

keepalived 实现双机热备

文章目录 一、说明二、概念解释三、环境准备四、操作过程五、验证 一、说明 我们经常听说 nginx keepalived 双机热备&#xff0c;其实在这里&#xff0c;双机热备只是利用 keepalived 实现两个节点的故障切换&#xff0c;当主节点挂了&#xff0c;备用节点顶上&#xff0c;保…

深入浅出关于网易邮箱开启smtp服务教程

各平台邮箱开启SMTP服务教程 一、QQ邮箱 &#xff08;服务器地址&#xff1a;smtp.qq.com&#xff09; 第一步&#xff1a;复制https://mail.qq.com/ 登录QQ邮箱后电击左上角设置&#xff0c;如图&#xff1a; 第二步&#xff1a;点击进入“帐户”页面 &#xff0c;如图&…

CodeLocator简单使用(AndroidStudio中点击布局元素确认对应view信息)快速接手陌生项目利器

对于陌生项目的一些改动或重构需求时&#xff0c;如果可以在APP点点就能确定知道当前管理哪个activity或fragment必然是省去了很多去代码里搜来搜去的时间。在社群讨论中发现这款AS插件:CodeLocator ,虽然有2年没更新了 今天也试一试看看是否有帮助。 首先下载最新版本的插件&…

通过OSG实现对模型的日照模拟

1. 加载模型 通过OpenSceneGraph加载一个倾斜摄影的场景模型数据&#xff1a; #include <iostream> #include <Windows.h>#include <osgViewer/Viewer> #include <osgDB/ReadFile>using namespace std;int main() {string osgPath "D:/Data/Da…

Appium自动化测试知识点

一、App环境搭建 1、安装jdk&#xff0c;配置jdk环境变量 2、Android SDK环境安装 3、Appium server安装 4、模拟器的安装&#xff08;夜神模拟器&#xff09; 5、安装appium-python-client Python第三方库 二、App自动化测试原理 如何通过代码操作不同操作系统&#xff08;…

基于Dubbo分布式网上售票系统

一、项目介绍 民航售票是一个高度依赖信息业的行业。但在机票销售的管理和规范这方面上存在着很多各种各样的问题。例如订票是客运行业中的一个最基本的业务,表面上看,它只是机票站业务的一个简单的部分,但是它涉及到管理与客户服务等多方面,关系到民航公司能否正常运作。…

log4j--动态打印日志文件到指定文件夹

文章目录 log4j--动态打印日志文件到指定文件夹1、添加Maven依赖2、配置文件 log4j.properties3、编写日志打印工具类 LogUtil4、工具类调用 log4j–动态打印日志文件到指定文件夹 1、添加Maven依赖 <!-- log4j日志相关坐标 --><dependency><groupId>org.s…

无虚拟 DOM 版 Vue 进行到哪一步了?

前言 就在一年前的 Vue Conf 2022&#xff0c;尤雨溪向大家分享了一个非常令人期待的新模式&#xff1a;无虚拟 DOM 模式&#xff01; 我看了回放之后非常兴奋&#xff0c;感觉这是个非常牛逼的新 feature&#xff0c;鉴于可能会有部分人还不知道或者还没听过什么是 Vue 无虚…

哈佛“聘请”AI担任导师,主讲教授:别全信它的,学生应“批判性地思考”

就在人们为AI聊天机器人的利弊争论不休时&#xff0c;哈佛宣布了一个重磅决定&#xff1a;将利用类似ChatGPT的聊天机器人来帮助授课了。 负责的还是计算机系的旗舰项目 —— 计算机科学导论&#xff0c;也就是著名的 CS50。借助机器人导师&#xff0c;哈佛的 CS50 项目将拥有…

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Py…

有哪些好用的远程传输大文件的软件

随着网络技术的日益进步和普及&#xff0c;大文件远程传输已经成为了人们生活和工作中必不可少的一部分。然而&#xff0c;在远程传输大文件的过程中&#xff0c;经常会遇到传输速度慢、容易受到干扰等问题&#xff0c;因此需要一款高效、稳定、安全的大文件远程传输软件来解决…

CCF真题练习:202209-1如此编码

题目背景 某次测验后&#xff0c;顿顿老师在黑板上留下了一串数字 23333 便飘然而去。凝望着这个神秘数字&#xff0c;小 P 同学不禁陷入了沉思…… 题目描述 已知某次测验包含 n 道单项选择题&#xff0c;其中第 i 题&#xff08;1≤i≤n&#xff09;有 个选项&#xff0c;…