hockel 发表于 2020-7-6 22:26:22

用mixly玩转k210——条形码、二维码、AprilTag识别

## 【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别
![](data/attachment/album/202007/06/173800a7piz0i3dr0owic3.png)
【MaixPy系列教程:】
+ [【MaixPy教程】用maixHub训练模型进行开源硬件识别](https://mc.dfrobot.com.cn/thread-304993-1-1.html)
+ [【MaixPy 教程】用mixly玩转K210——口罩识别](https://mc.dfrobot.com.cn/thread-305026-1-1.html)
+ [【MaixPy教程】用mixly玩转K210——调用AI-OneNET API实现车牌识别](https://mc.dfrobot.com.cn/thread-305038-1-1.html)
+ [【MaixPy 教程】用mixly玩转K210——人脸追踪](https://mc.dfrobot.com.cn/thread-305097-1-1.html)
+ [【MaixPy 教程】用mixly玩转K210——20类对象检测](https://mc.dfrobot.com.cn/thread-305125-1-1.html)
+ [【MaixPy 教程】用mixly玩转K210——一键本地模型训练](https://mc.dfrobot.com.cn/thread-305291-1-1.html)
+ [【MaixPy 教程】用mixly玩转k210——MixNo通过TCP/IP与掌控板进行通讯](https://mc.dfrobot.com.cn/thread-305317-1-1.html)
+ [【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别](https://mc.dfrobot.com.cn/thread-306225-1-1.html)

## 前言
![](data/attachment/album/202007/06/232758l67i6bha6ztwrri7.jpg)
前些阵子DF举办的[【Maixduino AI 开发板 众测来袭】](https://mc.dfrobot.com.cn/thread-305822-0-1.html#pid459771)有幸获得众测资格(十分感谢df的KiKi小姐姐)。之前也写了一系列关于K210芯片的教程,由于自己最近比较忙,就没有继续更新新帖了,听说二哈新固件也将要支持二维码识别了。那么今天就让我带领大家一起用milxy一起去实现:条形码、二维码、AprilTag识别。
## 准备阶段
- [ Maixduino](https://www.dfrobot.com.cn/goods-2592.html)
- 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中也有相应的条形码识别积木块在机器视觉中维码识别中如下图所示:

![](data/attachment/album/202007/06/182533n1pqppva8qikikqp.png)
### 示例程序
![](data/attachment/album/202007/06/182723vq5mqe28gqznbdg0.png)
代码:
```
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()
    for i in code:
      code_text = i.payload()
      print(code_text)

```
实验结果:
![](data/attachment/album/202007/06/183643rnm5mi5x55yd2dyg.png)

## 二维码
### 1:什么是二维码
二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
### 2:二维码的分类
二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量。

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

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

![](data/attachment/album/202007/06/220140xt6j2a4fl89f268z.png)
2、矩阵式二维码:在一个矩阵空间中通过黑色和白色的方块进行信息的表示,黑色的方块表示1,白色的方块表示0,相应的组合表示了一系列的信息,常见的编码标准有QR 码,汉信码等
![](data/attachment/album/202007/06/220720el6mqlnq00m9l2nn.png)
```
PDF417由美国研发,在美国地区使用广泛
汉信码由中国自主研发,目前已在政府相关领域得到初步的使用。
QR码由日本研发,目前很多的应用都是用QR码进行编码,译码(目前使用最广的是QR码,所以接下来的内容会对QR码进行讲解)
```
### 3:二维码的结构
一个二维码可以分为两个部分,功能图形和编码区域
![](data/attachment/album/202007/06/221040nmlinlfkidwkiew2.png)

功能图形起到定位的作用


| 名称 | 作用 |
| -------- | -------- |
|位置探测图形   | 由三个黑白相间的大正方形嵌套组成,分别位于二维码左上角、右上角、左下角,目的是为了确定二维码的大小和位置。    |
|定位图形       | 由两条黑白相间的直线组成,便于确定二维码的角度,纠正扭曲。    |
| 校正图形      | 仅在版本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中也有相应的条形码识别积木块在机器视觉中维码识别中如下图所示:

![](data/attachment/album/202007/06/223446wttxs83ty37zlvil.png)
### 示例程序
![](data/attachment/album/202007/06/223600kecwzbes0qq48ckh.png)
程序代码
```
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()
    for i in code:
      code_text = i.payload()
      print(code_text)
```
实验结果:
可以用[草料二维码生成器](https://cli.im/)在线生成我们想要的内容。
![](data/attachment/album/202007/06/224002vaay2mtt4a5mmljw.png)
## AprilTag
### 1:什么是AprilTag?
AprilTags是基准标记的一种流行形式。它在机器人技术中具有广泛的应用,包括对象跟踪,视觉定位,SLAM准确性评估和人机交互。Isaac通过利用GPU加速同时实现高解码鲁棒性来提供实时AprilTag检测。
### 2:和条形码二维码的区别
AprilTag标记在机器视觉中显得比条形码、二维码更加有用,因为它能够通过AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id;真实世界中的3D位置对于机器来说非常有用!AprilTag常用于各种任务,包括AR,机器人和相机校准。
### 3:Apriltag生成
MaixPy IDE 中在工具-》机器视觉选择中有不同码的生成如下图
![](data/attachment/album/202007/06/230234g0a9t6qm5oo9a5t7.png)
如果用的老师用二哈觉得官方给的标签可以用这个生成哦。
### 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识别积木块在机器视觉中维码识别中如下图所示:
![](data/attachment/album/202007/06/231225qoxeeksz2elk2u2z.png)

## 示例程序
![](data/attachment/album/202007/06/231356bsllazv5fli4siss.png)
***考虑到识别性能问题,我们应该设计摄像头的帧大小为:160*120,同样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()
    for i in code:
      code_text = i.id()
      print(code_text)

```
实验结果:
![](data/attachment/album/202007/06/232044ga2zzanidadvaay6.png)

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

汤果 发表于 2020-7-7 06:44:07

很详细的教程,学习了

驴友花雕 发表于 2020-7-7 16:03:02

学习了,非常好的教程

驴友花雕 发表于 2020-7-7 19:31:35

请问老师,这个MaixPY在哪里下载?都能使用吗?

媛媛 发表于 2020-11-6 14:33:42

非常好的教程,了解了很多
页: [1]
查看完整版本: 用mixly玩转k210——条形码、二维码、AprilTag识别