Datamatrix二维码开源解码库libdmtx

来源:互联网 发布:java微信公众号开发pdf 编辑:程序博客网 时间:2024/06/07 01:14
    最近一个项目需要扫描二维码,一开始想到的是开源的库ZXing(我使用的是它的Qt封装QZXing)。我做了以下两步工作: 

1、上网查到了图片中的二维码是Data Matrix码,ZXing的文档说是可以解码的。我在构造ZXing对象时特意将DecoderFormat设置成Data Matrix,经测试解不了码。
2、对图像进行预处理,高斯滤波、二值化、形态学处理等,甚至使用画图工具手动清除所有的干扰,但是ZXing还是解不了码。

    正在一筹莫展时,我又找到了另外一个开源的库libdmtx,官网是http://www.libdmtx.org/。libdmtx是一个专门用来处理Data Matrix码的,有源码,可是文档比较少,也没有使用例程。摸索了一两个小时才知道简单的应用。

一、编译源码
    在Ubuntu编译libdmtx源码比较简单,在其readme文档里有说明。但是中途还是遇到了一个小问题:在运行./autogen.sh时报”找不到m4文件夹“的错误。可以在源码根目录下建一个空的文件夹,并命名为m4,重新运行./autogen.sh就可以了。

二、应用
    libdmtx有提供编译好的命令,如dmtxread和dmtxwrite。需要使用命令sudo apt-get install libdmtx-utils安装。安装完后就可以在命令行直接调用dmtxread "datamatrix.bmp" 来解码了。

    libdmtx库用到4个主要的结构:
    DmtxImage 保存着图像的属性以及一个指向像素数据的指针,这些像素数据保存在调用的程序里。
    DmtxDecode 保存着控制解码行为和跟踪扫描过程的数值。当扫描一张新的图像,调用的程序需要每次重新创建新的DmtxDecode结构,而不是重用旧的结构。
    DmtxRegion 以像素坐标定义了一个4边形的区域。区域可以从几乎任何方向获得,而且它们的拐角并不需要形成正确的角度。libdmtx 用它自己的结构来保存潜在条码的位置,程序调用方每调用一次获得一个位置。
    DmtxMessage 保存着从条码提取出的解码信息。一个成功解码的区域将精确地产生一个的信息。    

    由于要进行图像预处理,我在项目中也使用了OpenCV库。预处理主要包括滤波、二值化、形态学处理、尺寸变换(如果图太大的话应进行resize)等。

    下面的代码主要是为了说明libdmtx的简单调用,因此预处理就不给出来了。

三、测试结果
    项目采集到的原图是1280*1024的,使用上面的程序去解码耗时一分钟以上。于是我把原图缩小成160*128,解码平均需要20ms。

    
参考:
1、libdmtx官网:http://www.libdmtx.org/
2、Data matrix : http://baike.baidu.com/view/1553388.htm
3、libdmtx例子:http://m.blog.csdn.net/blog/chineseboytom/8082187
0 0