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


前言

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

一、什么是条形码?

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

条形码的发明可以追溯到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进行多种类型的条形码识别;

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂飙车的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值