项目简介

目前二维码在生活中已经得到了广泛的应用,极大方便了我们的生活,例如支付宝支付二维码,微信支付二维码,那么二维码有什么特点呢?二维条码/二维码(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平台上运行解码程序。

基于树莓派的Data Matrix decode相关推荐

  1. 基于机器视觉的Data Matrix二维码识别

    基于机器视觉的Data Matrix二维码识别 二维码识别,这个在视觉应用中占有很重要的比例,各种各样的二维码都有可能需要识别.常见的QR码.Data Matrix码.本方案是识别Data Matri ...

  2. 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)

    目录 一.写在前面 二.系统实现: Author:qyan.li Date:2022.6.10 Topic:详解树莓派的使用及基于树莓派制作手势控制的小车 Reference:如何给树莓派安装操作系统 ...

  3. 基于树莓派人脸识别智能门禁

    一.功能: 基于树莓派的人脸识别智能门锁采用树莓派开发板模块,电源模块,红外传感器感应模块,树莓派专用摄像头模块和扬声器以及12v电磁锁驱动模块,实现在线人脸识别控制 二.硬件材料: 树莓派3B(Ra ...

  4. 基于树莓派车牌识别门禁系统

    基于树莓派车牌识别门禁系统 前言 开发环境 源码 硬件 效果演示 后记 前言 毕业设计想做一个集大学所自学过的所有语言,再加上嵌入式的完整应用类型.但由于疫情的原因,没办法完整的展现.不过中间还是自己 ...

  5. 【小白教程】基于树莓派的智能语音助手-python

    [完整教程零基础]基于树莓派的智能语音助手-python 树莓派3b+.python3系统自带.百度语音识别与合成.调用图灵机器人(热词唤醒失败,可用snowboy) 1.Windows系统下[下载+ ...

  6. 基于树莓派的机箱硬件监控副屏

    一.简介 监控器效果如图所示: 电脑端的服务器ui: 思路就是在电脑端建立一个小服务器读取硬件数据,然后通过局域网发送给树莓派上的客户端用以显示. 二.原理 首先读取硬件数据可以使用OpenHardw ...

  7. 二维码Data Matrix编码、解码使用举例

    二维码Data Matrix的介绍见: http://blog.csdn.net/fengbingchun/article/details/44279967  ,这里简单写了个生成二维码和对二维码进行 ...

  8. 二维码Data Matrix简介及在VS2010中的编译

    Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码 ...

  9. 基于树莓派的流星雨监测系统(RMS)的搭建

    本系列第二篇文章:基于树莓派的流星雨监测系统(RMS)的进一步改造(1)_delacroix_xu的专栏-CSDN博客 本系列第三篇文章:基于树莓派的流星雨监测系统(RMS)的进一步改造(2)_del ...

  10. 【毕业设计】基于树莓派的指纹识别打卡系统 - 单片机 物联网

    文章目录 1 简介 2 主要器件 3 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目 基于树莓派的指纹打卡器 大家可用于 课程设计 ...

最新文章

  1. 程序员的自我修养--链接、装载与库笔记:静态链接
  2. guava Throwables类文档翻译及用法入门
  3. C++11 新特性之std::thread
  4. 1119 Pre- and Post-order Traversals (30 分)【难度: 难 / 知识点: 树的构建】
  5. java 服务器所在盘符_JAVA获取文件本身所在的磁盘位置 | 学步园
  6. python文件存储过程_python调用MySql存储过程
  7. 【网】关于 Blog 和 RSS 的全面介绍
  8. ConcurrentDictionary的ToDictionary
  9. LeetCode 111. Minimum Depth of Binary Tree
  10. DDL修改 删除 使用数据库
  11. linux crontab定时任务详解
  12. java反序列化的原理,java – 反序列化的工作原理?
  13. ZTE Unveils World's First WiMAX Mobile Video Surveillance Terminal
  14. 如何用vue实现模态框组件
  15. MFC ------- AfxGetMainWnd( )
  16. 数字电路逻辑设计笔记(1):基础知识
  17. Unity3D 保姆级安装教程与收费方案和版本、下载地址,看不会算我输
  18. php获取随机的六位数,php生成随机六位数密码代码
  19. Vue实现 TodoList
  20. 重置计算机后无法开机,win10重置此电脑失败怎么办_win10重置此电脑失败无法开机修复方法...

热门文章

  1. 孪生网络pytoch实现,以resnet为特征提取网络
  2. 2022年最新山西机动车签字授权人模拟试题及答案
  3. svnadmin dump导入导出命令
  4. Quartz数据库存储
  5. MT6763芯片资料MT6763处理器性能介绍下载
  6. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(五)——无源与有源电流镜
  7. Oracle11g软硬件基本要求,Oracle 11g的安装
  8. 物联网全栈教程-从云端到设备(四)
  9. 关于F类最基础的ADS仿真
  10. macOS进化史以及历代macOS系统5K壁纸