发布时间:2014-10-31

DataMatrix的代码结构和QR码基本相同:

其中Detector的功能还是从原始图像中找出符号码的部分,并且进行透视转换纠正扭曲。
其解码流程与QR码差不多,关键在于怎么从原始图像中取出真实的符号图像。在上文中说过,George Wolberg写的Digital Image Warping一书中PerspectiveTransform方法可以建立起两个四边形之间的映射关系。然后就通过每一点的映射关系将原图中可能不规则的符号图形纠正为规则的矩形。
在QR码中Detector的主要步骤在于找到定位符,在DataMatrix中Detector的关键也在于找到四个角的顶点。具体步骤如下:
1、大致划出符号图像的位置
 
WhiteRectangleDetector(在/core/com/google/zxing/common/detector中)就是用来做这项工作的。它的方法是从图像中间画一个30X30的框,然后依次向四边推行,检测四边上是否有黑色的点,直到每一边都没有黑色的点为止。如下图所示是检测右边边框的代码:
containsBlackPoint函数就是以right为x轴坐标,去检测从up到down这条线上是否有黑色的点。从上图中可以看出,代码就是让right不断++,从而使得右边框不断向右推移,直到完全推出符号图像为止。
最终检测完四条边就会得到符号图像的大致位置
2、找寻符号图像四个顶点

大致范围确定以后就需要确定符号图像四个角的顶点,有了四个角的顶点就可以进行透视变换,符号码图像也就能够取出。zxing中首先在大检测框的四个角用斜45度的直线去检测,如下图所示:

按照图中四个角的箭头所示方向进行扫描,检测到第一个黑色的点就返回。如果在线上没有检测到黑点,就将扫描线向对角线推进。如此就能找到四个角的顶点。
3、确定定位符
DataMatrix的定位符是在符号图像边缘的一圈成两个L形,一个L是实线,一个L是虚线
搜索的方法就是沿4条边的直线进行黑白变换次数的检测
这里画直线的方法是使用了bresenham算法(http://zh.wikipedia.org/wiki/Bresenham%E7%9B%B4%E7%B7%9A%E6%BC%94%E7%AE%97%E6%B3%95),该算法在求直线各点的过程中全部以整数来运算,因而大幅度提升计算速度。
黑白变换次数少的就是实线的边,多的就是虚线的边,再去找两个L形的交点,就确定了左下角和右上角这两点,然后再经过两点间距离的比较确定出四个顶点。
4、计算纬度并确定符号形状
纬度就是符号的一边上有多少个模块,计算方法就是去找虚线定位符那一边有多少次黑白变换(DataMatrix的纬度都是偶数,所以要进行误差修正)。纬度计算出来了就可以知道每个模块的宽度,再由此就可以计算出四条边分别有多少个模块。这样就可以计算出符号的长宽比,就能够确定是长方形还是正方形。
最后,就和QR码相同,使用SampleGrid进行透视变换和采样变换,将原始图像中的符号图像纠正、变换为我们解码需要的规则的,以模块为单位的符号矩阵。
 

DataMatrix二维条码源码分析检测识别图像位置的更多相关文章

  1. Java 序列化和反序列化(二)Serializable 源码分析 - 1

    目录 Java 序列化和反序列化(二)Serializable 源码分析 - 1 1. Java 序列化接口 2. ObjectOutputStream 源码分析 2.1 ObjectOutputSt ...

  2. [UGUI]图文混排(二):Text源码分析

    UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...

  3. QR二维码生成器源码(中间可插入小图片)

    二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维码. 我之前做了一个使用google开源项目zxing实现二维码.一维码编码解码的 ...

  4. 跟厂长学PHP7内核(二):源码分析的环境与工具

    本文主要介绍分析源码的方式,其中包含环境的搭建.分析工具的安装以及源码调试的基本操作. 一.工具清单 PHP7.0.12 GDB CLion 二.源码下载及安装 $ wget http://php.n ...

  5. adaptiveThreshold自适应二值化源码分析

    自适应二值化介绍: 二值化算法是用输入像素的值I与一个值C来比较,根据比较结果确定输出值. 自适应二值化的每一个像素的比较值C都不同,比较值C由这个像素为中心的一个块范围计算在减去差值delta得到. ...

  6. Flink源码阅读(二)——checkpoint源码分析

    前言 在Flink原理——容错机制一文中,已对checkpoint的机制有了较为基础的介绍,本文着重从源码方面去分析checkpoint的过程.当然本文只是分析做checkpoint的调度过程,只是尽 ...

  7. [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)

    接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数: int rte_eal_init(int argc, char **ar ...

  8. keystone系列二:keystone源码分析

    六 keystone架构 6.1 Keystone API Keystone API与Openstack其他服务的API类似,也是基于ReSTFul HTTP实现的. Keystone API划分为A ...

  9. spring源码分析 contextConfigLocation属性的位置

    <context-param> <param-name>contextConfigLocation</param-name> <param-value> ...

随机推荐

  1. 掌握Git撤销操作,随心所欲控制文件状态

    本文主要讨论和撤销有关的 git 操作.目的是让读者在遇到关于撤销问题时能够方便迅速对照执行解决问题,而不用去翻阅参数繁多的 git 使用说明. 一开始你只需了解大致功能即可,不必记住所有命令和具体参 ...

  2. [QT]数据库SQLITE使用错误记录

    1.仿照创建数据库的例程编写代码,出现以下问题: ① 创建QSqlQuery query;   注意:这里没有将 query 与 QSqlSatabase db, 关联,正确的应该是 : QSqlQu ...

  3. 【javascript】js处理字符串

    javascript常用方法锦集: 处理字符串 在Javascript除了使用数组和对象 String.replace(regexp | replaceThis,replaceWith |callba ...

  4. Python IDE in Sublime

    (最近换了电脑,然后忘了把 ST 的配置搬过来,所以重新折腾了一遍 Sublime 中的 Python 环境配置) 以下插件均通过 Package Control 安装. SublimeREPL 快捷 ...

  5. BZOJ4236 JOIOJI 【map】

    BZOJ4236 JOIOJI Description JOIOJI桑是JOI君的叔叔.“JOIOJI”这个名字是由“J.O.I”三个字母各两个构成的. 最近,JOIOJI桑有了一个孩子.JOIOJI ...

  6. 神器如 dnSpy,无需源码也能修改 .NET 程序

    dnSpy 是 0xd4d 开发的 .NET 程序调试神器. 说它是神器真的毫不为过!它能在完全没有源码的情况下即时调试程序,甚至还能修改程序!本文讲向大家介绍如何使用 dnSpy 修改 .NET 程 ...

  7. NSURLSession学习笔记(二)Session Task

    Session Task分为三种Data Task,Upload Task,Download Task.毫无疑问,Session Task是整个NSURLSession架构的核心目标. 下面写了一个简 ...

  8. cannot find lstdc++

    centos下编译grpc-java时遇到的问题,google了一下 : sudo yum install libstdc++-static

  9. 《DSP using MATLAB》示例Example 6.27

    代码: % r = 0.9; theta = (pi/180)*[-55:5:-35, 35:5:55]'; p = r*exp(j*theta); a = poly(p); b = 1; w = [ ...

  10. 新版eclipse编写Android 时常常报的错误 -support-v7

    一..和以往一样新建完一个Android项目之后.会报android.support.v4.. . . 或者V7找不到的错误.   这是由于这两个包在还有一个附带的项目(android-support ...