前段时间一直在钻研深度学习中的卷积神经网络,其中的预处理环节可以说非常关键,主要就是对图片和视频进行处理。而图像处理就涉及到图形学和底层技术细节,这是一个比较精深和专业的领域,假设我们要从头开始做起,那简直太麻烦和低效了。为解决这个问题,openCV就此应运而生,它屏蔽了很多底层技术细节,抽象出方便的API,而我们只需要灵活组合相关的 api 就能实现强大的功能。

内容大纲

  1. 构建openCV.js
  2. opencv基础操作

构建openCV.js

openCV有各种语言的版本,比较常用的是C++Python,也有JavaScript版本,因为基于js可以更快的验证和查看效果,同时也是因为本人不太擅长C++Python,真的是有了 js 这把锤子把什么问题都看成钉子了。当然前提是因为目前V8引擎和wasm性能足够强悍,很多轻量级的需求完全可以放在前端来完成。

  1. 安装Emscripten

    openCV是基于C/C++的,我们要用js版本的openCV,需要做转换,这就需要Emscripten 这个编译器了。

    Emscripten 是一个基于LLVM的编译器,可以将C/C++语言编译为JavaScript。我们按着官网步骤一步一步下载安装就好:

    # Get the emsdk repo
    git clone https://github.com/emscripten-core/emsdk.git
    # Enter that directory
    cd emsdk # Fetch the latest version of the emsdk (not needed the first time you clone)
    git pull # Download and install the latest SDK tools.
    ./emsdk install latest # Make the "latest" SDK "active" for the current user. (writes .emscripten file)
    ./emsdk activate latest # Activate PATH and other environment variables in the current terminal
    source ./emsdk_env.sh
  2. 下载openCV源码

    安装完编译器,接着就是获取openCV的源码

    git clone https://github.com/opencv/opencv.git
  3. 打包openCV.js

    工具链和源码都准备完毕,最后一步还需要安装Python,步骤确实有点多,Python的安装就不提了,下载包安装或者homebrew安装都可以,我们直接看打包的命令吧,默认打包为asm,我们选webAssembly版本的,最后从build_wasm拷贝出opencv.js。

    cd opencv #进入opencv目录
    python ./platforms/js/build_js.py build_js # default asm
    python ./platforms/js/build_js.py build_wasm --build_wasm # build wasm

opencv基础操作

  1. 运行openCV.js,cv 默认是一个Promise,因此需要异步才能获取出openCV全局对象。

    这里只做最简单的操作,读取图片,转换灰度图,显示图片

    <canvas id="canvas" width="300" height="300"></canvas>
    <script src="./opencv.js"></script>
    <script>
    const canvas = document.createElement('canvas');
    let CV;
    async function init() {
    CV = await cv;
    console.log('cv: ', CV); const img = new Image();
    img.src = './img.png';
    img.onload = function () {
    const src = CV.imread(img);//读取图片
    const dst = new CV.Mat();
    CV.cvtColor(src, dst, CV.COLOR_RGBA2GRAY);//转换为灰度图
    CV.imshow(canvas, dst);//显示图片
    src.delete();
    dst.delete();
    };
    } init();
    </script>
  2. 矩阵操作,矩阵就是一个多维数组,而图片就是二维数组,这些基础操作我认为也是挺有用的。

    const mat = new cv.Mat();// 默认矩阵
    const mat = new cv.Mat(rows, cols, type);// 类型二维矩阵
    const mat = new cv.Mat(rows, cols, type, new cv.Scalar());// 有初始值的类型二维矩阵 const mat = cv.Mat.zeros(rows, cols, type);//全部填充为0
    const mat = cv.Mat.ones(rows, cols, type);//全部填充为1
    const mat = cv.Mat.eye(rows, cols, type); //单位矩阵 const mat = cv.matFromArray(rows, cols, type, array);//由数组构建矩阵
    const mat = cv.matFromImageData(imgData);//由图片构建矩阵
    const dst = src.clone();//克隆
    src.copyTo(dst, mask);//根据mask拷贝 cv.add(src1, src2, dst, mask, dtype);//矩阵相加
    cv.subtract(src1, src2, dst, mask, dtype);//矩阵相减
    cv.bitwise_and(roi, roi, imgBg, maskInv);//矩阵与运算
    cv.bitwise_or(roi, roi, imgBg, maskInv);//矩阵或运算
    cv.bitwise_xor(roi, roi, imgBg, maskInv);//矩阵异或运算
    cv.bitwise_not(mask, maskInv);//矩阵非运算
  3. 数据结构类型,这个类型也可以了解一下

    //点
    const point = new cv.Point(x, y);
    const point = {x: x, y: y};
    //向量
    let scalar = new cv.Scalar(R, G, B, Alpha);
    let scalar = [R, G, B, Alpha];
    //大小
    const size = new cv.Size(width, height);
    const size = {width : width, height : height}; //圆形
    let circle = new cv.Circle(center, radius);
    let circle = {center : center, radius : radius};
    //矩形
    let rect = new cv.Rect(x, y, width, height);
    let rect = {x : x, y : y, width : width, height : height}; //旋转矩形
    let rotatedRect = new cv.RotatedRect(center, size, angle);
    let rotatedRect = {center : center, size : size, angle : angle};

总结

打包构建出openCV.js,同时也学习了openCV相关的基础。后面我们就可以基于openCV做很多有趣的操作了,敬请期待。

opencv学习之基础的更多相关文章

  1. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

  2. paper 93:OpenCV学习笔记大集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  3. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  4. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  5. OpenCV学习资源库

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  6. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  7. OpenCV 学习笔记 01 安装OpenCV及相关依赖库

    本次学习是基于Window10进行的.语言为python3. 1 与opencv相关的库简介 1.1 numpy numpy 是 OpenCV 绑定 python 时所依赖的库,此意味着numpy在安 ...

  8. OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建

    # OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...

  9. opencv 学习笔记集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

随机推荐

  1. Java 中,Maven 和 ANT 有什么区别?

    虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多, 在基于"约定优于配置"的概念下,提供标准的 Java 项目结构,同时能为应用自 动管理依赖(应用 ...

  2. vue3在组件上使用v-model

    v-model用于在元素上创建双向数据绑定,负责监听用户输入事件来更新数据. v-model应用于输入框 <input v-model="searchText" /> ...

  3. python中类变量和实例变量的区别

    类变量:可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的).实例变量:实例化之后,每个实例单独拥有的变量. class student(): age = 0 name = 'stu ...

  4. visual studio 2019工具里添加开发中命令提示符的方法

    最新新装了visual studio 2019,发现默认的没有开发者命令提示符 现将添加步骤描述如下: 从VS2019菜单选择"Tools",然后选择"外部工具" ...

  5. Vue中获取元素宽高

    <div ref="init"></div> 写在 页面 方法 部分 这里的 offsetHeight 是返回元素的宽度(包括元素宽度.内边距和边框,不包括 ...

  6. css文字颜色渐变的3种实现

    在web前端开发过程中,UI设计师经常会设计一些带渐变文字的设计图,在以前我们只能用png的图片来代替文字,今天可以实现使用纯CSS实现渐变文字了.下面就介绍3中实现方式供大家参考! 基础样式: .g ...

  7. [译]HTML&CSS Lesson5: 定位

    CSS最大的用处之一就是可以将内容和元素定位到任何我们想要的位置,使我们的设计具有结构,使内容更加易懂. CSS有好几种不同的定位属性,每种都有自己的使用场景.在这节课中我们会通过不同的案例--可复用 ...

  8. Vue-cli的打包初体验

    前言:我司是一个教育公司,最近要做一个入学诊断的项目,领导让我开始搭建一套基于vue的H5的开发环境.在网上搜集很多的适配方案,最终还是选定flexible方案.选择它的原因很简单: 它的github ...

  9. JavaScript 中 append()、prepend()、after()、before() 的区别

    内容 append().prepend().after().before() 的区别 jQuery 操作 DOM 之添加节点 方法名 作用 $(selector).append() 指定元素内部添加, ...

  10. Water 2.5.8 发布,一站式服务治理平台

    Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...