【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别

【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别

在这里插入图片描述
【MaixPy系列教程:】

前言

随着科技的发展,移动支付让人们的生活变得越来越便捷,可是与之背后的原理我们又了解多少呢?那么今天就让我带领大家一起用milxy一起去实现:条形码、二维码、AprilTag识别。

准备阶段

  • Maixduino
  • typec 数据线
  • 条形码、二维码、Apriltag码若干

条形码

1:什么是条形码

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

2:条形码识别原理

条码符号是由反射率不同的“条”、“空”按照一定的编码规则组合起来的一种信息符号。由于条码符号中“条”、“空”对光线具有不同的反射率,从而使条码扫描器接受到强弱不同的反射光信号,相应地产生电位高低不同的电脉冲。而条码符号中“条”、“空”的宽度则决定电位高低不同的电脉冲信号的长短。扫描器接收到的光信号需要经光电转换成电信号并通过放大电路进行放大。由于扫描光点具有一定的尺寸、条码印刷时的边缘模糊性以及一些其他原因,经过电路放大的条码电信号是一种平滑的起伏信号,这种信号被称为“模拟电信号”。“模拟电信号”需经整形变成通常的“数字信号”。根据码制所对应的编码规则,译码器便可将“数字信号”识读译成数字、字符信息

3:BarCode类

MaixPy固件中的内置库image库内置了BarCode类,专门用于识别条形码。其中他的方法有:

方法名称功能
barcode.corners()返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。
barcode.rect()返回一个矩形元组(x, y, w, h),用于如数据矩阵的边界框的 image.draw_rectangle 等其他的 image 方法。
barcode.x()返回条形码的边界框的x坐标(int)
barcode.y()返回条形码的边界框的y坐标(int)。
barcode.w()返回条形码的边界框的w宽度(int)
barcode.h()返回条形码的边界框的h高度(int)。
barcode.payload()返回条形码的有效载荷的字符串。例:数量。
barcode.type()返回条形码的列举类型 (int)
barcode.rotation()返回以弧度计的条形码的旋度(浮点数)
barcode.quality()返回条形码在图像中被检测到的次数(int)

mixly中也有相应的条形码识别积木块在机器视觉中维码识别中如下图所示:
在这里插入图片描述

示例程序

在这里插入图片描述

import sensor
import machine
import image


sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(10)
while True:
    img = sensor.snapshot()
    code = img.find_barcodes([0,0,320,240])
    for i in code:
        code_text = i.payload()
        print(code_text)

实验结果:
在这里插入图片描述

二维码

1:什么是二维码

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

2:二维码的分类

二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量。

从形成方式上,二维码可以分为两类,

1、堆叠式二维码:在一维条形码的基础上,将多个条形码堆积在一起进行编码,常见的编码标准有PDF417等

在这里插入图片描述
2、矩阵式二维码:在一个矩阵空间中通过黑色和白色的方块进行信息的表示,黑色的方块表示1,白色的方块表示0,相应的组合表示了一系列的信息,常见的编码标准有QR 码,汉信码等
在这里插入图片描述

PDF417由美国研发,在美国地区使用广泛
汉信码由中国自主研发,目前已在政府相关领域得到初步的使用。
QR码由日本研发,目前很多的应用都是用QR码进行编码,译码(目前使用最广的是QR码,所以接下来的内容会对QR码进行讲解)

3:二维码的结构

一个二维码可以分为两个部分,功能图形和编码区域
在这里插入图片描述

功能图形起到定位的作用

名称作用
位置探测图形由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。
定位图形由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。
校正图形仅在版本2以上存在,由三个黑白相间的小正方形嵌套组成,便于确定中心,纠正扭曲。

数据区记录了具体的数据信息,纠错信息与版本信息

名称作用
数据和纠错码记录了数据信息和相应的纠错码,纠错码的存在使得当二维码的数据出现允许范围内的错误时,也可以正确解码。
版本信息仅在版本7以上存在,记录具体的版本信息。
格式信息记录使用的掩码和纠错等级。

此外二维码的外围还留有一圈空白区,主要是为了便于识别而存在。

4:QRCode类

MaixPy固件中的内置库image库内置了QRCode类,专门用于识别二位码。其中它的方法有:

方法名称作用
qrcode.corners()返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。
qrcode.rect()返回一个矩形元组(x, y, w, h),用于如二维码的边界框的 image.draw_rectangle 等其他的 image 方法。
qrcode.x()返回二维码的边界框的x坐标(int)
qrcode.y()返回二维码的边界框的y坐标(int)。
qrcode.w()返回二维码的边界框的w坐标(int)。
qrcode.h()返回二维码的边界框的h坐标(int)。
qrcode.payload()返回二维码有效载荷的字符串,例如URL 。
qrcode.version()返回二维码的版本号(int)。
qrcode.ecc_level()返回二维码的ECC水平(int)。
qrcode.data_type()返回二维码的数据类型。
qrcode.eci()返回二维码的ECI。ECI储存了QR码中存储数据字节的编码。若您想要处理包含超过标准ASCII文本的二维码,您需要查看这一数值。
qrcode.is_numeric()若二维码的数据类型为数字式,则返回True
qrcode.is_alphanumeric()若二维码的数据类型为文字数字式,则返回True。
qrcode.is_binary()若二维码的数据类型为二进制式,则返回True
qrcode.is_kanji()若二维码的数据类型为日本汉字,则返回True

mixly中也有相应的条形码识别积木块在机器视觉中维码识别中如下图所示:
在这里插入图片描述

示例程序

在这里插入图片描述
程序代码

import sensor
import machine
import image


sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(10)
sensor.set_hmirror(0)
while True:
    img = sensor.snapshot()
    code = img.find_qrcodes([0,0,320,240])
    for i in code:
        code_text = i.payload()
        print(code_text)

实验结果:
可以用草料二维码生成器在线生成我们想要的内容。
在这里插入图片描述

AprilTag

1:什么是AprilTag?

AprilTags是基准标记的一种流行形式。它在机器人技术中具有广泛的应用,包括对象跟踪,视觉定位,SLAM准确性评估和人机交互。Isaac通过利用GPU加速同时实现高解码鲁棒性来提供实时AprilTag检测。

2:和条形码二维码的区别

AprilTag标记在机器视觉中显得比条形码、二维码更加有用,因为它能够通过AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id;真实世界中的3D位置对于机器来说非常有用!AprilTag常用于各种任务,包括AR,机器人和相机校准。

3:Apriltag生成

MaixPy IDE 中在工具-》机器视觉选择中有不同码的生成如下图
在这里插入图片描述
如果用的老师用二哈觉得官方给的标签可以用这个生成哦。

4:AprilTag类

方法名称作用
apriltag.corners()返回一个由该对象的四个角组成的四个元组(x,y)的列表。
apriltag.rect()返回一个矩形元组(x, y, w, h),用于如AprilTag边界框的 image.draw_rectangle 等其他的 image 方法
apriltag.x()返回AprilTag边界框的x坐标(int)。
apriltag.y()返回AprilTag边界框的y坐标(int)。
apriltag.w()返回AprilTag边界框的w坐标(int)。
apriltag.h()返回AprilTag边界框的h坐标(int)。
apriltag.id()返回AprilTag的数字ID。
apriltag.family()返回AprilTag的数字家庭。
apriltag.cx()返回AprilTag的中心x位置(int)。
apriltag.cy()返回AprilTag的中心y位置(int)。
apriltag.rotation()返回以弧度计的AprilTag的旋度(int)。
apriltag.decision_margin()返回AprilTag匹配的色饱和度(取值0.0 - 1.0),其中1.0为最佳。
apriltag.hamming()返回AprilTag的可接受的数位误差数值。
apriltag.goodness()返回AprilTag图像的色饱和度(取值0.0 - 1.0),其中1.0为最佳。
apriltag.x_translation()返回距离摄像机x方向的变换,距离的单位未知。
apriltag.y_translation()返回距离摄像机y方向的变换,距离的单位未知。
apriltag.z_translation()返回距离摄像机z方向的变换,距离的单位未知。
apriltag.x_rotation()返回以弧度计的AprilTag在X平面上的旋度。例:目视AprilTag,从左至右移动摄像头。
apriltag.y_rotation()返回以弧度计的AprilTag在Y平面上的旋度。例:目视AprilTag,从上至下移动摄像头。
apriltag.z_rotation()返回以弧度计的AprilTag在Z平面上的旋度。例:目视AprilTag,旋转摄像头。

mixly中也有相应的AprilTag识别积木块在机器视觉中维码识别中如下图所示:
在这里插入图片描述

示例程序

在这里插入图片描述
考虑到识别性能问题,我们应该设计摄像头的帧大小为:160120,同样ArilTag识别图像区域同样为:0,0,160,120*
程序代码

import sensor
import machine
import image


sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.run(1)
sensor.skip_frames(10)
sensor.set_hmirror(0)
while True:
    img = sensor.snapshot()
    code = img.find_apriltags([0,0,160,120])
    for i in code:
        code_text = i.id()
        print(code_text)

实验结果:
在这里插入图片描述

总结

通过本次的教程,想必大家都对标签识别都有了一定的了解了吧,应用功能请参考下一篇:标签识别音乐播放器。敬请期待!!更多教程欢迎访问个人博客:www.hockel.club 有问题的可以加入【MixNo QQ群:1056344043】

### 使用K210芯片实现二维码识别 #### 开发环境准备 为了使用K210芯片进行二维码识别,首先需要准备好相应的开发环境。这通常涉及到安装Canmv IDE以及配置好MaixPy库,以便能够顺利编写和上传代码至K210开发板[^1]。 #### 二维码识别流程概述 二维码是由特定几何图形按照一定规律分布在平面上形成的黑白相间图案,用于记录数据符号信息。对于K210来说,可以通过摄像头捕捉图像,并利用内置算法解析其中可能存在的二维码结构,进而提取出其所携带的信息[^2]。 #### 实现步骤说明 具体而言,在Canmv IDE环境中可以调用预训练好的模型或者自定义神经网络来进行实时视频流中的二维码检测工作。当发现有效二维码时,程序会将其位置标记出来,并输出解码后的字符串内容给用户查看或进一步处理。 ```python import sensor, image, time from maix import nn, camera, display # 初始化传感器参数 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) # 加载二维码识别模型 model = nn.load('/path/to/qrcode_model') while True: img = camera.capture() # 获取当前帧图片 result = model.forward(img) # 执行前向传播预测 if isinstance(result, list): for r in result: box = r['bbox'] text = r['text'] img.draw_rectangle(box) # 绘制矩形框标注二维码区域 print(text) # 输出解码得到的文字信息 display.show(img) # 显示带有标注的结果画面 ``` 此段代码展示了如何初始化相机模块、加载预先训练过的二维码识别模型,并在一个无限循环里不断获取新图像帧并尝试从中找到任何可用的二维码实例。一旦成功定位到某个二维码,则会在原图上画出它的包围盒并将对应的内容打印出来供开发者查阅。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值