条形码识别

条形码识别例程实验效果简介代码讲解完整代码代码结构find_barcodes([roi])BarCode构造函数cornersrectxywhpayloadtyperotationquality

 

例程实验效果简介

这一节我们来用K230识别一下条形码,首先我们用条形码生成器来生成一个条形码图片

(可以使用我们附件里提供的条形码生成工具,也可以在网上搜素在线生成条形码)

在输入框里输入英文或数字内容,点击生成条形码按钮即可生成

image-20250122154902708

我们把生成的条形码放大

image-20250122155219591

 

本节K230部分的例程代码位于:【源码汇总 / 06.Codes / 01.find_barcodes.py】

我们用CanMV IDE打开例程代码,将K230用USB连接到电脑上

点击CanMV IDE左下角的运行按钮运行例程

用摄像头对准刚刚生成的二维码,可以看到成功识别到了条形码的内容

image-20250122155637490

同时CanMV IDE的左下角也会输出我们的识别结果

image-20250122155738720

 

代码讲解

本节我们要用的的外设主要是摄像头模块

条形码的检测和识别 由 K230中的 find_barcodes() 方法实现,该方法属于image模块

完整代码

 

代码结构

本节例程主要功能和结构如下:

  1. 模块导入部分:

    • 导入了时间处理、垃圾回收、传感器、显示器、媒体管理和图像处理等必要模块
  2. 条形码类型定义:

    • 创建了一个字典BARCODE_TYPES,映射了各种条形码类型(如EAN13、ISBN13、CODE128等)
  3. 主要函数:

    • barcode_name(): 获取条形码类型的名称
    • init_camera(): 初始化摄像头,设置分辨率(800x480)和图像格式
    • main(): 程序的主要运行逻辑
  4. 主程序流程:

    • 初始化摄像头、显示器和媒体管理器

    • 进入无限循环,持续执行:

      • 捕获图像

      • 在图像中查找条形码

      • 对每个找到的条形码:

        • 用矩形框标记位置
        • 获取并显示条形码类型和内容
      • 显示处理后的图像

      • 进行垃圾回收

 

find_barcodes([roi])

该函数查找指定 ROI 内的所有一维条形码,并返回一个包含 image.barcode 对象的列表。有关更多信息,请参考 image.barcode 对象的相关文档。

为了获得最佳效果,建议使用长为 640 像素、宽为 40/80/160 像素的窗口。窗口的垂直程度越低,运行速度越快。由于条形码是线性一维图像,因此在一个方向上需具有较高分辨率,而在另一个方向上可具有较低分辨率。请注意,该函数会进行水平和垂直扫描,因此您可以使用宽为 40/80/160 像素、长为 480 像素的窗口。请务必调整镜头,使条形码位于焦距最清晰的区域。模糊的条形码无法解码。

该函数支持以下所有一维条形码:

注意: 不支持压缩图像和 Bayer 图像。

 

BarCode

条形码对象由 image.find_barcodes 函数返回。

构造函数

请调用 image.find_barcodes() 函数来创建此对象。

corners

该方法返回一个包含条形码四个角的元组列表,每个元组格式为 (x, y)。四个角通常按从左上角开始,沿顺时针方向排列。

rect

该方法返回一个矩形元组 (x, y, w, h),可用于其他图像处理方法,如 image.draw_rectangle 中的条形码边界框。

x

该方法返回条形码边界框的 x 坐标(整数)。您也可以通过索引 [0] 获取该值。

y

该方法返回条形码边界框的 y 坐标(整数)。您也可以通过索引 [1] 获取该值。

w

该方法返回条形码边界框的宽度(整数)。您也可以通过索引 [2] 获取该值。

h

该方法返回条形码边界框的高度(整数)。您也可以通过索引 [3] 获取该值。

payload

该方法返回条形码的有效载荷字符串,例如:“数量”。

您也可以通过索引 [4] 获取该值。

type

该方法返回条形码的类型(整数)。可能的类型包括:

.EAN5

您也可以通过索引 [5] 获取该值。

rotation

该方法返回条形码的旋转角度(以弧度计量,浮点数)。

您也可以通过索引 [6] 获取该值。

quality

该方法返回条形码在图像中被检测到的次数(整数)。

在扫描条形码时,每一条新的扫描线都能解码相同的条形码。每次进行此过程时,条形码的值都会增加。

您也可以通过索引 [7] 获取该值。