AI嵌入式K210项目(27)-条形码识别

文章目录

  • 前言
  • 一、什么是条形码?
  • 二、实验准备
  • 三、实验过程
  • 四、API接口
  • 总结


前言

本章介绍基于机器视觉实现条形码识别,主要包含两个过程,首先检测图像中是否有条形码,如果有则框出并打印条形码信息;

一、什么是条形码?

条形码是一种图形标识符,由一系列宽度不等的黑条和空白组成,按照一定的编码规则排列。它可以用来表达一组信息,并且通常被印刷在商品、图书、邮件等各种物品上。通过使用条形码识别设备,可以快速、准确地读取条形码中的信息,并将其传输到计算机系统进行处理。

条形码的发明可以追溯到20世纪20年代,最初是为了对邮政单据实现自动分检而发明的。随着计算机技术的不断发展,条形码的应用范围越来越广泛,逐渐扩展到商品流通、图书管理、邮政管理、银行系统等领域。

条形码的编码规则是根据一定的规律和标准制定的,包括条形码的长度、宽度、编码方式等。常见的条形码类型是一维条形码,它只包含数字和字符的信息,而二维条形码则可以包含更多的信息,如文字、图像等。

使用条形码具有很多优势,如识别速度快、准确性高、成本低廉等。同时,条形码还可以被重复使用,方便对物品进行跟踪和管理。随着物联网技术的不断发展,条形码的应用前景更加广阔,它可以被用来实现物品的自动化识别和数据采集,提高生产效率和管理水平。

二、实验准备

首先我们先生成一个带有信息的条形码图片,用于验证我们的功能;可以到https://www.idcd.com/tool/barcode/encode这个网站上进行免费生成;这里要注意的是输入的数字串不要太长
在这里插入图片描述

三、实验过程

模块的出厂固件已经集成AI视觉算法模块,如果下载过其他固件,请烧录回出厂固件再进行实验。

导入相关库,并初始化摄像头和LCD显示屏,这里把摄像头的颜色设置成灰度

import sensor, image, time, math, lcd
​
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565) #GRAYSCALE
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 100)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
clock = time.clock()

根据不同的编码方式,将条形码的类型名称转化为字符串;

def barcode_name(code):if(code.type() == image.EAN2):return "EAN2"if(code.type() == image.EAN5):return "EAN5"if(code.type() == image.EAN8):return "EAN8"if(code.type() == image.UPCE):return "UPCE"if(code.type() == image.ISBN10):return "ISBN10"if(code.type() == image.UPCA):return "UPCA"if(code.type() == image.EAN13):return "EAN13"if(code.type() == image.ISBN13):return "ISBN13"if(code.type() == image.I25):return "I25"if(code.type() == image.DATABAR):return "DATABAR"if(code.type() == image.DATABAR_EXP):return "DATABAR_EXP"if(code.type() == image.CODABAR):return "CODABAR"if(code.type() == image.CODE39):return "CODE39"if(code.type() == image.PDF417):return "PDF417"if(code.type() == image.CODE93):return "CODE93"if(code.type() == image.CODE128):return "CODE128"

新建while循环 ,将摄像头采集的画面进行条形码分析,如果图像中有条形码,则将条形码的信息打印出来,并用绿色框出条形码的位置。

while(True):clock.tick()img = sensor.snapshot()fps = clock.fps()codes = img.find_barcodes()for code in codes:img.draw_rectangle(code.rect())print_args = (barcode_name(code), code.payload(), (180 * code.rotation()) / math.pi, code.quality(), fps)print("Barcode %s, Payload \"%s\", rotation %f (degrees), quality %d, FPS %f" % print_args)img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0)lcd.display(img)

将K210开发板通过TYPE-C数据线连接到电脑上,CanMV IDE点击连接按钮,连接完成后点击运行按钮,运行例程代码。也可以将代码作为main.py下载到K210开发板上运行。

等待系统初始化完成后,LCD显示摄像头画面,用摄像头拍摄条形码,则会将条形码框出来,并且在IDE底部的串行终端。
在这里插入图片描述
串口输出信息如下:
在这里插入图片描述

四、API接口

函数说明
barcode.corners()返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的
barcode.rect()返回一个矩形元组(x, y, w, h),用于如数据矩阵的边界框的 image.draw_rectangle 等其他的 image 方法。
barcode.x()返回条形码的边界框的x坐标(int),您也可以通过索引 [0] 取得这个值。
barcode.y()返回条形码的边界框的y坐标(int),您也可以通过索引 [1] 取得这个值。
barcode.w()返回条形码的边界框的w宽度(int),您也可以通过索引 [2] 取得这个值。
barcode.h()返回条形码的边界框的h高度(int),您也可以通过索引 [3] 取得这个值。
barcode.payload()返返回条形码的有效载荷的字符串。例:数量,您也可以通过索引 [4] 取得这个值。
barcode.type()返回条形码的列举类型 (int),您也可以通过索引 [5] 取得这个值,image.EAN2 image.EAN5 image.EAN8 image.UPCE image.ISBN10 image.UPCA image.EAN13 image.ISBN13 image.I25 image.DATABAR image.DATABAR_EXP image.CODABAR image.CODE39 image.PDF417 - 未来启用 (e.g. 现在还不能正常使用). image.CODE93 image.CODE128
barcode.quality()返回条形码在图像中被检测到的次数(int),扫描条形码时,每一条新的扫描线都能解码相同的条形码。每次进行这一过程,条形码的值都会随之增加,您也可以通过索引 [7] 取得这个值。

更多API接口可以参考https://developer.canaan-creative.com/canmv/main/canmv/library/index.html
在这里插入图片描述


总结

本章介绍了K210进行多种类型的条形码识别;

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

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

相关文章

ShardingSphere实现openGauss分布式架构

本文档采用openGauss结合ShardingSphere中间件的架构,实现openGauss数据库分布式OLAP场景的环境部署。 术语说明: 开源数据库引擎:openGauss shardingsphere Proxy:定位为透明化的数据库代理端,提供封装了数据库二进…

示波器的电压怎么和测量的电压不一样,空比增加以后 示波器显示的电压反而降低了?

这两天在调电机,发现我用pwm信号,发送给示波器,但是示波器测量的电压和万用表测量的完全不一样,而有奇怪的现象,空比增加以后 示波器显示的电压反而降低了。 最后发现是通道没有设置,要设置成直流模式 点ch…

docker之程序镜像的制作

目录 一、每种资源的预安装(基础) 安装 nginx安装 redis 二、dockerfile文件制作(基础) 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像(方式一) 生成centos容器并…

补题:leetcode第382场周赛 3022. 给定操作次数内使剩余元素的或值最小

3022. 给定操作次数内使剩余元素的或值最小 - 力扣(LeetCode) 拆位 n个数进行或运算的结果最小,每次操作可以对相邻的两个数进行与运算,至多进行k次操作 n个数进行或运算,可以对每个数进行拆解,拆解成最小…

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目PostgresSQL数据库版)

1首先介绍下若依项目: 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案,包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构&#xf…

使用代理IP有风险吗?如何安全使用代理IP?

代理IP用途无处不在。它们允许您隐藏真实IP地址,从而实现匿名性和隐私保护。这对于保护个人信息、绕过地理受限的内容或访问特定网站都至关重要。 然而,正如任何技术工具一样,代理IP地址也伴随着潜在的风险和威胁。不法分子可能会滥用代理IP…

ue5 蓝图内修改组件附加的插槽

Target是目标,Parent是要加到哪个骨骼上,socketName是骨骼对应的插槽

基于Springboot的考编论坛网站的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的考编论坛网站的设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

【华为云】云上两地三中心实践实操

写在前面 应用上云之后,如何进行数据可靠性以及业务连续性的保障是非常关键的,通过华为云云上两地三中心方案了解相关方案认证地址:https://connect.huaweicloud.com/courses/learn/course-v1:HuaweiXCBUCNXI057Self-paced/about当前内容为华…

vulnhub中Beelzebub靶机

渗透思路 一.信息收集1.网段探测2.端口探测3.常见漏洞扫描4.目录扫描5.web页面分析 二.渗透继续目录扫描ssh连接提权提权,flag 一.信息收集 1.网段探测 ┌──(root㉿kali)-[~] └─# nmap -Pn 192.168.0.0/24 --min-rate 10000 Starting …

awd总结

总结: 由于是第一次参加AWD比赛,各方面经验都不足,在参赛的前几天也是疯狂搜集各种脚本、框架、工具等,同时也参考b站的视频进行学习,我发现就是还是实操才能更快的学习 我觉得就是我前期的准备工作不足,…

【sentinel流量卫兵配置持久化到Nacos】

sentinel流量卫兵配置持久化到Nacos 概述: 一、添加配置二、配置说明限流规则配置:降级规则配置:热点规则配置:授权规则配置:系统规则配置: 三、服务整合 概述: 控制台配置的参数,默…

STM32WLE5JC

Sub-GHz 无线电介绍 sub-GHz无线电是一种超低功耗sub-GHz无线电,工作在150-960MHz ISM频段。 在发送和接收中采用LoRa和(G)FSK调制,仅在发送中采用BPSK/(G)MSK调制,可以在距离、数据速率和功耗之间实现最佳权衡。 这…

Maven的安装以及配置(超级详细版)

前言 至于什么是Maven,大家可以理解为之前的Vue一样,也是通过操控对象映射来使用的 他内部还有很多的插件用于实现对应的功能,例如打包插件,或是测试 maven下载 Maven – Download Apache Maven apache下的开源项目&#xff0c…

Java Character源码剖析

Character类除了封装了一个char外,还封装了Unicode字符级别的各种操作,是Java文本处理的基础。下面结合源码分析Character的贡献。 Unicode 也许你没听过Unicode,但应该见过UTF-8。UTF-8(8-bit Unicode Transformation Format&a…

Linux的进程信号

注意:首先需要提醒一个事情,本节提及的进程信号和下节的信号量没有任何关系,请您区分对待。 1.信号概念 1.1.生活中的信号 我们在生活中通过体验现实,记忆了一些信号和对应的处理动作,这意味着信号有以下相关的特点&…

ROS笔记二:launch

目录 launch node标签 参数 参数服务器 节点分组 launch launch文件是一种可以可实现多节点启动和参数配置的xml文件,launch文件用于启动和配置ROS节点、参数和其他相关组件。launch文件通常使用XML格式编写,其主要目的是方便地启动ROS节点和设置节点之间的连…

Kuberntes权威指南

一、目录 二、Kubernetes入门 三、Kubernetes核心原理 四、Kubernetes开发指南 五、Kubernetes运维指南 六、Kubernetes高级案例进阶 七、Kubernetes源码导读

20240206三次握手四次挥手

TCP和UDP异同点 相同点:同属于传输层的协议 不同点: TCP ----> 稳定 1> 提供面向连接的,可靠的数据传输服务 2> 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复 1、TCP会给每个数据包编上编号&#xff…

分享71个节日PPT,总有一款适合您

分享71个节日PPT,总有一款适合您 71个节日PPT下载链接:https://pan.baidu.com/s/1v4_fHplsf_hOJQbNPVUudg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…