发布时间: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. java 实现共享锁和排它锁

    一直对多线程有恐惧,在实现共享锁和排它锁之后,感觉好了很多. 共享锁    就是查询的时候,如果没有修改,可以支持多线程查询: 排它锁    就是修改的时候,锁定共享锁,停止查询,同时,锁定排它锁,只 ...

  2. ios 延迟调用 && UIImageView && UILabel && UISegmentedControl && UISwitch && UISlider

    // //  ViewController.m //  UI_Lesson3 // //  Created by archerzz on 15/8/13. //  Copyright (c) 2015 ...

  3. HDU - 6521 Party (SYSU校赛K题)(线段树)

    题目链接 题意:n个人排成一列,一开始他们互不认识,每次选[l,r]上的人开party,使他们互相认识,求出每次party之后新互相认识的人的对数. 思路:把“互相认识”变成单向连边,只考虑左边的人对 ...

  4. java运行jar命令提示没有主清单属性和找不到主类

    推荐一个java运行jar命令提示没有主清单属性的百度经验的链接:https://jingyan.baidu.com/article/db55b60990f6084ba30a2fb8.html jav ...

  5. Quartz 2D编程指南(7) - 阴影(Shadows)

    阴影是绘制在一个图形对象下的且有一定偏移的图片,它用于模拟光源照射到图形对象上所形成的阴影效果,如果7-1所示.文本也可以有阴影.阴影可以让一幅图像看上去是立体的或者是浮动的. 阴影有三个属性: 1. ...

  6. 【requirejs】JS模块化工具requirejs教程

    初识requirejs 随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作.模块复用.单元 ...

  7. python 中的异常处理

    refer to: http://www.runoob.com/python/python-exceptions.html http://www.pythondoc.com/pythontutoria ...

  8. linux各个文件作用

    linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...

  9. JS和C#对Json的操作

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式.博主记得几年前在华为外包项目中有一个和Android应用交互的需求,Andr ...

  10. 如何使用 nslookup 查域名的 ttl

    如何使用 nslookup 查域名的 ttl nslookup 经常用,但是最近才使用到查 ttl 的信息. 域名的 ttl 也是网站优化的一个重要参数. nslookup -d www.fastad ...