文章目录
- 前言
- 一、什么是条形码?
- 二、实验准备
- 三、实验过程
- 四、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进行多种类型的条形码识别;