发布时间: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. 类的静态方法@staticmethod

    静态方法 @staticmethod 静态方法是定义在类内部的函数,此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同,不需要传入se ...

  2. phpcms打印数据

    <?php echo '<pre>'; var_dump($data); echo '</pre>'; ?>

  3. ranch分析学习(三)

    接着上一篇继续研究 上一篇结尾的时候,我们谈到了连接,监听两个监督树,今天我们就来看看这两个监督树和他们的工作者都是干什么的,怎么实现的.文件编号接上篇. 6. ranch_acceptors_sup ...

  4. BZOJ2761: [JLOI2011]不重复数字【set】【傻逼题】

    Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 ...

  5. BZOJ2160 拉拉队排练【Manacher】

    Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...

  6. BZOJ2049 SDOI2008 Cave 洞穴勘测 【LCT】

    BZOJ2049 SDOI2008 Cave 洞穴勘测 Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分 ...

  7. 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用

    在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法.不过产生 Bitmap 来源却非常多,比如屏幕截图. ...

  8. python 正则表达式字符说明

    . 元字符 说明 . 代表任意字符 | 逻辑或操作符 [ ] 匹配内部的任一字符或子表达式 [^] 对字符集和取非 - 定义一个区间 \ 对下一字符取非(通常是普通变特殊,特殊变普通) * 匹配前面的 ...

  9. Python3.x time模块

    python中,我们会用到很多和时间相关的操作.下面就来看看时间的模块的作用. 使用相应功能需要导入time模块 import time time模块方法: asctime(p_tuple=None) ...

  10. LeetCode Number of Atoms

    原题链接在这里:https://leetcode.com/problems/number-of-atoms/description/ 题目: Given a chemical formula (giv ...