qrcode_qrcode 失败 - CSDN
精华内容
参与话题
  • QRCode二维码总结

    万次阅读 多人点赞 2014-12-23 10:23:53
    QR码生成原理-QR Code(ISO 18004)编码方式 一、什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了 ...

     

    QR码生成原理-QR Code(ISO 18004)编码方式

    一、什么是QR码

    QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了


    1. 位置探测图形、位置探测图形分隔符:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;这些黑白间隔的矩形块很容易进行图像处理的检测。 

    2. 校正图形:根据尺寸的不同,矫正图形的个数也不同。矫正图形主要用于QR码形状的矫正,尤其是当QR码印刷在不平坦的面上,或者拍照时候发生畸变等。

    3. 定位图形:这些小的黑白相间的格子就好像坐标轴,在二维码上定义了网格。

    4. 格式信息:表示该二维码的纠错级别,分为L、M、Q、H; 

     5. 数据区域:使用黑白的二进制网格编码内容。8个格子可以编码一个字节。

    6. 版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。 

     7. 纠错码字:用于修正二维码损坏带来的错误。

    2.2 QR二维码的识别原理 

     2.2.1定位  手机拍摄QR 码图像时,可能会同时采集到条码周围其他的图像。这些干扰图像会增加图像处理的复杂度,因此,可以把这些没必要的干扰图像通过裁切的方式去除。校正后,直接对正方形A'B'C'D'外的区域裁切,就可以去除其余背景。 QR 码符号中有3 个位置探测图形,分别位于符号图像4 个角中的3 个角,每个  4  位置探测图像都是由固定深浅颜色的模块组成。模块深浅颜色顺序为深色—浅色—深色—浅色—深色,各元素宽度的比例为1∶ 1∶ 3∶ 1∶ 1(如下图所示)。

     

    即使图像有旋转,位置探测图像的模块颜色顺序和宽度比例也不变。对二值化后的图像按行、列分别逐点扫描,把同一灰度级的相邻像素记录为线段。如果有5 段线段的长度比例符合1∶ 1∶ 3 ∶ 1 ∶ 1,且深浅颜色顺序为深—浅—深—浅—深,则记录该线段。扫描完后,把行相邻的线段分为1 组,去除与所有线段都不相邻的行线段( 可能是随机的干扰线段) 。同样处理列线段,把行线段组和列线段组中相互交叉的组分类,求出交叉的行、列线段组的中心点,即为位置探测图形的中心。      2.2.2 预处理  基本原理:QR 码作为手机二维码,其应用模式如下图所示。手机等智能设备通过摄像头采集带有条码符号的图像,对图像进行灰度化、二值化、旋转校正等预处理,进行条码检测。如果检测到非QR 码,则重新采集; 如果是QR 码,则进行图像信息的取样。用Reed - Solomon 码的译码算法对取到的数据进行纠错译码,统计出现的错误数量。如果错误数量超出纠错容量,则纠错译码失败,重新采集图像; 如果可以正确进行纠错译码,则把纠错后的信息进行各种数据模式下的译码,恢复出编码信息,继而根据应用模式进行信息输出、发送短信或网址跳转等后续处理。

    二、QR码的特点

    说到QR码的特点:

    一)是高速读取(QR就是取自“Quick Response”的首字母),对读取速度的体验源自于我手机上的一个软件,象上面贴出的码图,通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求;

    二)是高容量、高密度;理论上内容经过压缩处理后可以存7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;

    三)是支持纠错处理;纠错处理相对复杂,目前我还没有深入了解,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是:

    level L : 最大 7% 的错误能够被纠正;

    level M : 最大 15% 的错误能够被纠正;

    level Q : 最大 25% 的错误能够被纠正;

    level H : 最大 30% 的错误能够被纠正;

    四)是结构化;看似无规则的图形,其实对区域有严格的定义,下图就是一个模式2、版本1的QR图结构(关于QR码的"模式"、"版本"将在后面进行介绍):

    QR码生成原理-QR <wbr>Code(ISO <wbr>18004)编码方式

    在上图21*21的矩阵中,黑白的区域在QR码规范中被指定为固定的位置,称为寻像图形(finder pattern) 和 定位图形(timing pattern)。寻像图形和定位图形用来帮助解码程序确定图形中具体符号的坐标。

    黄色的区域用来保存被编码的数据内容以及纠错信息码。

    蓝色的区域,用来标识纠错的级别(也就是Level L到Level H)和所谓的"Mask pattern",这个区域被称为“格式化信息”(format information)。

    五)是扩展能力。QR码的Structure Append特点,使一个QR码可以分解成多个QR码,反之,也可以将多个QR码的数据组合到一个QR码中来:

    QR码生成原理-QR <wbr>Code(ISO <wbr>18004)编码方式

     

    三、QR码的模式和版本

    前面提到过QR码的模式(Model)和版本(Version)。QR码分为Model1和Model2两种模式,Model1是对QR的初始定义,Model2是对Model1的扩展,目前使用较为普遍的是Model2,本文的所有说明也仅用于Model2。

    QR图的大小(size)被定义为版本(Version),版本号从1到40。版本1就是一个21*21的矩阵,每增加一个版本号,矩阵的大小就增 加4个模块(Module),因此,版本40就是一个177*177的矩阵。(版本越高,意味着存储的内容越多,纠错能力也越强)。

     

    三、QR码支持的编码内容

    QR码支持编码的内容包括纯数字、数字和字符混合编码、8位字节码和包含汉字在内的多字节字符。其中:

    数字:每三个为一组压缩成10bit。

    字母数字混合:每两个为一组,压缩成11bit。

    8bit字节数据:无压缩直接保存。

    多字节字符:每一个字符被压缩成13bit。

     

    QR码编码原理(编码)

     

    编码就是把常见的数字、字符等转换成QR码的方法。说具体的编码之前,先说一下QR码的最大容量问题。

    一、最大容量

    QR码的最大容量取决于选择的版本、纠错级别和编码模式(Mode:数字、字符、多字节字符等)。以版本1、纠错级别为Level Q的QR码为例,可以存储27个纯数字,或17个字母数字混合字符或11个8bit字节数据。如果要存储同样多的内容同时提高纠错级别,则需要采用更高的版本。版本1~9 数据容量、纠错码容量对照如下表:

    版本

    (error correcting level)

    (count of data code words)

    count of EC code words

    (numeric)

    (alphanumeric)

    8bit

    1

    L

    19

    7

    41

    25

    17

    M

    16

    10

    34

    20

    14

    Q

    13

    13

    27

    16

    11

    H

    9

    17

    17

    10

    7

    2

    L

    34

    10

    77

    47

    32

    M

    28

    16

    63

    38

    26

    Q

    22

    22

    48

    29

    20

    H

    16

    28

    34

    20

    14

    3

    L

    55

    15

    127

    77

    53

    M

    44

    26

    101

    61

    42

    Q

    34

    36

    77

    47

    32

    H

    26

    44

    58

    35

    24

    4

    L

    80

    20

    187

    114

    78

    M

    64

    36

    149

    90

    62

    Q

    48

    52

    111

    67

    46

    H

    36

    64

    82

    50

    34

    5

    L

    108

    26

    255

    154

    106

    M

    86

    48

    202

    122

    84

    Q

    62

    72

    144

    87

    60

    H

    46

    88

    106

    64

    44

    6

    L

    136

    36

    322

    195

    134

    M

    108

    64

    255

    154

    106

    Q

    76

    96

    175

    108

    74

    H

    60

    112

    139

    84

    58

    7

    L

    156

    40

    370

    224

    154

    M

    124

    72

    293

    178

    122

    Q

    88

    108

    207

    125

    86

    H

    66

    130

    154

    93

    64

    8

    L

    194

    48

    461

    279

    192

    M

    154

    88

    365

    221

    152

    Q

    110

    132

    259

    157

    108

    H

    86

    156

    202

    122

    84

    9

    L

    232

    60

    552

    335

    230

    M

    182

    110

    432

    262

    180

    Q

    132

    160

    312

    189

    130

    H

    100

    192

    235

    143

    98

    如果要了解更详细的QR码容量信息,可以到电装的网站去看看:

    http://www.denso-wave.com/qrcode/vertable1-e.html

     

    下面,就举例说明将“ABCDE123”转换成为版本1、Level H的QR码转换方法。

    二、模式标识符(Mode Indicator)

    QR码的模式(Mode)就是前文提到的数字、字符、8bit 字节码、多字节码等。对于不同的模式,都有对应的模式标识符(Mode Indicator)来帮助解码程序进行匹配,模式标识符是4bit的二进制数:

    1、数字模式(numeric mode ): 0001

    2、混合字符模式(alphanumeric mode) : 0010

    3、8bit byte mode: 0100

    4、日本汉字(KANJI mode) : 1000

    5、中国汉字(GB2312):1101

    由于示例文本串是混合字符,因此将选择alphanumeric mode,其标识码为:0010

    三、文本串计数标识符(Character count indicator)

    文本串计数标识符用来存储源内容字符串的长度,在版本1-9的QR码中,文本串长度标识符自身的长度被定义为:

    数字 : 10bit

    混合字符 : 9bit

    8bit 字节码 : 8bit

    多字节码 : 8bit

    在本例中,源文本串的长度为8个字符,混合字符的长度为9bit,因此将字符个数8编码为9位二进制表示:000001000

    加上混合字符模式标识码,总的编码为0010 000001000

    四、数据内容编码

     1、数字模式下的编码

    在数字模式下,数据被限制为3个数字一段,分成若干段。如:"123456" 将分成"123" 和 "456",分别被编码成10bit的二进制数。“123”的10bit二进制表示法为:0001111011,实际上就是二进制的123。

    当数据的长度不足3个数字时,如果只有1个数字则用4bit,如果有2个数字就用7个bit来表示。
    如:"9876"被分成"987"和"6"两段,因此被表示为"1111011011 0110"。

    2、混合字符模式下的编码

    混合字符模式编码,其字符对照表如下:

    0

     0

     

     A

     10

     

     K

     20

     

     U

     30

     

     +

     40

    1

    1

     

    B

    11

     

    L

    21

     

    V

    31

     

    -

    41

    2

    2

     

    C

    12

     

    M

    22

     

    W

    32

     

    .

    42

    3

    3

     

    D

    13

     

    N

    23

     

    X

    33

     

    /

    43

    4

    4

     

    E

    14

     

    O

    24

     

    Y

    34

     

    :

    44

    5

    5

     

    F

    15

     

    P

    25

     

    Z

    35

    6

    6

     

    G

    16

     

    Q

    26

     

    [sp]

    36

    7

    7

     

    H

    17

     

    R

    27

     

    $

    37

    8

    8

     

    I

    18

     

    S

    28

     

    %

    38

    9

    9

     

    J

    19

     

    T

    29

     

    *

    3

     

    编码方式为:

    源码被分成两个字符一段,如下所示,每段的第一个字符乘上45,再用第二个数字相加。因此每段变成了11bit的2进制码,如果字符个数只有1个,则用6bit表示。

     

    示例:

     

     

     

    "AB"

    "CD"

    "E1"

    "23"

     

     

    45*10+11

    45*12+13

    45*14+1

    45*2+3

     

     

    461

    553

    631

    93

    0010

    000001000

    00111001101

    01000101001

    01001110111

    00001011101

     

    3、8bit字节数据不经编码转换直接保存。

    五、编码终止符(Terminator)

    如果编码后的字符长度不足当前版本和纠错级别所存储的容量,则在后续补"0000",如果容量已满则无需添加终止符。此时得到的编码串为:

    0010 000001000 00111001101 01000101001 01001110111 00001011101 0000

    六、编成8bit码字(Code words)

    将以上的编码再按8bit一组,形成码字(code words):

     00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000

    如果尾部数据不足8bit,则在尾部充0:

    00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000

    如果编码后的数据不足版本及纠错级别的最大容量,则在尾部补充 "11101100" 和"00010001",直到全部填满。最后,版本1、Level H下的"ABCDE123" 的QR码是:

    00100000 01000001 11001101 01000101 00101001 11011100 00101110 10000000 11101100

    十进制表示法为:

    32 65 205 69 41 220 46 128 236

     

    QR码编码原理(日本汉字和中文编码)

     

    一、日本汉字(KANJI)是两个字节表示的字符码,编码的方式是将其转换为13字节的二进制码制。

    转换步骤为:

    1、对于JIS值为8140(hex) 到9FFC(hex)之间字符:

    a)将待转换的JIS值减去8140(hex);

    b)将高位字节乘以C0(hex);

    c)将b)步骤生成的数据加上低位字节;

    d)将结果转换为13位二进制串。

    2、对于JIS值为E040(hex)到EBBF(hex)之间的字符:

    a)将待转换的JIS值减去C140(hex);

    b)将高位字节乘以C0(hex);

    c)将b)步骤生成的数据加上低位字节;

    d)将结果转换为13位二进制串。

     

    二、中文汉字的与日文汉字转换步骤相似:

    1、对于第一字节为0xA1~0xAA之间,第二字节在0xA1~0xFE之间字符:

    a)第一字节减去0xA1;

    b)上一步结果乘以0x60;

    c)第二字节减去0xA1;

    d)将b)步骤的结果加上c步骤的结果;

    e)将结果转换为13位二进制串。

    1、对于第一字节为0xB0~0xFA之间,第二字节在0xA1~0xFE之间字符:

    a)第一字节减去0xA6;

    b)上一步结果乘以0x60;

    c)第二字节减去0xA1;

    d)将b)步骤的结果加上c步骤的结果;

    e)将结果转换为13位二进制串。

     

    掩模

    众所周知,为了增加QR码阅读的可靠性,最好均衡地安排深色与浅色模块。应尽可能避免类似“位置探测图形”的位图1011101出现在符号的其他区域。

    为了满足上述条件,应按以下步骤进行掩模:

    1)掩模不用于功能图形;
    2)用多个矩阵图形连续地对已知的编码区域的模块图形(格式信息和版本信息除外)进行XOR操作。XOR操作将模块图形依次放在每个掩模图形上,并将对应于掩模图形的深色模块的模块取反(浅色变成深色,或相反);
    3)对每个结果图形的不合要求的部分记分,以评估这些结果;
    4)选择得分最低的图形。

    下表给出了掩模图形的参考(放置于格式信息中的二进制参考)和掩模图形生成的条件。掩模图形是通过将编码区域(不包括为格式信息和版本信息保留的部分)内那些条件为真的模块定义为深色而产生的。所示的条件中,i代表模块的行位置,j代表模块的列位置,(i,j)=(0,0)代表符号中左上角的位置。

    码中

    图1   掩模图形参考及条件

    QRCode

    图2   QRCode的八种掩模方案

    掩模

    图3  掩模结果(版本1符号的所有的掩模图形,用掩模图形参考000到111的掩模结果)。

    下图为掩模过程:

    二维

    图4  符号的掩模过程

    罚点记分:

    在依次用每一个掩模图形进行掩模操作之后,要通过对每一次如下情况的出现进行罚点记分,以便对每一个结果进行评估,分数越高,其结果越不可用。在下表中,N1到N4为对不好的特征所罚分数的权重(N1=3,N2=3,N3=40,N4=10),i为紧邻的颜色相同模块数大于5的次数,k为符号深色模块所占比率离50%的差距,步长为5%。虽然掩模操作仅对编码区域进行,不包括格式信息,但评价是对整个符号进行的。

    最终,应选择掩模结果中罚分最低的掩模图形用于符号掩模。

    二维

    图5   罚点记分表

    展开全文
  • qrcode的使用方法

    万次阅读 2018-07-18 00:28:33
    qrcode.js是一个用于生成二维码图片的插件。 使用时只需写两个函数即可,首先是: function toUtf8(str) { var out, i, len, c; out = ""; len = str.length; for(i = 0; i &lt; len; i++)...

    qrcode.js是一个用于生成二维码图片的插件

    使用时只需写两个函数即可,首先是:

    function toUtf8(str) {   
        var out, i, len, c;   
        out = "";   
        len = str.length;   
        for(i = 0; i < len; i++) {   
        	c = str.charCodeAt(i);   
        	if ((c >= 0x0001) && (c <= 0x007F)) {   
            	out += str.charAt(i);   
        	} else if (c > 0x07FF) {   
            	out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));   
            	out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));   
            	out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));   
        	} else {   
            	out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));   
            	out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));   
        	}   
        }   
        return out;   
    }

    这段函数大概是生成二维码的一段代码,具体实现方法暂且未知,等我弄明白之后会重新编辑这篇文章。

    然后是设置你想生成的二维码的一些参数:

    $("#code").qrcode({ //设置css
    	render: "table", //二维码的生成方式
    	width: 300, //生成二维码的宽度
    	height:300, //生成二维码的高度
    	text: str, //解析成二维码的连接
        correctLevel :3 //容错级别,默认为2,最高为3,为了让用户扫码最快,容错级别应当设为最低
    });

    最后生成的二维码效果如下:

     

     

    如果要和后台进行互动,那么就要使用ajax不断进行判断,看这个二维码什么时候被扫描到,如果被扫描到的话,可以自己设置一个状态向后台传递,通过更改这个状态来表示二维码已经被扫描,或者也可以通过二维码跳转到另一个页面,在另一个页面上与后台进行互动。不过需要注意的是,如果是本地(localhost)或者局域网的状态下,输入网址时需要使用自己当前电脑的ip地址和端口号。

    展开全文
  • Python二维码应用(一)QRcode二维码生成&识别

    万次阅读 多人点赞 2019-01-25 14:24:26
    基于Python的二维码实验一、机器视觉之QRcode二、基于Python的QRcodetest(一)配置环境(二)生成自己的二维码(三)识别二维码三、调用opencv库摄像头识别图像 一、机器视觉之QRcode 问:什么是QRcode呢? 答...

    一、机器视觉之QRcode

    问:什么是QRcode呢?
    答:二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它能将数字、英文字母、汉字、日文字母、特殊符号(如空格,%,/ 等)、二进制等信息记录到一个正方形的图片中。
    因此,在转换的过程中,离不开编码压缩方式。在许多种类的二维条码中,常用的码制有:Data Matrix,Maxi Code,Aztec,QR Code,Vericode,PDF417,Ultracode,Code 49,Code 16K等。
    二维码在现实生活中的应用越来与普遍,归功于 QR code 码制的流行。我们常说的二维码就是它,所以,二维码又被称为 QR code。
    QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
    我们的目的是要使用 Python 生成 QR 码,那我们需要先了解二维码(QR 码)的结构。根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:
    在这里插入图片描述
    二维码的绘制大概过程如下:
    在二维码的左上角、左下角、右上角绘制位置探测图形,位置探测图形一定是一个 7x7 的矩阵;
    (1)绘制校正图形,校正图形一定是一个 5x5 的矩阵;
    (2)绘制两条连接三个位置探测图形的定位图形;
    (3)在上述图片的基础上,继续绘制格式信息;
    (4)接着绘制版本信息;
    (5)填充数据码和纠错码到二维码图中;
    (6)最后绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积空白或黑块的情况,导致扫描识别十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。在这一步,我们可以将数据排列成各种图片。

    问:主要运用qrcode库文件、这是个什么东东呢?
    答: 这里给一篇博客有详细叙述:Python生成二维码

    开源库import qrcode具体使用方法:
    编码:

    #原始二维码编码
    import qrcode
    img = qrcode.make('helloworld')
    #带图片的编码方式
    qr = qrcode.QRCode(
        version=5,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=8,
        border=4)
    

    解码:

    #调用decode()的解码函数
    def decode_qr_code(code_img_path):
        if not os.path.exists(code_img_path):
            raise FileExistsError(code_img_path)
        # Here, set only recognize QR Code and ignore other type of code
        return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])
    

    二、基于Python的QRcodetest

    环境:python3.7+zbar+qrcode

    (一)配置环境

    打开cmd、pip分别安装以下库文件:(zxing也是一个强大的二维码开源库文件,建议安装)

    pip install opencv-python
    pip install numpy
    pip install pillow
    pip install myqr
    pip install qrcode
    pip install zxing
    

    tips:记得安装完成后,如果是eclipse要重新启动一次才能加载进来

    (二)生成自己的二维码

    1 MyQr制作gif二维码:

    同目录下放置一张gif格式图片
    在这里插入图片描述

    在这里插入图片描述 在这里插入图片描述

    源码:

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    from MyQR import myqr
    myqr.run(
        # 在命令后输入链接或者句子作为参数,然后在程序的当前目录中产生相应的二维码图片文件,默认命名为“qrcode.png”
        words='helloworld',
        version=1,  # 设置容错率为最高默认边长是取决于你输入的信息的长度和使用的纠错等级;而默认纠错等级是最高级的H
        level='H',  # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
        picture='test.gif',  # 用来将QR码图像与一张同目录下的图片相结合,产生一张黑白图片,格式可以是.jpg, .png, .bmp, .gif
        colorized=True,  # 可以使产生的图片由黑白(False)变为彩色(True)的
        contrast=1.0,  # 用以调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0。
        brightness=1.0,  # 用来调节图片的亮度
    )
    

    2 qrcode制作带图片的二维码:
    新建工程QRcodeTest;新建PyDev包,命名为MakeMyQRcode:
    在这里插入图片描述

    因为我想做出一个漂亮简单一点的code,所以首先在目录文件下贴入一张图片,命名为QRcodeCenter,like this(左:成果图,右:准备中心图片):
    在这里插入图片描述 在这里插入图片描述

    源码:

    '''
    ==============================
    test1:生成二维码及查看
    ==============================
    '''
    from PIL import Image
    import qrcode
    
    qr = qrcode.QRCode(
        version=5, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4)
    qr.add_data("这里是二维码信息!")
    qr.make(fit=True)
    
    img = qr.make_image()
    img = img.convert("RGBA")
    
    icon = Image.open("QRcodeCenter.jpg")  # 这里是二维码中心的图片
    
    img_w, img_h = img.size
    factor = 4
    size_w = int(img_w / factor)
    size_h = int(img_h / factor)
    
    icon_w, icon_h = icon.size
    if icon_w > size_w:
        icon_w = size_w
    if icon_h > size_h:
        icon_h = size_h
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
    
    w = int((img_w - icon_w) / 2)
    h = int((img_h - icon_h) / 2)
    icon = icon.convert("RGBA")
    img.paste(icon, (w, h), icon)
    img.show()   # 显示图片,可以通过save保存
    

    (三)识别二维码

    在工程QRcodeTest;新建PyDev包,命名为ScanQRcode:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述 在这里插入图片描述
    源码:

    # -*- coding:utf-8 -*-
    
    '''
    ====================================
    test2:生成二维码保存及对二维码解码输出
    ====================================
    '''
    import os
    import qrcode
    from PIL import Image
    from pyzbar import pyzbar
    
    
    def make_qr_code(content, save_path=None):
        qr_code_maker = qrcode.QRCode(version=5,
                                      error_correction=qrcode.constants.ERROR_CORRECT_M,
                                      box_size=8,
                                      border=4,
                                      )
        qr_code_maker.add_data(data=content)
        qr_code_maker.make(fit=True)
        img = qr_code_maker.make_image(fill_color="black", back_color="white")
        if save_path:
            img.save(save_path)
        else:
            img.show()  # 中间图不显示
    
    
    def make_qr_code_with_icon(content, icon_path, save_path=None):
        if not os.path.exists(icon_path):
            raise FileExistsError(icon_path)
    
        # First, generate an usual QR Code image
        qr_code_maker = qrcode.QRCode(version=5,
                                      error_correction=qrcode.constants.ERROR_CORRECT_H,
                                      box_size=8,
                                      border=4,
                                      )
        qr_code_maker.add_data(data=content)
        qr_code_maker.make(fit=True)
        qr_code_img = qr_code_maker.make_image(
            fill_color="black", back_color="white").convert('RGBA')
    
        # Second, load icon image and resize it
        icon_img = Image.open(icon_path)
        code_width, code_height = qr_code_img.size
        icon_img = icon_img.resize(
            (code_width // 4, code_height // 4), Image.ANTIALIAS)
    
        # Last, add the icon to original QR Code
        qr_code_img.paste(icon_img, (code_width * 3 // 8, code_width * 3 // 8))
    
        if save_path:
            qr_code_img.save(save_path)  # 保存二维码图片
            qr_code_img.show()  # 显示二维码图片
        else:
            print("save error!")
    
    
    def decode_qr_code(code_img_path):
        if not os.path.exists(code_img_path):
            raise FileExistsError(code_img_path)
    
        # Here, set only recognize QR Code and ignore other type of code
        return pyzbar.decode(Image.open(code_img_path), symbols=[pyzbar.ZBarSymbol.QRCODE])
    
    
    if __name__ == "__main__":
        print("============QRcodetest===============")
        print("         1、Make a QRcode            ")
        print("         2、Scan a QRcode            ")
        print("=====================================")
        print("1、请输入编码信息:")
        code_Data = input('>>:').strip()
        print("正在编码:")
        # ==生成带中心图片的二维码
        make_qr_code_with_icon(
            code_Data, "QRcodeCenter.jpg", "qrcode.png")  # 内容,center图片,生成二维码图片
        print("图片已保存,名称为:qrcode.png")
        results = decode_qr_code("qrcode.png")
        print("2、正在解码:")
        if len(results):
            print("解码结果是:")
            print(results[0].data.decode("utf-8"))
        else:
            print("Can not recognize.")
    

    三、调用opencv库摄像头识别图像

    (一)用opencv找出(条形码&二维码)位置

    opencv抠图教程
    按照教程一步步调试运行(这里用一张条形码和一张二维码进行测试):

    • QRcodetest项目下新建ScanQRcode.py
      在这里插入图片描述
    • 并保存两张图片在项目目录下:分别为qrcode.pngtest2.jpg
      在这里插入图片描述
      运行测试:(不支持二维码)
      qrcode.png:
      在这里插入图片描述
      test2.jpg:
      在这里插入图片描述
      遇到问题:
      都只识别了部分条码,抠图也不是很成功!而且不能识别二维码!
      在这里插入图片描述

    源码:

    # -*- coding: UTF-8 -*-
    '''
    ==============================
    test3:找出图片中的条形码或二维码
    (ps.仅识别条形码成功)
    ==============================
    '''
    import numpy as np
    import argparse
    import cv2
    
    print("请输入解码图片完整名称:")
    code_name = input('>>:').strip()
    print("正在识别:")
    #image = cv2.imread("test2.jpg")
    image = cv2.imread(code_name)
    # 灰度
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 使用opencv自带的Sobel算子进行过滤
    gradX = cv2.Sobel(gray, ddepth=cv2.cv2.CV_32F, dx=1, dy=0, ksize=-1)
    gradY = cv2.Sobel(gray, ddepth=cv2.cv2.CV_32F, dx=0, dy=1, ksize=-1)
    
    # 将过滤得到的X方向像素值减去Y方向的像素值
    gradient = cv2.subtract(gradX, gradY)
    # 先缩放元素再取绝对值,最后转换格式为8bit型
    gradient = cv2.convertScaleAbs(gradient)
    # 均值滤波取二值化
    blurred = cv2.blur(gradient, (9, 9))
    (_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
    
    # 腐蚀和膨胀的函数
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
    closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
    closed = cv2.erode(closed, None, iterations=4)
    closed = cv2.dilate(closed, None, iterations=4)
    
    # 找到边界findContours函数
    (_, cnts, _) = cv2.findContours(closed.copy(),
                                    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 计算出包围目标的最小矩形区域
    c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
    rect = cv2.minAreaRect(c)
    box = np.int0(cv2.boxPoints(rect))
    
    #======显示=======
    cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
    cv2.imshow("ScanQRcodeTest", image)
    cv2.waitKey(0)
    

    (二)调用解码函数进行解码

    • QRcodetest项目下新建ScanInvedio.py
      在这里插入图片描述
      运行测试:(不支持条形码)

    因为我自身电脑摄像头设置,颜色有点问题,请忽略

    在这里插入图片描述 在这里插入图片描述

    源码:

    '''
    ================================
    test4:识别摄像头中的条形码或二维码
    (ps.仅识别二维码码成功)
    ================================
    '''
    import cv2
    import pyzbar.pyzbar as pyzbar
    
    def decodeDisplay(image):
        barcodes = pyzbar.decode(image)
        for barcode in barcodes:
            # 提取二维码的边界框的位置
            # 画出图像中条形码的边界框
            (x, y, w, h) = barcode.rect
            cv2.rectangle(image, (x, y), (x + w, y + h), (225, 225, 225), 2)
    
            # 提取二维码数据为字节对象,所以如果我们想在输出图像上
            # 画出来,就需要先将它转换成字符串
            barcodeData = barcode.data.decode("utf-8")
            barcodeType = barcode.type
    
            # 绘出图像上条形码的数据和条形码类型
            text = "{} ({})".format(barcodeData, barcodeType)
            cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,
                        .5, (225, 225, 225), 2)
    
            # 向终端打印条形码数据和条形码类型
            print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
        return image
    
    
    def detect():
        camera = cv2.VideoCapture(0)
    
        while True:
            # 读取当前帧
            ret, frame = camera.read()
            # 转为灰度图像
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            im = decodeDisplay(gray)
    
            cv2.waitKey(5)
            cv2.imshow("camera", im)
            # 如果按键q则跳出本次循环
            if cv2.waitKey(10) & 0xFF == ord('q'):
                break
        camera.release()
        cv2.destroyAllWindows()
        
    if __name__ == '__main__':
        detect()
    

    大功告成!

    展开全文
  • QRcode

    千次阅读 2017-10-12 21:47:12
    android-zxingLibrary 二维码扫描和生成本文主要有两个内容 1.二维码是什么? 2.android项目中借助android-zxingLibrary快速实现二维码功能1.二维码是什么?参考博客地址: ...

    android-zxingLibrary 二维码扫描和生成


    本文主要有两个内容
    1.二维码是什么?
    2.android项目中借助android-zxingLibrary快速实现二维码功能


    1.二维码是什么?

    参考博客地址:
    http://blog.csdn.net/u012611878/article/details/53167009
    http://www.jianshu.com/p/f68a9d78d08e

          二维码,又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形。相比一维的条码,二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息,同时可以有较高的容错能力。

    1.1 二维码的分类

    1.堆叠式/行排式二维条码

          堆叠式/行排式二维条码又称堆积式二维条码或层排式二维条码,其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417、MicroPDF417 等。

    2. 矩阵式二维码

          最流行莫过于QR CODE ,我们常说的二维码就是它了。矩阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。
          二维码在现实生活中的应用越来越普遍由于QR CODE的流行,二维码又称QR code。

    1.2 QR码的特点

    • 1.存储大容量信息,相对于传统的条形码

    • 2.在小空间内打印,QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右
    • 3.有效表现各种字母,日本国产的二维码,因此非常适合处理日文字母和汉字
    • 4.对变脏和破损的适应能力强,)即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(是组成内部数据的单位,在QR码的情况下,每8比特代表1码字),最多可以纠错约30%(根据变脏和破损程度的不同,也存在无法恢复的情况
    • 5.可以从任意方向读取,QR码从360°任一方向均可快速读取。其奥秘就在于QR码中的3处定位图案

    • 6.支持数据合并功能,QR码可以将数据分割为多个编码,最多支持16个QR码

    1.3 QR码的编码过程

    1.数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。
    2.数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容
    3.纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列
    4.构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中。
    5.构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

    6.掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。
    7.格式和版本信息:生成格式和版本信息放入相应区域内。

    1.4 QBar识别和解码

    • 读取视频或图像,通过灰度化处理得到单张灰度图;
    • 对灰度图进行处理得到二值图像(二值化)
    • 将二值图输入不同的解码器识别是否存在二维码
    • 如果检测到存在某种编码,即通过相应的解码器进行解码,并返回解码结果

    1.5 总结

    二维码(QR)本质就是一个字符串,生成和扫描二维码的过程就是编码和解码。在这个过程中由于使用了效验所以导致二维码中内容是大于真实内容的。开始的二维码都是黑白图像,因为内容编码后是01序列,非常适合用二值图像显示;但是现在的可以是五颜六色的,这个也很好理解,白色还是1,其他的颜色都当成0就可以了

    2.android-zxingLibrary

    GitHub: https://github.com/yipianfengye/android-zxingLibrary
    作者博客地址 : http://blog.csdn.net/qq_23547831/article/details/52037710?reload

    2.1 主要几个常用的功能

    • 扫描二维码
    • 生成二维码
    • 从本地读取图片扫描(在实践过程中有点问题,没有实现,但是不影响这个库的强大)
    • 扫描二维码界面的UI改变(没有实践)

    2.2 使用方式

    2.1 gradle依赖

        compile 'cn.yipianfengye.android:zxing-library:2.2'

    2.2 权限申请 , 相机,震动等

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

    2.3使用

    1.扫描
     //扫描二维码
            findViewById(R.id.btn_scan).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this , CaptureActivity.class);
                    startActivityForResult(intent , SCAN);
                }
            });
    
    
      @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if(requestCode == SCAN){
                if(data != null){
                    Bundle bundle = data.getExtras();
                    if(bundle == null){
                        Log.e(TAG, "onActivityResult: "+ "error" );
                    }
                    if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
                        String result = bundle.getString(CodeUtils.RESULT_STRING);
                        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
                    }else if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED){
                        Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
                    }
                }
        }
    
    2.生成二维码
     findViewById(R.id.btn_create).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String content = et.getText().toString();
                    if(TextUtils.isEmpty(content)){
                        Toast.makeText(MainActivity.this, "输入为null", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    et.setText("");
                    iv.setImageBitmap(CodeUtils.createImage(content , 400 , 400 , null));
                }
            });
    展开全文
  • QRCodeQrcode_swetake二维码jar,也可以直接下载仓库文件,解压直接放进仓库,复制链接下载 https://download.csdn.net/download/qq_33705529/10531558
  • qrcode(一)

    千次阅读 2017-11-09 20:59:15
    1、 二维码概念 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式。是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;...
  • qrcode

    2019-10-08 14:25:07
    var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(18350...
  • QRCode二维码生成组件(珍藏版)

    千次下载 热门讨论 2020-07-30 23:33:23
    现在网上很多应用都是用二维码来分享网址或者其它的信息。尤其在移动领域,二维码更是有很大的应用场景。因为项目的需要,需要在网站中增加一个生成二维码分析网址的功能,在谷歌大幅度抽筋的情况下无奈使用百度。...
  • C# 利用QRCode生成二维码图片

    万次阅读 多人点赞 2020-06-10 14:26:14
    网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快。但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴。这是本要用它做了一个...
  • .NET 二维码生成(ThoughtWorks.QRCode)源代码

    千次下载 热门讨论 2020-07-27 23:33:10
    .NET 二维码生成(ThoughtWorks.QRCode)源代码,源码介绍博客:http://www.cnblogs.com/jys509/p/4592539.html
  • QRCode二维码维码支持中文Asp.Net(C#),是VS2010的项目,VS2008、VS2005也可以用,需要在你的项目里引用ThoughtWorks.QRCode.dll,在二维码生成页面内加上下面的代码: using System.Drawing.Imaging; using Thought...
  • JS 生成二维码实现(qrcode.js)

    万次阅读 2018-05-31 10:07:18
    qrcode.js源码地址: https://github.com/jeromeetienne/jquery-qrcode 使用 页面引入QRCode.js和JQuery.js &amp;amp;lt;script src=&amp;quot;../static/jquery-3.2.1.min.js&amp;quot;/&...
  • yii2整合phpqrcode

    2020-08-27 17:28:15
    use common\components\qrcode\QRcode; $res = QRcode::png('http://www.baidu.com'); var_dump($res); 参数说明: 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等; 第2个参数$outfile:默认...
  • 最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCodeQrCode.Net两种方式,所以访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,ThoughtWorks.QRCode的功能更多一些,但是dll...
  • Qrcode

    2020-09-12 19:22:25
    QRQR code的结构QR的容量用python+qrcode制作QR安装qrcode最简补充在QR上放图片 参考了某书.(跟以前一样那本) QR code的结构 QR code由边框区和数据区所组成,数据区由定位标记、校正图块、版本信息、原始信息、...
  • Py之qrcode:Python包之qrcode的简介、安装、使用方法之详细攻略 目录 qrcode简介 qrcode的安装 qrcode的使用方法 qrcode简介 二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,...
  • QRCode百度百科: QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。wiki: QR ...
  • QRCode.zip

    2020-06-03 23:32:04
    QRCode方式生成二维码所需要的两个Jar包,一个是生成二维码的包Qrcode-C.jar,另一个是解析二维码的包qrcode-R.jar。注:-C和-R是我为了区分两个Jar包人为加上的
  • Py之qrcode:调用python的qrcode库两种方式生成二维码、带logo的二维码 目录 python编程实现生成二维码 1、第一种方式—纯文本 2、第二种方式—带logo python编程实现生成二维码 1、第一种方式—...
  • qrcode解析二维码

    2020-07-29 14:20:14
    QRcode的压缩包里面包含两个文件夹,分别对应着生产二维码的demo和解析二维码的demo,用户可以根据自己的实际情况来选择使用或者改写插件。
1 2 3 4 5 ... 20
收藏数 28,198
精华内容 11,279
关键字:

qrcode