【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别
【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别
【MaixPy系列教程:】
- 【MaixPy教程】用maixHub训练模型进行开源硬件识别
- 【MaixPy 教程】用mixly玩转K210——口罩识别
- 【MaixPy教程】用mixly玩转K210——调用AI_OneNET API实现车牌识别
- 【MaixPy 教程】用mixly玩转K210——人脸追踪
- 【MaixPy 教程】用mixly玩转K210——20类对象检测
- 【MaixPy 教程】用mixly玩转K210——一键本地模型训练
- 【MaixPY 教程】用mixly玩转k210——MixNo通过TCP/IP与掌控板进行通讯
- 【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别
前言
随着科技的发展,移动支付让人们的生活变得越来越便捷,可是与之背后的原理我们又了解多少呢?那么今天就让我带领大家一起用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 imagesensor.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 imagesensor.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 imagesensor.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】
【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别相关推荐
- GM65条形码二维码扫描识别模块与STM32学习
目录 模块介绍: 简介: 原理介绍: 工作流程: 技术参数: 修改配置: 代码介绍: 串口函数: 主函数: 模块介绍: 简介: GM65 条形码二维码扫描识别模块是一种基于激光扫描头的识别设备 原理介 ...
- 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂功能第12波-快速生成、读取、导出条形码二维码...
根据指定的内容生成对应的条形码或二维码,在如今移动互联网时代,并不是一件什么新鲜事,随便百度一下,都能找到好多的软件或在线网站可以帮我们做到,但细想一下,如果很偶然地只是生成一个两这样的图形,百度一下 ...
- Android利用zxing生成二维码,识别二维码,中间填充图片超详细、超简易教程
gayhub上的zxing可用于生成二维码,识别二维码 gayhub地址:https://github.com/zxing/zxing 此文只是简易教程,文末附有完整代码和demo下载地址,进入正题: ...
- 基于opencv3.0和zbar下条形码和二维码的识别与解码
其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...
- JS生成条形码/二维码 barcode.js、JsBarcode
JS生成条形码/二维码 barcode.JsBarcode JsBarcode Barcode.js 以下代码均非纯原创.新手小白.网上一搜一大把的概念也不写了,直接上可运行的代码及遇到的小坑. Js ...
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...
- python opencv 条形码及二维码检测识别
目录 条形码检测识别 二维码检测识别 基于python opencv pyzbar 实现. 条形码检测识别 原图: 最后截取图: 直接上代码: import cv2 import numpy as n ...
- zbar下条形码和二维码的识别与解码Ⅰ|2021SC@SDUSC
2021SC@SDUSC 对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. ...
- 【C#】最全单据打印(打印模板、条形码二维码、字体样式、项目源码)
系列文章 [C#]编号生成器(定义单号规则.固定字符.流水号.业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/12912978 ...
最新文章
- 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!...
- 自助建站软件越来越友好,三大优点值得用心体会
- 百度计算广告学沙龙学习笔记 - 内容匹配广告
- 一文读懂 volatile 关键字
- Python 代码实现模糊查询
- PopTheBubble —测量媒体偏差的产品创意
- Impala之加载HBase数据
- python 查看文件名_python 查看文件名和文件路径
- 用WPS2000做电子相册三步曲(转)
- 联想官方OEM分区制作
- Python字符串日常练习(基础向)
- 所有男生女生看了都会感动的分手理由(天堂杂志转贴)
- java毕业设计云笔记管理系统Mybatis+系统+数据库+调试部署
- 使用jquery控制只能输入数字,并且关闭输入法
- 数据库第四次实验报告
- R COOKBOOK 学习笔记
- BIOS功能调用表格
- html的代码怎麼格式化,怎么格式化html代码? Dreamweaver格式化html代码的技巧
- HTML表单元素-输入框
- 关于笔记本电脑上HDMI、VGA、USB接口的小知识, 另外别想着用笔记本当树莓派显示器了!
热门文章
- 平面解析几何----椭圆中焦中三角形的最值问题
- 如何使用阿里巴巴短信服务发送短信验证码
- 定义商品类Goods 并进行封装
- mpv播放器旋转视频
- 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
- [电池]设置-电池-上次充满电时间计算
- oracle 客户端可以连接11g rac vip 但是不能连接scan ip问题
- 我们研究了853场世界杯比赛,发现了这几条稳赔不赚的竞猜攻略
- HDU 5952 Counting Cliques(2016ACM/ICPC亚洲区沈阳站-重现赛)
- JS、JNS、JP(JPE)、JNP(JPO)指令详解、从原理上解释