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…

解决jupyter notebook主题更改、解决工具栏隐藏的问题

安装主题包 进入对应的环境 conda activate pytorch(环境名字自己根据本地环境换) 输入命令行,下载主题包 pip install --upgrade jupyterthemes输入命令,查看主题 jt -lAvailable Themes:1 chesterish 黑色2 grade3 白灰相间3 gruvboxd 深…

CentOS设置定时任务

CentOS设置定时任务 安装定时任务:cron yum install -y cronie启动 systemctl start crond.service设置开机自启动 systemctl enable crond.service检查定时任务状态 systemctl status crond.service编辑定时任务 crontab -e定时任务配置。例如:在…

为什么免费ip代理不适用于分布式爬虫?

费IP代理通常是一些公开免费提供的IP地址和端口,供用户免费使用。然而,这些免费IP代理并不适用于分布式爬虫的使用,原因如下: 1. 不稳定性 免费IP代理通常是由个人或组织提供的,没有稳定的维护和管理机制。因此&…

docker之程序镜像的制作

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

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

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

SpringBoot全局异常处理,返回http状态码500 或 json

1. 自定义异常 public class SystemException extends RuntimeException{private static final long serialVersionUID 1L;public SystemException(String message){super(message);}public SystemException(Throwable cause){super(cause);}public SystemException(String me…

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

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

[beginCTF 2024] crypto/pwn部分

这个比赛没从开始弄,也没弄到结束,中间有点事出去4天,回来后已经结束,而且也下不了附件,很遗憾。 虽然是新生赛,但也挺难,好些题都不会,仅把一部分作了的记下来,其它等等…

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

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

Cesium 实战 - 标绘功能系列之画面、多边形(draw polygon)

Cesium 实战 - 标绘功能系列之画面、多边形(draw polygon) 核心代码完整代码在线示例本来想着标绘功能是比较基础的功能,而且网上一搜一堆,就不在教程里放了。 后来觉得,标绘也是项目实战中非常常用的,网上虽然教程挺多,但是由于质量参差不齐,版本各不一致。 本教程系…

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

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

【PTA主观题】8-1 文件操作

题目要求 编写函数int input(FILE * fp),录入学生的信息,自定义录入结束方式,但至少包括学号、姓名、班级、分数和登录密码,并按照学号排序后以二进制方式存入stus.dat,函数返回学生数量;定义函数void enc…

Integer超过-128-127比较问题

Integer超过-128-127比较问题 Testpublic void testEquals() {int int1 12;int int2 12;Integer integer1 new Integer(12);Integer integer2 new Integer(12);Integer integer3 new Integer(127);Integer a1 127; //或者写成Integer a1 Integer.valueOf(127);Integer a…

CAEX 学习记录

CAEX(Computer Aided Engineering eXchange)是一种用于描述工程数据和信息的标准化格式。它旨在促进不同工程工具和系统之间的信息交换和互操作性。CAEX使用XML格式来描述工程对象、关系和属性,以便在整个工程生命周期中进行信息交换和集成。…

基于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站的视频进行学习,我发现就是还是实操才能更快的学习 我觉得就是我前期的准备工作不足,…