二维码分类

二维码分类

最近在做二维码解码的项目。用的是zxing库+VS2015+OPENCV3.4,网上说ZBAR库也ok;
概念: 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二位方向上)分布的黑白相间的图形记录数据符号信息的图形。

一维条码

一维条码是由一组粗细不同、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。

一维条码示意图:
一维码示意图
二维条码

二维条码是用某种特定的几何图形按一定规律在平面(二维方向)上分布的条、空相间的图形来记录数据符号信息。
二维码:

二维码示意图

二维条码也有许多不同的码制,就码制的编码原理而言,通常分为三种类型:

1.线性堆叠式二维码
2.矩阵式二维码
3.邮政码

线性堆叠式二维码
编码原理:建立在一维条码基础之上,按需要堆积成两行或多行,整体风格类似一维码。
线性堆叠式二维码示意图:

线性式堆叠式二维码
矩阵式二维码

在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,是最为常见的二维码类型,其中包含了最为流行的QR_Code。
矩阵式二维码示意图:
常见矩阵式二维码
邮政码

邮政码通过不同长度的条进行编码,主要用于邮件编码,如:POSTNET、BPO 4-STATE,一般通过不同长度的条作为邮件编码。
在这里插入图片描述

目前流行的三大国际标准:
PDF417:不支持中文
DM:专利未公开,需支付专利费用
QR Code:专利公开,支持中文

QR Code比其他二维码相比具有的优势:

  1. 识读速度快
  2. 数据密度大
  3. 占用空间小

QR Code是由日本Denso公司于1994年研制的一种矩阵二维码符号吗,全称是Quick Response Code

Data Matrix码
ata Matrix原名Data code,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明,整个图形尺寸伸缩自如,大可以做成1米1米。小可以做成0.30.3mm。Data Matrix又可分为ECC000-140与ECC200两种类型,ECC000-140具有多种不同等级的错误纠正功能,而ECC200则透过Reed-Solomon演算法产生多项式计算出错误纠正码,其尺寸可以依需求印成不同大小,但采用的错误纠正码应与尺寸配合,由于其演算法较为容易,且尺寸较有弹性,故一般以ECC200较为普遍,常应用于电子产品表面。
ECC200 是最新的 Data Matrix码版本,可以配置为正方形或矩形。ECC200 已国际标准化。当需要 Data Matrix 码时,通常使用 ECC200 版本。
Data Matrix(ECC200)码结构
Data Matrix 码的数据区域四周为 L 形框(称为“对准图案”)和点线(称为“时钟图案”)。读取器将捕获这些图案,通过图像处理技术确定代码的位置。因此,可从任何方向上读取 Data Matrix 码。
当模块数目超过 24 × 24 时,代码将分成区块,每侧不会超过 24 个模块。此结构可防止代码失真。
在这里插入图片描述
共有 24 种代码尺寸,范围为从 10 × 10 模块到 144 × 144 模块(对于矩形,共有六种尺寸)。
当某个代码的模块数目超过 26 × 26(对于数据,模块数目超过 24 × 24)时,它会划分为区块,如下所示,每侧不超过 24 个模块。此结构可防止代码失真。

在这里插入图片描述

工程中用到的一些二维码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
AprilTags
换了份工作又要开始解码了,我是上辈子看太多毛片被诅咒了吗?要如此折磨我,不出意外的话,未来两年的工作重心就放在解码相关项目上。
最近的工作主要是以AprilTags二维码为主,AprilTags在概念上类似于QR码,因为它们是一种二维条形码。 但是,降低了复杂度以满足实时性要求,它们被设计用于编码更小的数据有效载荷(4到12位之间),从而可以更长距离地检测它们。 此外,它们设计用于高定位精度 - 可以计算AprilTag相对于相机的精确3D位置。
与普通二维码相比, AprilTags可在更远距离、较差光线和更扭曲的图像环境下被检测到。 AprilTags可应对所有种类的图像失真问题,而二维码并不能。也就是说, AprilTags只能将数字D编码作为其有效载荷。
官网:https://april.eecs.umich.edu/software/apriltag.html
git仓库地址:https://github.com/AprilRobotics/apriltag

AprilTags可以应用于:

相机标定
目标大小估计
测量相机到目标的距离
3D 定位(3D positioning)
机器人
SLAM
自主导航(autonomous navigation)

AprilTag family默认的是:Tag36h11,在AprilTags中有六个系列families:

Tag36h11
TagStandard41h12
TagStandard52h13
TagCircle21h7
TagCircle49h12
TagCustom48h12

在这里插入图片描述

标签系列的区别?

例如,TAG16H5家族,16为16个像素块,5为假阳性值,其实际上是一个4x4的方形标签。一般来说,默认使用族TAG36H11。当然现在AprilTag更新到了第三代,使用tagStandard41h12更好。

APRILTAG原理
AprilTag内容主要包含三个步骤。

第一步:根据梯度检测出图像中的各种边缘
第二步:在边缘图像中找出需要的四边形图案并进行筛选
AprilTag尽可能的对检测出的边缘检测,首先剔除非直线边缘,在直线边缘进行邻接边缘查找,最终若形成闭环则为检测到一个四边形)

第三步:进行二维码编码和二维码解码
编码方式分为三种,其黑边色块长度分别为8,7,6三个色块长度,对于解码内容,要在检测到的四边形内生成点阵列用于计算每色块的值,再根据局部二值模式(Local Binary Patterns)构造简单分类器对四边形内的色块进行分类,将正例色块编码为1将负例色块编码为0,就可以得到该二维码的编码。得到编码以后再与已知库内的编码进行匹配,确定解码出的二维码是否为正确。

APRILTAG图像生成
下载openmv软件

中国官网地址:http://openmv.cc (点击 软件下载)
美国官网下载地址:https://openmv.io/pages/download
安装后打开,依次按照图示进行,选择相应文件夹生成即可
在这里插入图片描述
四、OPENMV实现
利用OpenMV自带函数 find_apriltags 寻找Apriltag


import sensor, image, time, math

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # 如果分辨率更大,我们的内存会耗尽...
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)  # 必须关闭此功能,以防止图像冲洗…
sensor.set_auto_whitebal(False)  # 必须关闭此功能,以防止图像冲洗…
clock = time.clock()

# 注意!与find_qrcodes不同,find_apriltags方法不需要对图像进行镜头校正

# apriltag代码最多支持可以同时处理6种tag家族。
# 返回的tag标记对象,将有其tag标记家族及其在tag标记家族内的id。

def family_name(tag):
    if(tag.family() == image.TAG16H5):
        return "TAG16H5"
    if(tag.family() == image.TAG25H7):
        return "TAG25H7"
    if(tag.family() == image.TAG25H9):
        return "TAG25H9"
    if(tag.family() == image.TAG36H10):
        return "TAG36H10"
    if(tag.family() == image.TAG36H11):
        return "TAG36H11"
    if(tag.family() == image.ARTOOLKIT):
        return "ARTOOLKIT"

while(True):
    clock.tick()
    img = sensor.snapshot()
    for tag in img.find_apriltags(): # 如果没有给出家族,默认TAG36H11。
        img.draw_rectangle(tag.rect(), color = (255, 0, 0))
        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
        print_args = (family_name(tag), tag.id(), (180 * tag.rotation()) / math.pi)
        print("Tag Family %s, Tag ID %d, rotation %f (degrees)" % print_args)
    print(clock.fps())

另外,在查阅资料的时候发现MaixPY 也可以实现类似的功能。

在这里插入图片描述
在这里插入图片描述

最后感谢慕课网老师:https://www.imooc.com/video/10311
参考:https://www.freesion.com/article/42341128173/

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值