75|0

509

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【嘉楠K230开发板】码类识别 [复制链接]

  本帖最后由 dirty 于 2025-1-22 18:46 编辑

      本篇讲述条形码与二维码识别。

条形码识别

1.了解条形码

      条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。

2.相关API函数

      CanMV K230而言,直接使用MicroPython中的find_barcodes()即可获取摄像头采集图像中条形码的相关信息。该函数支持所有一维条形码:image.EAN2、image.EAN5、image.EAN8、image.UPCE、image.ISBN10、image.UPCA、image.EAN13、image.ISBN13、image.I25、image.DATABAR (RSS-14)、image.DATABAR_EXP (RSS-Expanded)、image.CODABAR image.CODE39、image.PDF417 image.CODE93、image.CODE128 。

构造函数

...
功能:查找roi区域内的所有条形码并返回一个image.barcode的对象列表
返回:image.barcode对象列表。
...
image.find_barcodes([roi])

使用方法

barcode.rect() #返回一个矩形元组(x,y,w,h),条形码的边界。可以通过索引[0-3]来获得单个值
barcode.payload() #返回条形码字符串信息。可以通过索引[4]来获得这个值。
barcode.type() #返回条形码类型。

3.条形码识别代码与运行结果

'''
条形码识别
'''

import time, math, os, gc

from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口

#定义条形码类型
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"

sensor = Sensor() #构建摄像头对象
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=800, height=480) #设置帧大小为LCD分辨率(800x480),默认通道0
#sensor.set_framesize(Sensor.FHD) #设置帧大小FHD(1920x1080),默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0

#Display.init(Display.ST7701, to_ide=True) #同时使用3.5寸mipi屏和IDE缓冲区显示图像,800x480分辨率
Display.init(Display.VIRT, sensor.width(), sensor.height()) #只使用IDE缓冲区显示图像

MediaManager.init() #初始化media资源管理器

sensor.run() #启动sensor

clock = time.clock()

while True:
    clock.tick()
    img = sensor.snapshot() #拍摄图片
    codes = img.find_barcodes() #查找图像中所有条形码

    for code in codes:

        #对条码画矩形表示
        img.draw_rectangle(code.rect(),thickness=2)

        #打印相关信息
        print_args = (barcode_name(code), code.payload(), (180 * code.rotation()) / math.pi, code.quality())
        print("Barcode %s, Payload \"%s\", rotation %f (degrees), quality %d" % print_args)

        img.draw_string_advanced(0, 0, 30, code.payload(), color = (255, 0, 255)) #图像显示条码信息

    Display.show_image(img) #显示图片

    print(clock.fps()) #打印帧率

      使用01Studio WIKI上条形码识别效果如下,用其他紧凑密集些的条形码识别不出,文档给了下说明不能太小,实际应用这里还是有优化处理空间。

 

二维码识别

1.了解二维码

      二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

      二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

2.相关API函数

      CanMV K230使用MicroPython中的find_qrcodes()即可获取摄像头采集图像中二维码的相关信息。

构造函数

...
功能:查找roi区域内的所有二维码并返回一个image.qrcode的对象列表。
返回:image.qrcode对象列表。
...
image.find_qrcodes([roi])

使用方法

qrcode.rect()    #返回一个矩形元组(x,y,w,h),二维码的边界。可以通过索引[0-3]来获得单个值。
qrcode.payload() #返回二维码字符串信息。可以通过索引[4]来获得这个值。
qrcode.verison() #返回二维码版本号。

3.二维码识别代码与运行结果

'''
二维码识别
'''

import time, math, os, gc

from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口

sensor = Sensor() #构建摄像头对象
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=800, height=480) #设置帧大小为LCD分辨率(800x480),默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0

#Display.init(Display.ST7701, to_ide=True) #同时使用3.5寸mipi屏和IDE缓冲区显示图像,800x480分辨率
Display.init(Display.VIRT, sensor.width(), sensor.height()) #只使用IDE缓冲区显示图像

MediaManager.init() #初始化media资源管理器

sensor.run() #启动sensor

clock = time.clock()

while True:
    clock.tick()
    img = sensor.snapshot() #拍摄图片
    res = img.find_qrcodes() #寻找二维码

    if len(res) > 0: #在图片和终端显示二维码信息

        img.draw_rectangle(res[0].rect(), thickness=2)
        img.draw_string_advanced(0, 0, 30, res[0].payload(), color = (255, 0, 0))

        print(res[0].payload()) #串口终端打印

    Display.show_image(img) #显示图片

    print(clock.fps()) #打印帧率

      使用二维码生成工具,这里使用EEWorld网址生成二维码。运行,摄像头对着二维码,识别结果如下:

 

      至此,实现摄像头条形码、二维码识别功能。

 

点赞 关注(1)
个人签名

保持热爱

 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表