发布时间: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. 添加dom节点及优化

    创建并添加dom加点如何进行优化? 1.使用文档片(DocumentFragment) 可以理解为"仓库",用来保存将来可能会添加到DOM中的节点: var fragment = ...

  2. 微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的

    一次我走到了弱网环境中,意外地发现浏览器打开了 http://www.msftconnecttest.com/redirect 网址,随后右下角的网络图标出现了一枚“感叹号”.   吹水的推断 从直观 ...

  3. 强大的Core Image(教你做自己的美图秀秀))

    iOS5新特性:强大的Core Image(教你做自己的美图秀秀))       iOS5给我们带来了很多很好很强大的功能和API.Core Image就是其中之一,它使我们很容易就能处理图片的各种效 ...

  4. 使用distillery 实现版本的动态升级&& 动态降级

    备注: distillery  使用很棒的elixir 打包构建工具,下面演示的是升级以及降级   1. 参考项目 https://github.com/rongfengliang/phoenix-r ...

  5. web 前端 html

    1,什么是web 在网络中,大量的数据需要有一个载体,而很多人都能够访问这个载体,利用浏览器的这个窗口链接一个有一个载体,这个载体就是网站也就是web的前身. 1,web标准:结构标准,表现标准,行为 ...

  6. display的flex属性使用详解

    flex的兼容性在pc端还算阔以,但是在移动端,那就呵呵了.今天我们只是学习学习,忽略一些不重要的东西. 首先flex的使用需要有一个父容器,父容器中有几个items. 父容器:container 属 ...

  7. 解决Oracle的http://localhost:1158/em页面打不开的问题

    https://localhost:1158/em 无法显示页面,在网上查阅资料以后发现这个页面时由服务:OracleDBConsoleoracl控制的,所以到管理界面打开服务:OracleDBCon ...

  8. sqlplus连接的三种方式

    sys用户在cmd下以DBA身份登陆: sqlplus /nolog      --运行sqlplus命令,进入sqlplus环境.其中/nolog是不登陆到数据库服务器的意思,如果没有/nolog参 ...

  9. java根据特定密钥对字符串进行加解密

    package com.test; import java.io.IOException; import java.security.SecureRandom; import javax.crypto ...

  10. java中Mongo

    1.  query.fields().include("idfa").include("imei").include("id").inclu ...