zoukankan      html  css  js  c++  java
  • Atitit java 二维码识别 图片识别

    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://blog.csdn.net/attilax
    Atiend

  • 相关阅读:
    element-ui表格数据为空及数据使用html包裹的实现
    Vue 生命周期深入
    element-ui使用Radio单选表格行
    跨浏览器事件封装
    fontsize.js
    js使用Canvas对象绘制圆环
    银行卡信息生成
    数组中对象的去重
    es6冻结对象及其属性
    clip属性
  • 原文地址:https://www.cnblogs.com/attilax/p/15198361.html
Copyright © 2011-2022 走看看