Atitit java 二维码识别 图片识别

1.1. 解码1
1.2. 首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。1
1.3. 二维码的样例:2
1.4. 定位图案2
1.5. 数据编码3
1.6. 错误修正容量L水平7%的字码可被修正M水平15%的字码可被修正Q水平25%的字码可被修正H水平30%的字码可被修正3
1.7. QR是怎么对数据码加上纠错码的?3
1.8. 画二维码图4
1.9. 简要的编码过程:数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,7
1.10. qr长度容量7

1.1.解码
编码lib:Qrcode_swetake.jar   (官网介绍-- http://www.swetake.com/qr/index-e.html)             
解码lib:qrcode.jar                 (官网介绍-- http://sourceforge.jp/projects/qrcode/)

1.2.首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。
Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。

    /**
     * @param args the command line arguments
     */ 
    public static void main(String[] args) { 
        QRCodeDecoderHandler handler = new QRCodeDecoderHandler(); 
        String imgPath = "c:\\3bf33a87e950352a5936aa0a5543fbf2b2118b59.jpg"; 
        String decoderContent = handler.decoderQRCode(imgPath,"gbk"); 
        System.out.println("解析结果如下:"); 
        System.out.println(decoderContent); 
        System.out.println("========decoder success  !!!"); 
    } 
1.3. 二维码的样例:

 
1.4.定位图案
Position Detection Pattern是定位图案,用于标记二维码的矩形大小。这三个定位图案有白边叫Separators for Postion Detection Patterns。之所以三个而不是四个意思就是三个就可以标识一个矩形了。
Timing Patterns也是用于定位的。原因是二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪了。
Alignment Patterns 只有Version 2以上(包括Version2)的二维码需要这个东东,同样是为了定位用的。

功能性数据
Format Information 存在于所有的尺寸中,用于存放一些格式化数据的。
Version Information 在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。
数据码和纠错码
除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。
1.5.数据编码
我们先来说说数据编码。QR码支持如下的编码:数字,字符,byte

1.6.错误修正容量L水平7%的字码可被修正M水平15%的字码可被修正Q水平25%的字码可被修正H水平30%的字码可被修正

1.7.QR是怎么对数据码加上纠错码的?
首先,我们需要对数据码进行分组,也就是分成不同的Block,然后对各个Block进行纠错编码,对于如何分组,我们可以查看QR Code Spec的第33页到44页的Table-13到Table-22的定义表。注意最后两列:

1.8.画二维码图
Position Detection Pattern
首先,先把Position Detection图案画在三个角上。

1.8.1.1.1.Alignment Pattern
然后,再把Alignment图案画上

关于Ali
1.8.1.1.2.Timing Pattern
接下来是Timing Pattern的线(这个不用多说了)

1.8.1.1.3.Format Information
再接下来是Formation Information,下图中的蓝色部分。

Format Information是一个15个bits的信息,每一个bit的位置如下图所示:(注意图中的Dark Module,那是永远出现的)

这15个bits中包括:
5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask
10个纠错bits。主要通过BCH Code来计算
然后15个bits还要与101010000010010做XOR操作。这样就保证不会因为我们选用了00的纠错级别,以及000的Mask,从重造
1.8.1.1.4.Version Information
再接下来是Version Information(版本7以后需要这个编码),下图中的蓝色部分。

Version Information一共是18个bits,其中包括6个bits的版本号以及12个bits的纠错码,下面是一个示例:
数据和数据纠错码
然后是填接我们的最终编码,最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。

掩码图案
这样下来,我们的图就填好了,但是,也许那些点并不均衡,所以,我们还要做Masking操作(靠,还嫌不复杂)QR的Spec中说了,QR有8个 Mask你可以使用,如下所示:其中,各个mask的公式在各个图下面。所谓mask,说白了,就是和上面生成的图做XOR操作。Mask只会和数据区进 行XOR,不会影响功能区。

1.9.简要的编码过程:数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,
在规格一定的条件下,纠错等级越高其真实数据的容量越小。数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。
数据可以按照一种模式进行编码,以便进行更高效的解码,例如:对数据:01234567编码(版本1-H),1)分组:012 345 672)转成二进制:012→0000001100               345→0101011001                 67 →10000113)转成序列:0000001100 0101011001 10000114)字符数 转成二进制:8→00000010005)加入模式指示符(上图数字)0001:0001 0000001000 0000001100 0101011001 1000011对于字母、中文、日文等只是分组的方式、模式等内容有所区别。基本方法是一致的
1.10.qr长度容量
Cn utf8 984 
Byte 2953byte 
Ch 4296   num 7089

1.11.二维码的解析

1、定位图形:首先寻找探测图形,就是二维码上的三个方块。这三个方块的作用就是不管在哪个方向扫描图形,都可以扫到,不信可以将手机翻转测试一下。在通过二维码上的定位图形和分隔符确定二维码信息的图像。定位图形确定二维码符号中模块的坐标,二维码中的模块都是固定的,包括校正图形,版本信息,数据和纠错码。分隔符呢,就是将探测图形与二维码信息图像分开。

2、灰度化二维码信息像素:手机拍到的图像都是彩色的,所以拍摄到二维码也不列外,它也是彩色的,只不过除了黑白,其他颜色非常浅而已。灰度化是指通过颜色的深浅来识别二维码,就是说颜色深的按深灰处理,浅色的按浅灰处理,去掉其他颜色。

3、去掉二维码信息像素的噪点:相机的传感器在把光线作为接收信号和输出过程产生的粗糙像素,这些粗糙的像素是照片中不应该出现的干扰因素。噪点就是指这些粗糙的像素。

4、二值化二维码信息像素:二值化是说将图像上像素灰度值设置为0或者255,也就是变成只有黑白两种颜色。第一步已经灰度化变成只有深灰和浅灰两种颜色,现在二值化是将深灰变成黑色,浅灰变成白色。为什么变成黑白色呢。因为二维码图像其实是由二进制的0或者1组成,0代表白色,1代表黑色。二维码在二值化时会将二维码图像变成只有黑白色的条码,然后根据解析公式什么的(因为像素是0-255之间,要全部转变成0或者255,估计得经过一些计算,然后0就是0,255变为1)转化成二进制信息。

5、二维码译码和纠错:将得到的二进制信息进行译码和纠错。得到的二进制信息是版本格式信息、数据和纠错码经过一定的编码方式生成的,所以译码是对版本格式信息,数据和纠错码进行解码和对比。纠错是和译码同时进行的,将数据进行纠错。

Atitit.二维码功能的设计实践 attilax 总结 - attilaxAti - 博客园.html
atitit.二维码生成总结java zxing - attilax的专栏 - 博客频道 - CSDN.NET.html
 
Java实现二维码QRCode的编码和解码 - 记忆是夏天 - 博客频道 - CSDN.NET.html
二维码的生成细节和原理 - 51CTO.COM.html
二维码原理介绍_百度经验.html
二维码的生成和解析原理 - kelindame的专栏 - 博客频道 - CSDN.NET.html
二维码的工作原理_百度知道.html

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 
汉字名:艾提拉(艾龙),   EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend

Atitit java 二维码识别 图片识别的更多相关文章

  1. Atitit zxing二维码qr码识别解析

    Atitit zxing二维码qr码识别解析 1.1. qr码识别解析 by zxing1 1.2. 解码lib:qrcode.jar  2 1.3. atitit.二维码生成总结java zxing ...

  2. Android 二维码 生成和识别(附Demo源码)

    今天讲一下目前移动领域很常用的技术——二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS. Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技 ...

  3. Android 二维码 生成和识别(转)

    原博客地址 :http://www.cnblogs.com/weixing/archive/2013/08/28/3287120.html 还有几个写的也可以参考一下:http://www.itnos ...

  4. 【转】Android 二维码 生成和识别(附Demo源码)--不错

    原文网址:http://www.cnblogs.com/mythou/p/3280023.html 今天讲一下目前移动领域很常用的技术——二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS. ...

  5. 玩转Android之二维码生成与识别

    二维码,我们也称作QRCode,QR表示quick response即快速响应,在很多App中我们都能见到二维码的身影,最常见的莫过于微信了.那么今天我们就来看看怎么样在我们自己的App中集成二维码的 ...

  6. Python 实现二维码生成和识别

    今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...

  7. java 二维码生成(可带图片)springboot版

    本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...

  8. Atitit 常用二维码对比(QR、PDF417、DM、汉信码 Aztec code maxicode

    Atitit 常用二维码对比(QR.PDF417.DM.汉信码 Aztec code maxicode DM码则更"小",可在仅仅25mm²的面积上编码30个数字.但也就是因为太小 ...

  9. Java 二维码--转载

    周末试用下Android手机的二维码扫描软件,扫描了下火车票.名片等等,觉得非常不错很有意思的.当然Java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机 ...

随机推荐

  1. js性能优化

    使用局部变量(尽量缩短作用域链)JavaScript引擎对变量的解析时间跟作用域链的深度有关.局部变量由于处于链尾,存取速度是最快的,因此,一个好的经验是:任何非局部变量使用超过一次时,请使用局部变量 ...

  2. linux性能检测工具

  3. 在JAVA中把JSON数据格式化输出到控制台

    public class ForMatJSONStr { public static void main(String[] args) { String jsonStr = "{\" ...

  4. zmq中zmq_poll()函数介绍

    功能: 查看指定的多个socket上哪些socket发生了指定的事件, 事件有: ZMQ_POLLIN: 有消息到来 ZMQ_POLLOUT: 当前无阻塞可以发送消息 ZMQ_POLLERR: 只对标 ...

  5. select 取的是session里面的值时

    原来是写了一个select标签,然后用js循环取出来,发现问题是本来嵌在页面右边的页面整个弹出来, 后来改成html:optionsCollection就好了: 效果图:

  6. Android学习地址

    Google Android官方培训课程中文版http://hukai.me/android-training-course-in-chinese/

  7. CentOS7 服务器 JDK+TOMCAT+MYSQL+redis 安装日志

    防火墙配置(参考 CentOS7安装iptables防火墙) 检查是否安装iptables #先检查是否安装了iptables service iptables status #安装iptables ...

  8. Silverlight5中横向显示ListBox

    备忘 <ListBox x:Name="Cpbrow" HorizontalAlignment="Left" Height="153" ...

  9. fallacies of distributed computing

    The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doe ...

  10. cocoapods安装以及使用,安装过程中ruby版本过低

    cocoapods安装以及使用,安装过程中ruby版本过低 字数473 阅读103 评论1 喜欢2 1.打开终端 2.移除现有 Ruby 默认源 $ gem sources --remove http ...