dirty 发表于 2025-1-22 18:44

【嘉楠K230开发板】码类识别

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

<p>&nbsp; &nbsp; &nbsp; 本篇讲述条形码与二维码识别。</p>

<p><strong><span style="color:#0000ff;">条形码识别</span></strong></p>

<p><span style="color:#e74c3c;">1.了解条形码</span></p>

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

<p><span style="color:#e74c3c;">2.相关API函数</span></p>

<p>&nbsp; &nbsp; &nbsp; 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 。</p>

<p>构造函数</p>

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

<p>使用方法</p>

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

<p><span style="color:#e74c3c;">3.条形码识别代码与运行结果</span></p>

<pre>
<code>'''
条形码识别
'''

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()) #打印帧率
</code></pre>

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

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p><strong><span style="color:#0000ff;">二维码识别</span></strong></p>

<p><span style="color:#e74c3c;">1.了解二维码</span></p>

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

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

<p><span style="color:#e74c3c;">2.相关API函数</span></p>

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

<p>构造函数</p>

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

<p>使用方法</p>

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

<p><span style="color:#e74c3c;">3.二维码识别代码与运行结果</span></p>

<pre>
<code>'''
二维码识别
'''

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) &gt; 0: #在图片和终端显示二维码信息

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

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

    Display.show_image(img) #显示图片

    print(clock.fps()) #打印帧率
</code></pre>

<p>&nbsp; &nbsp; &nbsp; 使用<a href="https://www.hlcode.cn/?p=bd-bsg-sc-20220406-1-10&amp;bd_vid=8356703175885990236" target="_blank">二维码生成工具</a>,这里使用EEWorld网址生成二维码。运行,摄像头对着二维码,识别结果如下:</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>&nbsp; &nbsp; &nbsp; 至此,实现摄像头条形码、二维码识别功能。</p>

<p>&nbsp;</p>

wangerxian 发表于 2025-1-23 09:17

<p>二维码识别也能达到30帧,还不错!</p>

dirty 发表于 2025-1-23 09:29

wangerxian 发表于 2025-1-23 09:17
二维码识别也能达到30帧,还不错!

<p>嗯,还好</p>

freebsder 发表于 2025-1-23 16:48

<p>MicroPython 直接支持barcode?这有点意思了。</p>

dirty 发表于 2025-1-23 18:01

freebsder 发表于 2025-1-23 16:48
MicroPython 直接支持barcode?这有点意思了。

<p>支持,就是条形码密集了、太小了,识别不大出来</p>

freebsder 发表于 2025-1-24 17:58

dirty 发表于 2025-1-23 18:01
支持,就是条形码密集了、太小了,识别不大出来

<p>可能和角度,材料,距离等也有关系。</p>
页: [1]
查看完整版本: 【嘉楠K230开发板】码类识别