Vu3+QuaggaJs实现web页面识别条形码

news2024/11/15 23:40:33

一、什么是QuaggaJs

QuaggaJS是一个基于JavaScript的开源图像识别库,可用于识别条形码。

QuaggaJs的作用主要体现在以下几个方面:

  1. 实时图像处理与识别:QuaggaJs是一款基于JavaScript的开源库,它允许在Web浏览器中实现实时的图像处理与识别功能。这意味着用户无需安装任何额外的软件或插件,即可在网页上直接进行条形码扫描。
  2. 条形码扫描与解析:QuaggaJs的核心功能是条形码扫描。它支持多种条形码格式,包括但不限于EAN、UPC、Code128等。通过扫描条形码,QuaggaJs可以快速解析出条形码中的信息,从而为用户提供便捷的数据交互体验。
  3. 无缝集成到Web应用:由于QuaggaJs是基于JavaScript开发的,因此它可以轻松地集成到各种Web应用中。开发者只需简单的几行代码,就可以将条形码扫描功能添加到自己的网页中,为用户提供更加丰富的交互体验。
  4. 优化性能与用户体验:QuaggaJs在设计时充分考虑了性能优化。例如,它通过自适应调整帧率和检测区域大小来减少不必要的计算资源消耗。此外,QuaggaJs还使用了Web Workers进行复杂的图像分析任务,以保持主线程的流畅性,避免页面卡顿,从而提升用户体验。
  5. 广泛的应用场景:QuaggaJs因其强大的功能和便捷性而被广泛应用于多个领域。例如,在电商平台上,用户可以使用QuaggaJs扫描商品条形码来快速查询商品信息和下单购买;在物流管理中,它可以帮助实现货物追踪和库存管理。

二、QuaggaJs核心方法

QuaggaJs的核心方法主要包括以下几个:

  1. Quagga.init()

    • 这个方法是用来初始化QuaggaJs的。在这个方法中,你可以配置各种参数,如输入流类型(LiveStream用于实时视频流或ImageStream用于处理图片)、解码器设置、以及用于显示扫描结果的HTML元素等。
  2. Quagga.start()

    • 当库被初始化后,这个方法用于启动视频流,并开始定位和解码图像。它是开始扫描过程的关键方法。
  3. Quagga.stop()

    • 如果解码器当前正在运行,调用这个方法会停止解码器,并且不再处理任何图像。这个方法用于在不再需要扫描时停止扫描过程,释放资源。
  4. Quagga.onProcessed(callback)

    • 该方法注册一个回调函数,该函数会在每个帧被处理完成后被调用。回调函数接收一个包含操作成功或失败详细信息的对象。这个方法允许开发者对每一帧的处理结果进行响应。
  5. Quagga.onDetected(callback)

    • 这个方法注册一个回调函数,当条形码图案被成功定位和解码时,该函数会被触发。传递的回调函数会接收一个包含解码处理信息的对象,其中最重要的是可以通过该对象获取检测到的代码。这个方法使得开发者能够在条形码被成功识别时执行特定的操作。

三、在Vue3项目中使用

1、安装

npm install quagga --save

2、在模板中定义容器

1)定义视频输入容器

<div id="interactive" class="viewport"></div>

2)定义css样式

#interactive.viewport {
  width: 640px;
  height: 480px;
  canvas, video {
    float: left;
    width: 640px;
    height: 480px;
  }
  canvas.drawingBuffer, video.drawingBuffer {
    margin-left: -640px;
  }
}

3、在组件中定义调用方法

1)在组件中导入类库

import Quagga from 'quagga';

2)增加启动方法,初始化视频组件

const startScanning = () => {
    const options = {
    inputStream: {
      debug: { showCanvas: true, showPatches: true, showFoundPatches: true, drawBoundingBox: true, drawScanline: true },
      type : "LiveStream",
      target: "#interactive", // 可以指定视频输出的容器,也可以不设置会自动查找 class=viewport的元素作为容器
      constraints: {
        width: {min: 640},
        height: {min: 480},
        facingMode: "environment",
        aspectRatio: {min: 1, max: 2}
      }
    },
    locator: {
      patchSize: "medium",
      halfSample: true
    },
    numOfWorkers: 4,
    frequency: 10,
    decoder: {
      readers : ["code_128_reader","ean_reader","ean_8_reader","code_39_vin_reader","codabar_reader"]
    },
    locate: true
  }

  Quagga.init(options, function(err) {
    if (err) {
      console.error(err)
      return
    }
    
    // 注册结果收集器,在识别到结果时打印到控制台
    let resultCollector  = Quagga.ResultCollector.create({
      capture: true,
      capacity: 20,
      blacklist: [{
        code: "WIWV8ETQZ1", format: "code_93"
      }, {
        code: "EH3C-%GU23RK3", format: "code_93"
      }],
      filter: function (codeResult) {
        // only store results which match this constraint
        // e.g.: codeResult
        console.log('codeResult',codeResult)
        return true;
      }
    });
    Quagga.registerResultCollector(resultCollector);
    // -- 注册结果收集器 end

    Quagga.onDetected(function(result) {
      // 识别到结果,打印数据
      console.log('resultCollector',resultCollector.getResults())
    });

    Quagga.start();
    console.log("Initialization finished. Ready to start");

  });

  // 处理识别过程数据,在视频图像上画线/画框
  Quagga.onProcessed(function(result) {
    const drawingCtx = Quagga.canvas.ctx.overlay,
        drawingCanvas = Quagga.canvas.dom.overlay;
    if (result) {
      if (result.boxes) {
        drawingCtx.clearRect(0, 0, parseInt(drawingCanvas.getAttribute("width")), parseInt(drawingCanvas.getAttribute("height")));
        result.boxes.filter(function (box) {
          return box !== result.box;
        }).forEach(function (box) {
          Quagga.ImageDebug.drawPath(box, {x: 0, y: 1}, drawingCtx, {color: "green", lineWidth: 2});
        });
      }

      if (result.box) {
        Quagga.ImageDebug.drawPath(result.box, {x: 0, y: 1}, drawingCtx, {color: "#00F", lineWidth: 2});
      }

      if (result.codeResult && result.codeResult.code) {
        Quagga.ImageDebug.drawPath(result.line, {x: 'x', y: 'y'}, drawingCtx, {color: 'red', lineWidth: 3});
      }
    }
  });

};

3、效果示例

1)识别过程中

在这里插入图片描述
2)识别到条形码数据

在这里插入图片描述

3)结果数据

在这里插入图片描述

四、QuaggaJs支持的条码类型

  1. code_128: Code 128 是一种高密度的条形码符号体系,它可以用来表示 ASCII 00 到 ASCII 127 之间的全 ASCII 字符集,因此非常灵活。这种条形码广泛用于库存管理、物流、资产管理等多个领域

  2. EAN(European Article Number): EAN条码,也称为国际商品条码,是用于在全球范围内唯一标识商品的条码系统。它通常用于零售商品的标识和追踪。

  3. EAN-8: EAN-8是EAN条码的一种缩短版本,由8位数字组成。由于其长度较短,它通常用于小型商品或包装空间有限的商品。

  4. Code 39: Code 39是一种常用的条形码格式,可以对字母和数字进行编码。它是一种可变的长度条码,广泛应用于工业、物流和其他领域。

  5. Code 39 VIN: Code 39 VIN是专门为车辆识别号码(Vehicle Identification Number, VIN)设计的Code 39条码变种。VIN码是用于识别汽车特定信息的编码。

  6. Codabar: Codabar是一种较老的条形码类型,主要用于图书馆、医疗保健和航空票务等领域。它能够编码数字和一些特定的符号。

  7. UPC (Universal Product Code): UPC条码主要在美国和加拿大使用,用于零售商品的标识。它通常出现在商品的包装上,以便在销售点进行扫描。

  8. UPC-E: UPC-E是UPC条码的一个压缩版本,用于小型商品标签,其中只有必要的数字被编码以缩短条码长度。

  9. I2of5 (Interleaved 2 of 5): I2of5或ITF(Interleaved Two of Five)条码是一种连续的、自校验的、高密度的条码格式,主要用于物流和仓储。

  10. 2of5 (Standard 2 of 5): Standard 2 of 5条码主要用于工业应用,特别是在仓库和货运中跟踪货物。它只能编码数字,并且密度较低。

  11. Code 93: Code 93是一种高密度的条形码,可以编码全部的ASCII字符集。与Code 39相似,但密度更高,且包含更多的字符。它通常用于需要高密度和广泛字符集的应用场景。

参考

  • https://github.com/serratus/quaggaJS

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

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

相关文章

授权协议OAuth 2.0之通过OIDC实现SSO

写在前面 本文来一起看下OIDC&#xff08;openid connect&#xff09;相关内容。 1&#xff1a;什么是OIDC OIDC的全称是openid connect&#xff0c;和OAuth2.0一样&#xff0c;也是属于协议和规范的范畴。OAuth2.0是一种授权协议&#xff0c;即规定了what you can do的内容…

kafka部分partition的leader=-1修复方案整理

kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时&#xff0c;如果有partition的leader-1&#xff…

MySQL基础之多表操作(多表查询,事务,索引)

目录 一、多表关系1.1 一对多1.2 外键约束1.3 一对一1.4 多对多 二、多表查询2.1 测试数据准备2.2 笛卡尔积2.3 内连接2.4 外连接2.5 子查询1.标量子查询2.列子查询3.行子查询4.表子查询 三、事务3.1 问题场景引入3.2 概念3.3 事务操作3.4 事务的四大特性ACID 四、索引4.1 概念…

人工智能高速发展 苹果能否赶上AI热潮

近年来&#xff0c;人工智能高速发展&#xff0c;科技大佬们竞相布局人工智能赛道。苹果虽然“晚”了一步&#xff0c;但也在不断追赶这股热潮。随着AI技术不断发展&#xff0c;这项技术已经成为手机发展的新风向标&#xff0c;甚至2024年被视为AI手机元年。 众多手机厂商铆足了…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能&#xff0c;导入就需要先下载一个模板&#xff0c;然后在模板文件中填写内容&#xff0c;最后导入模板&#xff0c;导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下&#xff1a; import {MessageBox,Mes…

【Xilinx】时序约束学习 TIMING-2: 基准时钟源管脚无效

在错误的管脚 <pin_name> 上创建了基准时钟 <clock_name>。建议仅在适当的时钟根&#xff08;不含时序弧的输入端口或原语输出管脚&#xff09; 上创建基准时钟。 描述 基准时钟必须在时钟树的源时钟上定义。例如&#xff0c; 源时钟可能是设计的输入端口。如果在…

4.20.1 深度神经网络提高放射科医生在乳腺癌筛查中的表现

新颖的两阶段神经网络&#xff0c;用于将全局和局部信息与适当的训练过程结合起来。这使我们能够使用非常高容量的块级网络从像素级标签中学习&#xff0c;同时网络也可以从宏观乳房级标签中学习。模型可以生成可解释的热图&#xff0c;指示可疑发现的位置。即使在拥有大量图像…

Neo4j数据库(二)

目录 WHERE子句 简单WHERE子句语法 复杂WHERE子句语法 DELETE删除 删除节点 DELETE节点子句语法 REMOVE删除 删除节点/关系的属性 REMOVE属性子句语法 SET子句 SET子句语法 WHERE子句 像SQL一样&#xff0c;Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询…

VMware-Linux切换桥接模式上网教程(超详细)

这里写目录标题 1. 虚拟机关机2. VMware 虚拟网络配置2.1 检查是否存在 VMnet02.2 修改桥接模式2.3 修改Linux虚拟机网络适配器 3. Linux 系统配置3.1 修改系统网卡配置3.1.1 配置项含义解释3.1.2 查看物理机网络信息3.3.3 修改配置 3.2 重启服务 4. 测试网络连接情况5. 注意事…

Oracle Analytics BIEE 操作方法(四)仪表盘导出“区域”不换行也不合并居中的方法

1 分析 取消所有区域内列格式里面的换行 2 仪表盘 点击“工具” 打印和导出选项 设置固定列宽&#xff08;范围是&#xff1a;0-300&#xff09;

图片像素高效处理,轻松将图片像素进行按比例缩小50%并保存在指定位置,让您的图像更精致!

图像与我们的日常生活紧密相连&#xff0c;从社交媒体分享到专业摄影作品展示&#xff0c;高质量的图片像素处理显得至关重要。然而&#xff0c;面对海量的图片数据和高分辨率的图像处理需求&#xff0c;如何高效、简便地进行像素调整成为了众多用户关注的焦点。 第一步&#…

怎么通过PHP语言实现远程控制门锁

怎么通过PHP语言实现远程控制门锁呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制门锁&#xff0c;通过智能出门开关&#xff0c;配合普通的电插锁、电磁锁&#xff0c;来实现门禁控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应…

有时候知道自己该去做什么,但就是不去行动,怎么办?

只要有想法&#xff0c;马上就去办&#xff01;马上、及时、立刻去办&#xff01;这可能是唯一解决这个问题的方法&#xff0c;您办完事情之后的感觉会有极强的满足感&#xff0c;然后再逐步慢慢的开始您所有的计划安排&#xff0c;一定会水到渠成&#xff01;您可能不信&#…

4.3网安学习第四阶段第三周回顾(个人学习记录使用)

本周重点 ①Java入门基础 ②Java方法入门 ③Java面向对象(**重点) ④Java的Maven构建项目工具 ⑤Java其他操作补充 ⑥Java序列化和反序列化 ⑦Url 的DNS 审计链(**难点) ⑧Springboot和前端数据分离(主流使用) ⑨Common Collections(CC链漏洞) 本周主要内容 ①Java入…

GDPU unity游戏开发 碰撞体与关节

让你设计的角色跑起来吧&#xff0c;可以是动画&#xff0c;也可以是碰撞器的运动。 运动小车 找到小车素材&#xff0c;导入到层级面板。然后可以新建一个地面让小车在上面运动&#xff0c;新建一个方块当障碍物。 摆放好后&#xff0c;要加组件。记住&#xff0c;在unity中运…

算法刷题day47

目录 引言一、滑动窗口二、单调栈三、繁忙的都市 引言 今天把所有的最短路算法和最小生成树算法又给复习了一下&#xff0c;有 s p f a , 朴素版 d i j k s t r a , 堆优化版 d i j k s t r a , f l o y d , p r i m , k r u s k a l spfa,朴素版dijkstra,堆优化版dijkstra,f…

顺序栈算法库构建

学习贺利坚老师,顺序栈,构建顺序栈算法库 数据结构之自建算法库——顺序栈_设计一个主函数实现对顺序栈进行操作测试&#xff0c;测试方法&#xff0c;依次把元素-CSDN博客文章浏览阅读4.9k次&#xff0c;点赞10次&#xff0c;收藏10次。本文针对数据结构基础系列网络课程(2)&…

基于模糊控制的纯跟踪横向控制在倒车中的应用及实现

文章目录 1. 引言2. Pure Pursuit在倒车场景的推导3. 模糊控制器的设计3.1 基础知识3.2 预瞄距离系数k的模糊控制器设计 4. 算法和仿真实现 1. 引言 Pure Pursuit是一种几何跟踪控制算法&#xff0c;也被称为纯跟踪控制算法。他的思想就是基于当前车辆的后轮中心的位置&#x…

基于OpenCV+QT的人脸识别打卡项目

1.基本概念 基于OpenCV的人脸识别是一个多步骤的过程&#xff0c;通常涉及以下步骤&#xff1a; 人脸检测&#xff1a;使用Haar级联或深度学习模型来检测图像中的面部区域。OpenCV提供了预训练的Haar级联分类器&#xff0c;可以用于快速检测。 特征提取&#xff1a;一旦检测到…

如何快速学习盲打键盘的指法

学习盲打键盘的指法需要一定的时间和练习&#xff0c;但是以下几个方法可以帮助你加快学习的速度&#xff1a; 掌握正确的手位&#xff1a;了解标准的键盘布局以及手指应该放置的位置是学习盲打的第一步。在QWERTY键盘上&#xff0c;你的左手应该放在ASDF键上&#xff0c;右手应…