基于树莓派的Data Matrix decode

项目简介

目前二维码在生活中已经得到了广泛的应用,极大方便了我们的生活,例如支付宝支付二维码,微信支付二维码,那么二维码有什么特点呢?二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。本项目主要是完成DM码解码部分的工作,下图为DM二维码图片示例
在这里插入图片描述

二维码分类

按照码制不同,二维码可以分为许多种类,常见的有QR码,DM码,PDF417等等。下面将QR码与DM码做一些对比:DM无法表现汉字等其他形式,而QR码能用数据压缩方式来表示汉字,仅用13bit即可表示一个汉字,比其他二维条码表示汉字的效率提高了20%。相较而言,DM码信息容量小,应用简单。而QR在汉字处理上更有优势。在纠错能力上,QR码具有四个不同等级的纠错功能,即使破损即使弯曲或者有高达30%的残缺也能够正确识读。显示了其强大的纠错能力,但DM在编码破损上的表现得更为出色。它只需要读取资料的20%即可精确辨读。对少于255个字码的DM二维条码,错误纠正字码可由资料字码计算得出。对于多于255个字码的符号,应将资料字码分成多个模组,然后再产生每一个模组的错误纠正字码。再看读取速度与读取角度的比拼。QR 码的英文全称是Quick Response Code,直译为:快速响应编码,由此看出,超高速识读是 QR码最显著的特点,是QR Code码区别其他二维码的主要特性。据统计,用CCD二维条码识读设备,每秒可识读30个含有100个字符的QR Code码符号;而对于Data Martix矩阵码,每秒仅能识读2~3个符号。读取角度上QR Code码具有全方位(360°)识读特点。而DM码上没有设置类似于QR码的寻像图形,因此只能在一个方向上读取。

相应解码库介绍

1.zbar
zbar是一款开源的条形码,二维码解码库,支持windows系统,linux系统和iphone平台,可扫描以下类型:EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39, Interleaved 2 of 5 and QR Code.(注:zbar不支持DM码的解码,此处列出仅供了解)
2.zxing
zxing是一款开源java类库,可用于解析多种格式的1D,2D条形码,支持JAVA平台,Android系统。(注:这个库官方说明支持DM码的编解码工作,但是通过网上查资料了解到,用这个库进行DM码的解码相关资料较少,而且并没有成功解码案例,也许是我没找到)
3.libdmtx
经过一定的曲折,发现了一个专门用于DM码解码的库libdmtx,libdmtx也是一个开源库,支持多种系统,而且有丰富的语言封装包,即wrappers,通过wrappers,我们可以用相应的语言来实现我们的方案。更详细的说明和下面的一些内容在这个文档里:libdmtx-wikidot.

编译安装

1.在把libdmtx库文件夹拷进树莓派用户目录以后,按照下列命令完成编译安装

chmod  777  configure
./configure
make
sudo make install

2.把dmtx-wrappers文件夹放进树莓派主目录之后,进入dmtx-wrappers/python目录,在命令行执行下面命令完成安装:

python setup.py install

(注:由于系统自带python2.7版本,所以python环境不需要额外搭建)

图像处理之PIL库和opencv库的替换

在原始的dmtx-wrappers文件夹里 ,python封装的测试程序,所用的图形处理库是PIL,考虑到opencv库更加强大,和图形预处理的需要,在DM码解码程序里需要用opencv代替PIL。这部分刚开始确实费了一些周折,但是搞清楚PIL相关程序语句在解码程序里起的作用之后,就变得简单了,下面给出替换前和替换后的程序,并进行一些简单的注释:
1.使用PIL库

from pydmtx import DataMatrix         #导入解码库
from PIL import Image                        #导入PIL库Image模块
dm_read = DataMatrix()                     #类似于重命名
img = Image.open("hello.png")          #得到数字矩阵
print dm_read.decode(img.size[0], img.size[1], buffer(img.tostring()))    #解码语句,前两个参数是图形尺寸,宽和高,第三个参数可以理解为缓存字符串输出

2.使用opencv

from pydmtx import DataMatrix        # 导入解码库  
import cv2                                           #调用opencv
img=cv2.imread('hello.png')               #获取数字矩阵
print DataMatrix().decode(img.shape[0], img.shape[1], buffer(img.tobytes()))#解码语句,前两个参数是图形尺寸,宽和高,第三个参数等价于上面第三个参数

这里需要注意的是,由于要用opencv代替PIL,所以需要提前搭建python-opencv环境,详细步骤参考人脸识别那个项目,本项目所用程序都在dmtx-wrappers/python目录下.

总结拓展

其实到目前为止,我们实现的功能是,有一张规规矩矩的DM码图片,通过解码程序将它解码出来。而项目的实际流程可能是摄像头不断地拍摄图片,得到一个个包含图像信息的数字矩阵(此处不需要保存为一张图片,从数字矩阵直接解码,可以令解码速度更快),然后进行图像预处理,再解码。

很遗憾,本项目也是做了很久才来补文档,呃呃呃,记得当时实际操作的时候遇到了一个问题:那就是当程序运行一段时间,拍摄若干次之后,程序会崩溃,摄像头在程序中断运行之后,无法关闭。这个问题出现之后,折腾了好久仍然没有解决,不过当时的自己给了解决问题的两个方向(希望能对遇见类似问题的同学有所启发):
1.如果继续在树莓派linux上操作,可以从opencv版本和内存泄露两个方面着手,程序运行过程中,崩溃时出现select out 的错误,这个可能和opencv版本有关;程序中,当拍摄图形分辨率设置越高时,即数字矩阵占用内存更大,程序崩溃前能拍摄图形次数越少,感觉像是有一个固定的内存等于每次拍摄图形所占内寸乘以拍摄次数,当这个固定内存被占满之后程序就崩溃,然而程序中又有释放摄像头的语句,所以很可能和内寸泄露有关。

2.可以在windows系统上运行,看能不能正常工作,如果可以则证明是平台问题,再说其他的,如果不能正常工作,则证明是程序问题。在这里会出现一个新的问题,那就是虽然libdmtx库是跨平台的,可以在windows上运行,但是python的封装wrappers不是跨平台的,所以这里需要解决的问题是,你怎么使用自己擅长的语言在windows平台上运行解码程序。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foreverwlh

你的鼓励将是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值