精华内容
下载资源
问答
  • 二维码识别

    千次阅读 2018-12-06 09:58:10
    版权声明:本文为博主原创文章,未经博主允许不得转载。...二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。 在许多种类...
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sdlypyzq/article/details/78073640

    1 什么是二维码

    二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。

    在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。

    二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码。

    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。

    2 QR码的特点

    1.存储大容量信息

    传统的条形码只能处理20位左右的信息量,与此相比,QR码可处理条形码的几十倍到几百倍的信息量。

    另外,QR码还可以支持所有类型的数据。(如:数字、英文字母、日文字母、汉字、符号、二进制、控制码等)。一个QR码最多可以处理7089字(仅用数字时)的巨大信息量。

    2.在小空间内打印

    QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右。(还支持Micro QR码,可以在更小空间内处理数据。)
    这里写图片描述

    3.有效表现各种字母

    QR码是日本国产的二维码,因此非常适合处理日文字母和汉字。QR码字集规格定义是按照日本标准“JIS第一级和第二级的汉字”制定的,因此在日语处理方面,每一个全角字母和汉字都用13比特的数据处理,效率较高,与其他二维码相比,可以多存储20%以上的信息。
    这里写图片描述

    4.对变脏和破损的适应能力强

    QR码具备“纠错功能”,即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(是组成内部数据的单位,在QR码的情况下,每8比特代表1码字),最多可以纠错约30%(根据变脏和破损程度的不同,也存在无法恢复的情况)。

    5.可以从任意方向读取

    QR码从360°任一方向均可快速读取。其奥秘就在于QR码中的3处定位图案,可以帮助QR码不受背景样式的影响,实现快速稳定的读取。
    这里写图片描述

    6.支持数据合并功能

    QR码可以将数据分割为多个编码,最多支持16个QR码。使用这一功能,还可以在狭长区域内打印QR码。另外,也可以把多个分割编码合并为单个数据。
    这里写图片描述

    3 QR码的信息量和版本

    QR码设有1到40的不同版本(种类),每个版本都具备固有的码元结构(码元数)。(码元是指构成QR码的方形黑白点。)

    “码元结构”是指二维码中的码元数。从版本1(21码元×21码元)开始,在纵向和横向各自以4码元为单位递增,一直到版本40(177码元×177码元)。
    这里写图片描述

    QR码的各个版本结合数据量、字符类型和纠错级别,均设有相对应的最多输入字符数。也就是说,如果增加数据量,则需要使用更多的码元来组成QR码,QR码就会变得更大。

    例如,需要输入的数据为100位的数字时,通过以下步骤来选定。
    1.假设要输入的数据种类为“数字”
    2.从“L”“M”“Q”“H”中选择纠错级别。(假设选择“M”)
    3.查看下表,先从数字列找出数字为100以上且接近100的,其次找出纠错级别“M”,两者交叉的部分就是最佳版本。
    这里写图片描述

    通过下面的计算为每个字符类型,总比特数的计算方法。
    这里写图片描述

    4 QR码的纠错

    QR码具有“纠错功能”。即使编码变脏或破损,也可自动恢复数据。这一“纠错能力”具备4个级别,用户可根据使用环境选择相应的级别。调高级别,纠错能力也相应提高,但由于数据量会随之增加,编码尺寸也也会变大。
    用户应综合考虑使用环境、编码尺寸等因素后选择相应的级别。 在工厂等容易沾染赃物的环境下,可以选择级别Q或H,在不那么脏的环境下,且数据量较多的时候,也可以选择级别L。一般情况下用户大多选择级别M(15%)。
    这里写图片描述
    纠错级别的比率,是指全部码字与可以纠错的码字的比率。
    例如,需要编码的码字数据有100个,并且想对其中的一半,也就是50个码字进行纠错,则计算方法如下。纠错需要相当于码字2倍的符号(RS编码※),因此在这种情况下的数量为50个×2=100码字。因此,全部码字数量为200个,其中用作纠错的码字为50个,所以计算得出,相对于全部码字的纠错率就是25%。这一比率相当于QR码纠错级别中的“Q”级别。

    另外,在上述例子当中,也可以认为相对于码字数据的纠错率为50%,但变脏或破损的部位不仅仅局限于码字数据部分,因此,在QR码中,还是用相对于全部码字的比率来描述纠错率。

    ※ RS编码:QR码的纠错功能是通过将RS编码附加到原数据中的方式实现的。RS编码是应用于音乐CD等用途的数学纠错方法。它能以字节为单位进行纠错,适合用于错误位置会集中的突发错误。

    5 QR码的种类

    这里写图片描述

    6 QR码的基本结构

    QR(Quick-Response) code是被广泛使用的一种二维码,解码速度快。它可以存储多用类型,下图是qrcode的基本结构:
    这里写图片描述
    位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
    校正图形:规格确定,校正图形的数量和位置也就确定了;
    格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

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

    数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。

    7 QR码的编码过程

    下面是简要QR编码过程:

    1.数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。

    2.数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。

    容量如下:

    格式容量
    数字最多7089字符
    字母最多4296字符
    二进制数(8 bit)最多2953字节
    日文汉字/片假名最多1817字符(采用Shift JIS)
    中文汉字最多984字符(采用UTF-8)
    中文汉字最多1800字符(采用BIG5)

    模式编码如下:

    模式指示符
    ECI0111
    数字0001
    字母数字0010
    8位字节0100
    日本汉字1000
    中文汉字1101
    结构链接0011
    FNCI0101(第一位置)
    1001(第二位置)
    终止符(信息结尾)0000

    数据可以按照一种模式进行编码,以便进行更高效的解码,例如:对数据:01234567编码(版本1-H),
    1)分组:012 345 67
    2)转成二进制:
    012→0000001100
    345→0101011001
    67 →1000011
    3)转成序列:0000001100 0101011001 1000011
    4)字符数 转成二进制:8→0000001000
    5)加入模式指示符(上图数字)0001:0001 0000001000 0000001100 0101011001 1000011

    对于字母、中文、日文等只是分组的方式、模式等内容有所区别。基本方法是一致的。

    3.纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。

    纠错等级纠错水平
    L7%字码修正
    M15%字码修正
    Q25%字码修正
    H30%字码修正

    在二维码规格和纠错等级确定的情况下,其实它所能容纳的码字总数和纠错码字数也就确定了,比如:版本10,纠错等级时H时,总共能容纳346个码字,其中224个纠错码字。

    就是说二维码区域中大约1/3的码字时冗余的。对于这224个纠错码字,它能够纠正112个替代错误(如黑白颠倒)或者224个据读错误(无法读到或者无法译码),这样纠错容量为:112/346=32.4%。

    4.构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中。

    按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。
    如:D1, D12, D23, D35, D2, D13, D24, D36, … D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,…

    5.构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

    8 QR码的应用

    QR码可以很“方便”地应用于各种场合。除了传单和名片等印刷物之外,还可以应用于各种广泛领域,如结算系统等与生活息息相关的领域以及工厂、流通等各种商业领域。QR码已经成为日常生活不可或缺的工具。2012年,公益财团法人日本设计振兴会对QR码表示了高度评价,由于QR码的功能非常贴近生活,设计精致,在其主办的设计推荐制度中授予QR码“优秀设计奖”。

    9 QR码的标准化

    “想让更多人使用QR码”,秉承这一理念,DENSO WAVE全面公开了QR码的相关标准。目前,QR码已经在国家标准和国际标准中实现标准化,任何人都可以随意查看该标准。

    ※DENSO WAVE INCORPORATED已宣布,不行使本公司就标准QR码拥有的专利权(专利第2938338号)。

    1997年 10月 被采纳为AIM International(国际自动识别工业会)标准(ISS - QR Code)
    1998年 3月 被采纳为JEIDA(日本电子工业振兴协会)标准(JEIDA-55)
    1999年 1月 被采纳为JIS(日本工业标准)(JIS X 0510)
    2000年 6月 被采纳为ISO国际标准 (ISO/IEC18004)
    2004年 11月 Micro QR码被采纳为JIS(日本工业标准)(JIS X 0510)
    2011年 12月 国际标准化组织GS1将QR码采纳为面向移动终端的标准

    QR码的简要标准
    这里写图片描述

    QR码标准文件下载

    QR码在ISO(ISO/IEC18004)中得到 标准化。因此,请从以下团体的网站购买QR码标准文件,在下面网址中搜索18004。

    http://www.iso.ch/iso/en/prods-services/ISOstore/store.html

    不过2016标准版的价格略贵,可到下面的资源中下载2006标准版的,链接如下:

    http://download.csdn.net/detail/u012611878/9687105

    另外,这里提供一个c++编写的qrcode编码解码工具,基于zxing的编码库,libqrcode的解码库,通过命令行完成二维码图片与文本之间的相互转换,链接如下:

    http://download.csdn.net/detail/u012611878/9705048

    欢迎下载。

    开源项目

    zxing/zxing
    oostendo/python-zxing
    ZBar/ZBar
    Polyconseil/zbarlight

    参考资料

    二维码的生成和解析原理
    二维码(QR code)基本结构及生成原理
    二维码的生成细节和原理

    展开全文
  • 使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不需要Opencv额外的处理。...

    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不需要Opencv额外的处理。


    下边这个例程演示两者配合对条形码和二维码的识别:

    1. #include "zbar.h"      
    2. #include "cv.h"      
    3. #include "highgui.h"      
    4. #include <iostream>      
    5.   
    6. using namespace std;      
    7. using namespace zbar;  //添加zbar名称空间    
    8. using namespace cv;      
    9.   
    10. int main(int argc,char*argv[])    
    11. {      
    12.     ImageScanner scanner;      
    13.     scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);    
    14.     Mat image = imread(argv[1]);      
    15.     Mat imageGray;      
    16.     cvtColor(image,imageGray,CV_RGB2GRAY);      
    17.     int width = imageGray.cols;      
    18.     int height = imageGray.rows;      
    19.     uchar *raw = (uchar *)imageGray.data;         
    20.     Image imageZbar(width, height, "Y800", raw, width * height);        
    21.     scanner.scan(imageZbar); //扫描条码    
    22.     Image::SymbolIterator symbol = imageZbar.symbol_begin();  
    23.     if(imageZbar.symbol_begin()==imageZbar.symbol_end())  
    24.     {  
    25.         cout<<"查询条码失败,请检查图片!"<<endl;  
    26.     }  
    27.     for(;symbol != imageZbar.symbol_end();++symbol)    
    28.     {      
    29.         cout<<"类型:"<<endl<<symbol->get_type_name()<<endl<<endl;    
    30.         cout<<"条码:"<<endl<<symbol->get_data()<<endl<<endl;       
    31.     }      
    32.     imshow("Source Image",image);        
    33.     waitKey();    
    34.     imageZbar.set_data(NULL,0);  
    35.     return 0;  
    36. }      


    条形码:



    二维码:



    这样“标准的”二维码是Zbar非常拿手的,能准确快速的检测出来,包括在条形码外有部分其他信息的,也是小菜一碟:



    Zbar很省心,我们还是可以为它做点什么的,比如在一些情况下,需要把条形码裁剪出来,这就涉及到条形码位置的定位,这篇文章准备记录一下如何定位条形码,在定位之后再把裁剪出来的条形码区域丢给Zbar识别读码。


    方法一. 水平、垂直方向投影


    1. #include "zbar.h"      
    2. #include "cv.h"      
    3. #include "highgui.h"      
    4. #include <iostream>      
    5.   
    6. using namespace std;      
    7. using namespace zbar;  //添加zbar名称空间    
    8. using namespace cv;      
    9. //***********************************************  
    10. // 函数通过水平和垂直方向投影,找到两个方向上投影的交叉矩形,定位到条形码/二维码  
    11. // int threshodValue 投影的最少像素单位  
    12. // int binaryzationValue  原图像阈值分割值  
    13. //***********************************************  
    14. Rect DrawXYProjection(const Mat image,Mat &imageOut,const int threshodValue,const int binaryzationValue);  
    15.   
    16. int main(int argc,char*argv[])    
    17. {     
    18.     Mat image = imread(argv[1]);    
    19.     Mat imageCopy=image.clone();  
    20.     Mat imageGray,imagOut;      
    21.     cvtColor(image,imageGray,CV_RGB2GRAY);  
    22.     Rect rect(0,0,0,0);  
    23.     rect=   DrawXYProjection(image,imagOut,image.rows/10,100);  
    24.     Mat roi=image(rect);  
    25.     //画出条形码的矩形框  
    26.     rectangle(imageCopy,Point(rect.x,rect.y),Point(rect.x+rect.width,rect.y+rect.height),Scalar(0,0,255),2);  
    27.     imshow("Source Image",image);  
    28.     imshow("水平垂直投影",imagOut);  
    29.     imshow("Output Image",roi);  
    30.     imshow("Source Image Rect",imageCopy);  
    31.     waitKey();        
    32.     return 0;  
    33. }    
    34.   
    35. Rect DrawXYProjection(const Mat image,Mat &imageOut,const int threshodValue,const int binaryzationValue)  
    36. {  
    37.     Mat img=image.clone();  
    38.     if(img.channels()>1)  
    39.     {  
    40.         cvtColor(img,img,CV_RGB2GRAY);  
    41.     }  
    42.     Mat out(img.size(),img.type(),Scalar(255));  
    43.     imageOut=out;  
    44.     //对每一个传入的图片做灰度归一化,以便使用同一套阈值参数  
    45.     normalize(img,img,0,255,NORM_MINMAX);  
    46.     vector<int> vectorVertical(img.cols,0);  
    47.     for(int i=0;i<img.cols;i++)  
    48.     {  
    49.         for(int j=0;j<img.rows;j++)  
    50.         {  
    51.             if(img.at<uchar>(j,i)<binaryzationValue)  
    52.             {  
    53.                 vectorVertical[i]++;  
    54.             }  
    55.         }  
    56.     }  
    57.     //列值归一化  
    58.     int high=img.rows/6;  
    59.     normalize(vectorVertical,vectorVertical,0,high,NORM_MINMAX);  
    60.     for(int i=0;i<img.cols;i++)  
    61.     {  
    62.         for(int j=0;j<img.rows;j++)  
    63.         {  
    64.             if(vectorVertical[i]>threshodValue)  
    65.             {  
    66.                 line(imageOut,Point(i,img.rows),Point(i,img.rows-vectorVertical[i]),Scalar(0));  
    67.             }  
    68.         }  
    69.     }  
    70.     //水平投影  
    71.     vector<int> vectorHorizontal(img.rows,0);  
    72.     for(int i=0;i<img.rows;i++)  
    73.     {  
    74.         for(int j=0;j<img.cols;j++)  
    75.         {  
    76.             if(img.at<uchar>(i,j)<binaryzationValue)  
    77.             {  
    78.                 vectorHorizontal[i]++;  
    79.             }  
    80.         }  
    81.     }     
    82.     normalize(vectorHorizontal,vectorHorizontal,0,high,NORM_MINMAX);  
    83.     for(int i=0;i<img.rows;i++)  
    84.     {  
    85.         for(int j=0;j<img.cols;j++)  
    86.         {  
    87.             if(vectorHorizontal[i]>threshodValue)  
    88.             {  
    89.                 line(imageOut,Point(img.cols-vectorHorizontal[i],i),Point(img.cols,i),Scalar(0));  
    90.             }  
    91.         }  
    92.     }  
    93.     //找到投影四个角点坐标  
    94.     vector<int>::iterator beginV=vectorVertical.begin();  
    95.     vector<int>::iterator beginH=vectorHorizontal.begin();  
    96.     vector<int>::iterator endV=vectorVertical.end()-1;  
    97.     vector<int>::iterator endH=vectorHorizontal.end()-1;  
    98.     int widthV=0;  
    99.     int widthH=0;  
    100.     int highV=0;  
    101.     int highH=0;  
    102.     while(*beginV<threshodValue)  
    103.     {  
    104.         beginV++;  
    105.         widthV++;  
    106.     }  
    107.     while(*endV<threshodValue)  
    108.     {  
    109.         endV--;  
    110.         widthH++;  
    111.     }  
    112.     while(*beginH<threshodValue)  
    113.     {  
    114.         beginH++;  
    115.         highV++;  
    116.     }  
    117.     while(*endH<threshodValue)  
    118.     {  
    119.         endH--;  
    120.         highH++;  
    121.     }  
    122.     //投影矩形  
    123.     Rect rect(widthV,highV,img.cols-widthH-widthV,img.rows-highH-highV);  
    124.     return rect;  
    125. }  

    通过图像在水平和垂直方向上的投影,按照一定的阈值,找到二维码所在位置,剪切出来用于下一步Zbar条码识别。当然这个方法只能识别出背景简单的图片中的二维码。

    条形码效果:



    水平、垂直投影



    检出条形码区域



    二维码效果:

              



    方法二.梯度运算


    1. #include "core/core.hpp"    
    2. #include "highgui/highgui.hpp"    
    3. #include "imgproc/imgproc.hpp"    
    4.     
    5. using namespace cv;    
    6.     
    7. int main(int argc,char *argv[])    
    8. {    
    9.     Mat image,imageGray,imageGuussian;    
    10.     Mat imageSobelX,imageSobelY,imageSobelOut;    
    11.     image=imread(argv[1]);    
    12.     
    13.     //1. 原图像大小调整,提高运算效率    
    14.     resize(image,image,Size(500,300));    
    15.     imshow("1.原图像",image);    
    16.     
    17.     //2. 转化为灰度图    
    18.     cvtColor(image,imageGray,CV_RGB2GRAY);    
    19.     imshow("2.灰度图",imageGray);    
    20.     
    21.     //3. 高斯平滑滤波    
    22.     GaussianBlur(imageGray,imageGuussian,Size(3,3),0);    
    23.     imshow("3.高斯平衡滤波",imageGuussian);    
    24.     
    25.     //4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子    
    26.     Mat imageX16S,imageY16S;    
    27.     Sobel(imageGuussian,imageX16S,CV_16S,1,0,3,1,0,4);    
    28.     Sobel(imageGuussian,imageY16S,CV_16S,0,1,3,1,0,4);    
    29.     convertScaleAbs(imageX16S,imageSobelX,1,0);    
    30.     convertScaleAbs(imageY16S,imageSobelY,1,0);    
    31.     imageSobelOut=imageSobelX-imageSobelY;    
    32.     imshow("4.X方向梯度",imageSobelX);    
    33.     imshow("4.Y方向梯度",imageSobelY);    
    34.     imshow("4.XY方向梯度差",imageSobelOut);      
    35.     
    36.     //5.均值滤波,消除高频噪声    
    37.     blur(imageSobelOut,imageSobelOut,Size(3,3));    
    38.     imshow("5.均值滤波",imageSobelOut);     
    39.     
    40.     //6.二值化    
    41.     Mat imageSobleOutThreshold;    
    42.     threshold(imageSobelOut,imageSobleOutThreshold,180,255,CV_THRESH_BINARY);       
    43.     imshow("6.二值化",imageSobleOutThreshold);    
    44.     
    45.     //7.闭运算,填充条形码间隙    
    46.     Mat  element=getStructuringElement(0,Size(7,7));    
    47.     morphologyEx(imageSobleOutThreshold,imageSobleOutThreshold,MORPH_CLOSE,element);        
    48.     imshow("7.闭运算",imageSobleOutThreshold);    
    49.     
    50.     //8. 腐蚀,去除孤立的点    
    51.     erode(imageSobleOutThreshold,imageSobleOutThreshold,element);    
    52.     imshow("8.腐蚀",imageSobleOutThreshold);    
    53.     
    54.     //9. 膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作    
    55.     dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);    
    56.     dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);    
    57.     dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);    
    58.     imshow("9.膨胀",imageSobleOutThreshold);          
    59.     vector<vector<Point>> contours;    
    60.     vector<Vec4i> hiera;    
    61.     
    62.     //10.通过findContours找到条形码区域的矩形边界    
    63.     findContours(imageSobleOutThreshold,contours,hiera,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);    
    64.     for(int i=0;i<contours.size();i++)    
    65.     {    
    66.         Rect rect=boundingRect((Mat)contours[i]);    
    67.         rectangle(image,rect,Scalar(255),2);        
    68.     }       
    69.     imshow("10.找出二维码矩形区域",image);    
    70.     
    71.     waitKey();    
    72. }    

    原图像



    平滑滤波



    水平和垂直方向灰度图像的梯度差



    闭运算、腐蚀、膨胀后通过findContours找到条形码区域的矩形边界


    二维码:

    原图:



    平衡滤波



    梯度和



    闭运算、腐蚀、膨胀后通过findContours找到条形码区域的矩形边界

    展开全文
  • 支持各种二维码识别,根据需要修改程序可以实现,经过测试使用500w相机工作距离三米视野一米二乘一米二,可以识别两厘米的二维码
  • Atitit java 二维码识别 图片识别   1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。11.3. 二维码的样例:21.4. 定位图案21.5. 数据编码31.6. 错误修正容量L水平7%的字码可被修正M...

    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


    展开全文
  • halcon二维码识别

    2019-10-18 14:57:55
    5、二维码识别halcon中实战 素材: read_image(Image,‘222.jpg’) rgb1_to_gray (Image, GrayImage) 第一步:创建模板 *************************************************************************** *初学...

    1、一维条码
    一维条码:由一组规则排列的条、空以及对应的字符组成的标记,“条”指对光线反射率较低的部分,“空”指对光线反射率较高的部分,这些条和空组成的数据表达一定的信息,并能够用特定的设备识读,转换成与计算机兼容的二进制和十进制信息。

    一维条码的码制: EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码,及Codabar(库德巴码)等。

    EAN 码:是国际通用的符号体系,是一种长度固定、无含意的条码,所表达的信息全部为数字,主要应用于商品标识
    39码和128码:为目前国内企业内部自定义码制,可以根据需要确定条码的长度和信息,它编码的信息可以是数字,也可以包含字母,主要应用于工业生产线领域、图书管理等
    93码:是一种类似于39码的条码,它的密度较高,能够替代39码
    25码:主要应用于包装、运输以及国际航空系统的机票顺序编号等
    Codabar码:应用于血库、图书馆、包裹等的跟踪管理
    ISBN:用于图书管理

    组成:

    一个完整的条码的组成次序依次为:静区(前)、起始符、数据符、(中间分割符,主要用于EAN码)、(校验符)、终止符、静区(后),
    如图:

    静区,指条码左右两端外侧与空的反射率相同的限定区域,它能使阅读器进入准备阅读的状态,当两个条码相距距离较近时,静区则有助于对它们加以区分,静区的宽度通常应不小于6mm(或10倍模块宽度)。
    起始/终止符,指位于条码开始和结束的若干条与空,标志条码的开始和结束,同时提供了码制识别信息和阅读方向的信息。
    数据符,位于条码中间的条、空结构,它包含条码所表达的特定信息。
    构成条码的基本单位是模块,模块是指条码中最窄的条或空,模块的宽度通常以mm或mil(千分之一英寸)为单位。构成条码的一个条或空称为一个单元,一个单元包含的模块数是由编码方式决定的,有些码制中,如EAN码,所有单元由一个或多个模块组成;而另一些码制,如39码中,所有单元只有两种宽度,即宽单元和窄单元,其中的窄单元即为一个模块。

    2、二维条码
    二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。

    ××××××××××××××××××××××××××××××××××××××××××××
    二维条码的码制:

    1. 堆叠式/行排式二维条码
      堆叠式/行排式二维条码(又称堆积式或层排式二维码),其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417等。
    2. 矩阵式二维码
      短阵式二维条码(又称棋盘式二维码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、Maxi Code、QR Code、 Data Matrix等。
      整体说下二维码的码制:PDF417二维条码, Datamatrix二维条码, Maxicode二维条码, QR Code, Code 49, Code 16K ,Code one,等,除了这些常见的二维条码之外,还有Vericode条码、CP条码、Codablock F码、田字码、 Ultracode码,Aztec条码。
      ×××××××××××××××××××××××××××××××××××××
      特点:

    二维条码/二维码的特点
    1.高密度编码,信息容量大:可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。
    2.编码范围广:该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。
    3.容错能力强,具有纠错功能:这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。
    4.译码可靠性高:它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。
    5.可引入加密措施:保密性、防伪性好。
    6.成本低,易制作,持久耐用。
    7.条码符号形状、尺寸大小比例可变。
    8.二维条码可以使用激光或CCD阅读器识读。

    3、halcon中支持的一维条码与二维码
    HALCON支持的一维码的码制:
    ‘2/5 Industrial’, ‘2/5 Interleaved’, ‘Codabar’, ‘Code 128’, ‘Code 39’, ‘Code 93’, ‘EAN-13 Add-On 2’, ‘EAN-13 Add-On 5’, ‘EAN-13’, ‘EAN-8 Add-On 2’, ‘EAN-8 Add-On 5’, ‘EAN-8’, ‘GS1 DataBar Expanded Stacked’, ‘GS1 DataBar Expanded’, ‘GS1 DataBar Limited’, ‘GS1 DataBar Omnidir’, ‘GS1 DataBar Stacked Omnidir’, ‘GS1 DataBar Stacked’, ‘GS1 DataBar Truncated’, ‘GS1-128’, ‘MSI’, ‘PharmaCode’, ‘UPC-A Add-On 2’, ‘UPC-A Add-On 5’, ‘UPC-A’, ‘UPC-E Add-On 2’, ‘UPC-E Add-On 5’, ‘UPC-E’, ‘auto’

    用到的函数:
    create_bar_code_model
    find_bar_code
    clear_bar_code_model
    ×××××××××××××××××××××××××××××××××××××××××××××××××××
    HALCON支持的二维码的码制:
    ‘Aztec Code’, ‘Data Matrix ECC 200’, ‘GS1 Aztec Code’, ‘GS1 DataMatrix’, ‘GS1 QR Code’, ‘Micro QR Code’, ‘PDF417’, ‘QR Code’
    用到的函数:
    create_data_code_2d_model
    find_data_code_2d
    clear_data_code_2d_model

    4、一维条码halcon中实战
    首先测试 一维码。 码制选择为:Code 128
    相关资料:http://www.systron.com.cn/128.htm
    素材见下图:

    read_image(Image,‘128.jpg’)
    rgb1_to_gray (Image, GrayImage)
    dev_set_draw (‘margin’)
    *第一步:读取模板
    *创建一个条形码阅读器的模型。
    *参数一:输入 通用参数可以调整条形码模型的名称。
    *参数二:通用参数可以调整条形码模型值。
    *参数三: 返回的条码模板句柄
    create_bar_code_model ([], [], BarCodeHandle)
    *第二步:使用模板
    *检测和读取条形码符号中的图像。
    **参数以此是:
    *输入的图像,输出的区域。
    *输入的模板句柄,输入条码的码制
    *返回所有成功解码的条码数据字符串。
    find_bar_code (GrayImage, SymbolRegions, \
    BarCodeHandle, ‘auto’, \
    DecodedDataStrings)
    **既然读取来就显示一下吧
    disp_message (3600, DecodedDataStrings, \
    ‘window’, 12, 12, ‘black’, ‘true’)
    *第三步:从内存中把模板清理掉,当然了 你想叫销毁也可以
    clear_bar_code_model (BarCodeHandle)

    read_image :读图

    create_data_code_2d_model :创建二维码模型

    find_data_code_2d :查找二维码

    clear_data_code_2d_model :清除二维码模型

    还有几个算子也值得注意一下:

    set_data_code_2d_param :设置解码时的参数

    get_data_code_2d_param :获取解码时的参数(如果没有设置过,则获得的是默认值)

    get_data_code_2d_results :获得解码后的一些结果
    四、提高解码能力的其他措施

    如果二维码图像预处理以后,仍旧解码困难或者解码率不高,那么可以通过以下措施进一步提高解码能力:

    1、如果整张图信息太多,则可以先把二维码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。

    2、当二维码很小的时候,可以尝试用zoom_image_factor放大了二维码图像。

    3、create_data_code_2d_model (‘QR Code’, [], [], DataCodeHandleQR)

    创建模型时,[ ]中不填内容,实际默认属性名是‘default_parameters’,默认属性值是‘standard_recognition’。

    如果想大幅度提高解码成功率,可以将属性值置为‘enhanced_recognition’或者‘maximum_recognition’。注意:解码能力越强,解码时间越长。

    4、find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, ‘train’, ‘all’, ResultHandles, DecodedDataStrings)

    该算子中的GenParamNames、GenParamValues默认是空的,就是说直接找,找不到拉倒。如果是’train’,就是一面找一面调整模板参数。

    默认情况下,它只会最多找到1个二维码。如果想找出更多的二维码(例如3个),可以这样:

    find_data_code_2d (Image2, SymbolXLDs, DataCodeHandle, ‘stop_after_result_num’, 3, ResultHandles, DecodedDataStrings)

    5、如果对于质量很差的二维码,可以模拟日常手机扫码时的操作,即多次改变曝光,多次解码的方式,参考文章:

    https://www.cnblogs.com/xh6300/p/9809692.html

    6、通过set_data_code_2d_param算子设置解码时的参数,可以有效提高解码能力。(见下文)

    五、set_data_code_2d_param算子的参数解析

    ‘default_parameters’

    ‘standard_recognition’、‘enhanced_recognition’、‘maximum_recognition’

    ‘timeout’

    延迟时间,超过这个时间还没找到就不找了

    ‘polarity’

    极性,可设置’dark_on_light’(白色背景黑码)或者’light_on_dark’

    ‘module_size_min’

    最小码粒像素大小,码粒大小指的二维码中矩形颗粒的宽度(存疑)

    ‘module_size_max’

    最大码粒像素大小
    5、二维码识别halcon中实战
    素材:

    read_image(Image,‘222.jpg’)
    rgb1_to_gray (Image, GrayImage)
    第一步:创建模板***************************************************************************
    *初学者创建模板时建议选择使用默认参数集(参数集,是多个参数构成的集合):‘default_parameters’
    *default_parameters有3种识别模式(识别模式越强,适应场合越广,适应能力和识别能力越强,但耗时越多):
    *standard_recognition 标准模式
    *enhanced_recognition 加强模式
    *maximum_recognition 最强模式
    *建议初学者选用 ‘maximum_recognition’
    *参数一:输入你要读取的二维码的码制
    *参数二:通用参数可以调整为二维码数据模型的名称。
    *参数三:通用参数可以调整为二维码数据模型的价值。
    *参数四:返回二维码模板句柄

    create_data_code_2d_model (‘QR Code’,\
    ‘default_parameters’, \
    ‘maximum_recognition’,\
    DataCodeHandle)
    **第二步:使用模板
    find_data_code_2d (GrayImage,\
    SymbolXLDs,\
    DataCodeHandle, ‘train’, ‘all’,\
    ResultHandles, DecodedDataStrings)

    • 参数依次是
      *参数一:输入的图像
      *参数二:XLD轮廓包围成功解码后的数据代码符号。 就是如果找到二维码所在的区域 ,
      *就将那个区域的XLD返回,注意可能输组
      *参数三:所使用的模板句柄
      *参数四:查找模式。 默认是空的 就是说直接找,找不到拉倒。 如果是train,就是一面找一面调整模板参数。
      *参数五:可选的泛型参数的值。
      *参数六:所有成功解码二维码数据符号的句柄。为啥是句柄呢? 如果解码的数据可能很多了。
      *参数七:返回图像中的所有检测到的二维码的数据符号的译码数据串。
      **第三步: 释放模板
      clear_data_code_2d_model(DataCodeHandle)
      ————————————————
    *提高解码率的设置项:
    *1'default_parameters', ''enhanced_recognition''
    *2'polarity', 'dark_on_light'
    *3['module_size_min','module_size_max']
    *4、挖出二维码区域,挖得越精确越好(周围最好不要有其他黑色像素块干扰),这一部分我现在只是粗略挖了一下
    *5、增强图像对比度,我设计的函数enhanced_contrast (将图像色阶从0-255重新映射到Min到Max之间)
    
    * create_data_code_2d_model ('QR Code', 'default_parameters', 'enhanced_recognition', DataCodeHandleQR) 
    create_data_code_2d_model ('QR Code', [], [], DataCodeHandleQR) 
    
    set_data_code_2d_param (DataCodeHandleQR, 'default_parameters', 'enhanced_recognition')
    set_data_code_2d_param (DataCodeHandleQR, 'timeout', 200)
    set_data_code_2d_param (DataCodeHandleQR, 'polarity', 'dark_on_light')
    
    * 码粒个数设置(有几种二维码设置这个参数非法)
    * set_data_code_2d_param(DataCodeHandleQR,'symbol_size_max', 11)
    * set_data_code_2d_param(DataCodeHandleQR,'symbol_size_max', 31)
    
    count := 0
    dev_set_line_width (3)
    dev_set_draw('margin')
    
    list_files ('OK_NG', ['files','follow_links','recursive'], ImageFiles)
    tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
    for i:= 0 to |ImageFiles|-1 by 1       
        read_image(Image,ImageFiles[i])  
        
        *挖出条码区域,提高解码率和解码速度
        gen_rectangle1 (Rectangle, 50, 100, 560, 700)  
        reduce_domain (Image, Rectangle, ImageReduced)
        crop_domain (ImageReduced, ImagePart)
        
        *增强图像对比度(后文有该函数说明)
        enhanced_contrast (ImagePart, Image2, 40, 180)
       
        * 码粒像素设置
        set_data_code_2d_param(DataCodeHandleQR, ['module_size_min','module_size_max'], [12,40])
        
        *如果GenParamNames, GenParamValues不填,那么默认只找一个二维码,将'stop_after_result_num'设置为3指最多找3*     find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
        find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, 'stop_after_result_num', 3, ResultHandles, DecodedDataStrings)
    
        tuple_length (DecodedDataStrings, Length)
        
        *找不到的话,改一下参数再找一遍
        if (Length == 0)
            set_data_code_2d_param (DataCodeHandleQR, ['module_size_min','module_size_max'], [20,40])
            find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
        endif
        
        tuple_length (DecodedDataStrings, Length)
        if (Length > 0 )
            count := count + 1
        endif
        
        *这个算子好像并不能评价质量
        get_data_code_2d_results (DataCodeHandleQR, 'all_candidates', 'quality_isoiec15415_labels', ResultValues)
        get_data_code_2d_param (DataCodeHandleQR, 'polarity', GenParamValues)
        dev_display(SymbolXLDs)
        disp_message (3600, '解码结果:' + DecodedDataStrings, 'image', 20, 50, 'black', 'true')
        disp_message (3600, '解码成功率:' + count + '/' +|ImageFiles| , 'image', 40, 50, 'black', 'true')
    *      stop ()
    endfor
    
    展开全文
  • 二维码识别超级解决方案,工业级别
  • opencv二维码识别解码

    万次阅读 多人点赞 2017-08-25 14:29:35
    使用opencv库识别QR二维码,框出图片中的二维码,并使用开源库Zxing解码,在这过程中学习理解opencv库相应的函数。 环境: 1. window7系统  2. QT create 1.准备 首先安装QT和QT create开发环境,window下使用...
  • Halcon条码二维码识别和测量

    千次阅读 2017-11-11 10:47:23
    Halcon条码二维码识别和测量,简单的介绍
  • 2.识别二维码 import java .awt .image .BufferedImage ; import java .io .File ; import java .util .HashMap ; import javax .imageio .ImageIO ; import com .google .zxing .BinaryBitmap ; import...
  • 那么一个二维码门禁读卡器到底支持多少种识别方式呢?下面小编就给大家介绍一下它的故事!回顾门禁系统的发展,智能化是它的发展方向,使得安防市场变得更加有活力,从传统的门锁发展到小区智能门禁系统,从最开始的...
  • 由一块一块黑白方块组成的二维码在...1)二维码存储信息原理与计算机识别0和1是一样的。比如一个黑色块代表1,白色块代表0,我们假设“1000101”代表信息“A”,用二维码表示:黑白白白黑白黑,当我们手机扫描二维码
  • android二维码识别原理与测试方法

    千次阅读 2017-10-20 11:38:39
    首先看看二维码识别原理: 一.我们都是使用二维码生成工具制码,原理对于我们意义并不是很大,这里就不浪费地方复制黏贴了。二维码编码原理请google。 二.下面是与本次问题相关的一些经验。 1. 同一尺寸...
  • 【Halcon】 二维码识别

    千次阅读 2019-07-01 15:46:21
    一、二维码概念:         指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度...
  • halcon二维码识别(完整板)

    千次阅读 2019-09-15 19:14:49
    *防止误识别设置,因为某些二维码模型没有这个属性,会报错所以try以下 try set_data_code_2d_param (DataCodeHandle, 'strict_quiet_zone', 'yes') catch (Exception) continue endtry *开始识别 find_...
  • 前面说了利用halcon进行二维码的识别,这次进行二维码识别及方向定位,虽然二维码本身也有定位和方向性,但是我没有在halcon算子里找到这个函数或调出这个参数的方法;不过可以通过在二维码附近添加mark图形来进行...
  • 首先需要在android手机上做条形码扫描的程序,java已经有第三方开源条形码识别库(zxing),在自己的应用中扫描条形码实际上只需调用该第三方库的实现即可,貌似只能扫二维码。必 须实现可网上找android zxing...
  • 回顾门禁系统的发展,智能化是它的发展方向,使得安防市场变得更加有活力,从传统的门锁发展到小区智能门禁系统,从最开始的密码与刷卡到更加安全的生物识别。这无一不是创新发展的成果。在这发展潮流的背后,我们不...
  • 打开摄像头并运行zbar算法进行一维码,二维码识别。3.调试与优化一、下载zbar源码下载路径:http://zbar.sourceforge.net/download.html解压命令:tar jxvf zbar-0.10.tar.bz2 zbar源码貌似已经停...
  • 基于Python的二维码实验一、机器视觉之QRcode二、基于Python的QRcodetest(一)配置环境(二)生成自己的二维码(三)识别二维码三、调用opencv库摄像头识别图像(一)用opencv找出(条形码&二维码)位置(二)调用...
  • 我们在Java开发的时候,发现对二维码识别是不足的。所以我们需要提高识别率。 第一步。识别图片二维码。准备相应的jar包。我们在gradle+idea中开发。 compile group: 'com.google.zxing', name: 'core', ...
  • 第47章 QR-Decoder-OV5640二维码识别 1 二维码简介2 二维条形码类型 21 矩阵式二维条码22 行排列式二维条码 3 二维条形码的优点4 QR二维码的编码及识别 41 QR码基本结构42 QR码编码过程43 QR码识别过程 5 QR-...
  • 第47章 QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:《STM32F4xx 中文参考...
  • C#_WPF中创建二维码识别二维码 原文:C#_WPF中创建二维码识别二维码第三方库:  WPFMediaKit.dll (WPFMediaKit摄像头处理)  zing.dll NuGet安装这两个第三方dll 项目截图预览: ...
  • Python二维码应用(一)QRcode二维码生成&识别

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,028
精华内容 1,211
关键字:

二维码识别等级