精华内容
下载资源
问答
  • 二维码的工作原理是什么
    千次阅读
    2020-07-25 20:58:22

    什么是二维码

    1、二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能够存更多的信息,也能表示更多的数据类型。

    2、二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理;它具有条形码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

    二维码的优势

    1、信息容量大,可以容纳多达1850个大写字母或2710个数字或500多个汉字

    2、应用范围广,支持文字,声音,图片,指纹等等。。。

    3、容错能力强,即使图片出现部分破损也能使用

    4、成本低,容易制作

    二维码容错级别

    L级(低) 的码字的7%可以被修复

    M级(中) 的码字的15%可以被修复

    Q级(四分)的码字的25%可以被修复

    H级(高)的码字的30%可以被修复

    QRCode介绍

    qrcode.js是一个用于生成二维码的JavaScript库,主要是通过获取DOM的标签,再通过HTML5 Canvas绘制而成

    qrcode.js下载链接:点此下载

    下面介绍二维码的生成:

    1、首先需要认识一下JavaScript

    javascript又称为js,在一个HTML页面中,写一个<script></script>标签,在这个标签中就可以书写JavaScript代码,javascript由三部分组成,分别是ECMAScript、BOM和DOM。javascript = ECMAScript + BOM + DOM

    ECMAScript:javascript的基本语法(和java语言非常类似)

    BOM:浏览器对象模型,可以理解为js提前定义好的对象,可以用来操作浏览器

    DOM:文档对象模型,可以理解为js提前定义好的对象,可以用来操作页面

    接下来分别创建三个HTML页面,来分别介绍ECMAScript、BOM和DOM(只需理解,都是一些最最基础的东西)

    ECMAScript:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>JS->ECMAScript(JS基础)</title>
        <script>
            //ECMAScript:JS的基本语法(和java语言非常类似)
    
            //定义变量
            //java中定义变量
            //int a = 10;
            //String b = "abc";
            //输出:System.out.println();
            //js中定义变量(都用var)
            //var a = 10;
            //var b = "abc";
            //输出:alert(a);弹出对话框
            //      console.log(a);打印到浏览器控制台
    
            //定义数组
            //java中定义数组
            //int[] arr = {1,3,5,7,9};
            //使用:arr[0];获取第一个元素
            //js中定义数组(也用var)
            //var arr = [1,3,5,7,9];
            //使用:arr[0];获取第一个元素。和java一样
    
            //定义方法
            //java中定义方法
            //public static int sum(int a,int b){
            //      return a + b;
            // }
            //调用:sum(3,5)
            //js中定义方法
            //function sum(a,b){
            //      return a + b;
            // }
            //调用:var num = sum(3,5);
            //      alert(num);
    
            //定义类(匿名对象)
            //java中定义类
            //public class Person{
            //      String name;
            //      int age;
            //
            //      public void show(){}
            // }
            //Person person = new Person();
            //调用:person.name
            //js中定义对象(js中没有类的概念)
            var person = {
                name:"zhangsan",
                age:23,
                show(){}
            }
            //调用:person.name
            //js中创建多个对象:
            function  getPerson() {
                return {
                    name:"zhangsan",
                    age:23,
                    show(){}
                }
            }
            //或者:
            function getPerson() {
                var person = {
                    name:"zhangsan",
                    age:23,
                    show(){}
                }
                return person;
            }
            //需要几个对象就调用几次方法
    
            //for循环
            for (var i = 0;i < arr.length; i++){
    
            }
        </script>
    </head>
    <body>
    
    </body>
    </html>

    BOM:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>JS->BOM</title>
        <script>
            //BOM:浏览器对象模型,是JS提前定义好的对象,可以用来操作浏览器
    
            //Window:在书写过程中,可以省略
            //window.alert(111);
            //var f = confirm("你好啊");//确认/取消框,确认时,返回true,取消时,返回false
            //alert(f);
    
            //Navigator:
            //alert(navigator.userAgent);//获取浏览器的相关信息
    
            //Screen
            // alert(screen.height);//获取屏幕的宽
            // alert(screen.width);//获取屏幕的高
    
            //History
            // history.back()
    
            //Location
            // alert(location.href)
            // location.href="http://henu.edu.cn"//让当前页面跳转到指定页面
        </script>
    </head>
    <body>
    
    </body>
    </html>

    DOM:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>JS->BOM</title>
        <script>
            //DOM:文档对象模型,可以理解为JS提前定义好的对象,可以用来操作页面
            //当整个页面加载完毕之后,再执行里边的代码
            window.onload = function () {
                //1.找到标签
                //var btn = document.getElementById("btn")
                //2.操作标签
                //操作标签的属性
                //alert(btn.value)
                //btn.value = "hahaha"
                //操作标签的样式
                //btn.style.backgroundColor = "red"
                //操作标签体内容
                var d1 = document.getElementById("d1")
                //alert(d1.innerHTML)
                d1.innerHTML = "<h1>aaa</h1>>"
            }
    
        </script>
    </head>
    <body>
    <!--    <input id="btn" type="button" value="我是一个按钮">-->
        <div id="d1">我是div</div>
    </body>
    </html>

    2、再了解一下JQuery

    JQuery其实是一个js的框架,就是对js的某些操作(DOM)进行封装,让我们在操作js的时候更加的方便

    1)现在webapp文件夹下创建一个js文件夹,用于存放js文件

    2)创建一个HTML文件,用于演示jQuery

    <!DOCTYPE html>
    <html lang="en">
    <meta charset="UTF-8">
        <title>JQuery</title>
        <script src="js/jquery.1.8.3.min.js"></script>
        <script>
            //页面加载完毕
            window.onload = function () {
                //js语法
                var js_el = document.getElementById("btn")
                alert(js_el.value)
                //jQuery语法
                var jq_el = $("#btn")
                //alert(jq_el.prop("value"))
                alert(jq_el.val())
            }
        </script>
    </head>
    <body>
        <input id="btn" type="button" value="我是一个按钮">
    </body>
    </html>

    3、开始介绍二维码的制作

    1)在js文件夹下导入qrcode.js文件

    2)创建一个HTML,命名为二维码,写以下代码,二维码就能生成了(只不过此时的二维码没有任何内容)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>二维码</title>
        //必须导入下面两个js文件,并且这两个文件的顺序不能颠倒,因为qrcode的运行依赖于jquery
        <script src="js/jquery.1.8.3.min.js"></script>
        <script src="js/qrcode.js"></script>
        <script>
            //页面加载完成之后,再去执行这里边的代码
            $(function () {
                //在div中生成二维码
                $("#d1").makeQRCode()
            })
        </script>
    </head>
    <body>
        <div id="d1"></div>
        <input type="button" value="按钮">
    </body>
    </html>

    3)添加一些二维码样式

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>二维码</title>
    <!--    必须导入下面两个js文件,并且这两个文件的顺序不能颠倒,因为qrcode的运行依赖于jquery-->
        <script src="js/jquery.1.8.3.min.js"></script>
        <script src="js/qrcode.js"></script>
        <script>
            //页面加载完成之后,再去执行这里边的代码
            $(function () {
                //在div中生成二维码
                $("#d1").makeQRCode({
                    render:'image', //渲染模式,取值:canvas / image / div
                    ecLevel:'H', //容错级别, 取值: L:7% / M:15% / Q:25% / H:30%
                    minVersion:6 , //二维码密度, 取值: 0-10
                    fill:'#666', //二维码颜色(前景色)
                    background:'#fff', //二维码背景颜色
                    text:'Hello world!', //扫码时获取到的值(这里面也可以写网址,一扫进入指定网站)
                    size:300, //二维码大小,单位是像素
                    radius:20, //圆滑度,取值50以内
                    quiet:4, //二维码边框
                    mode:2, //显示模式, 取值: 不显示LOGO:0 / 文字且占整行:1 / 文字居中:2 / 图片且占整行:3 / 图片居中:4
                    mSize:10, //logo大小
                    label:'你好!', //logo文字
                    fontname:'微软雅黑', //logo字体名
                    fontcolor:'green', //logo字体颜色
                    //image:$("#i1")[0]//用图片的时候把mode改成3或4、render改为canvas
                })
            })
        </script>
    </head>
    <body>
    <!--    <img id="i1" src="img/aaa.png" style="display: none"/> 上面使用图片时可以写这个-->
        <div id="d1"></div>
        <input type="button" value="按钮">
    </body>
    </html>

    4)可以用微信扫一下(自己调节里面的参数,可以看一下效果)

    更多相关内容
  • 二维码工作原理什么

    千次阅读 2020-12-29 17:15:17
    现如今二维码虽然已经出现在生活的方方面面,但是二维码工作原理什么,你了解吗? 1、关于条形码 首先,先和大家讲下二维码前身“一维码”,也就是我们常说的条形码。像大家去超市结账的时候,收银员扫着商品...

    二维码无处不在,加好友扫一扫,付款扫一扫,下载文件扫一扫,进入小程序扫一扫,品牌需要二维码,商铺需要二维码,好像只有随处扫一扫二维码,才能觉得和这个世界接轨上了。
    有人问这么多的二维码是谁制造出来的呢?其实二维码制作并没有想象中的那么难。自己可以使用二维码制作生成器完成的。
    现如今二维码虽然已经出现在生活的方方面面,但是二维码的工作原理是什么,你了解吗?


    1、关于条形码

    首先,先和大家讲下二维码前身“一维码”,也就是我们常说的条形码。像大家去超市结账的时候,收银员扫着商品的条形码,电脑在水平方向上识别粗细不均的黑白条,就能找出商品编号信息,比如价格,商品名称。
    条形码可以说是只在一个纬度上工作,而“后浪”二维码在水平和垂直两个纬度上都携带了信息,大有超越前辈之势,当然各有各用处,不可能取代对方的位置。条形码和二维码这对好兄弟,说白了就是将数字、符号这类的信息换了一身衣服,把他们打扮成能给电脑识别的黑白条和方块。
    想要了解关于二维码的资讯?点击链接二维彩虹了解更多


    2、这种方块是怎么变成能被电脑识别的图案的呢?

    这就必须提下到人类具有划时代的发明——二进制。我们平时使用的数字和字母,还有汉字等各种字符,虽然画风完全不同,但是机智的我们发明了一种方法,使他们都能被统一转变为0和1组成的二进制数字序列,这个转化的过程叫做编码。

    那么问题又来啦,编码是怎么回事儿呢?

    国际上有几套通用的编码规则。比方AB这个由两个英文字母组成的字符。根据编码规则,每一个独立的英文字母都有一个唯一的十进制数字与之对应,而想AB这样的字符串,则要在对应数字的基础上在做运算,而运算结果在转化成二进制,就是一串数字。在整个计算机和物联网文明都是建立在这种二进制编码上的。

    3、二维码的工作原理是什么呢?

    使用二维码制作生成器生成一张二维码是很简单的是,但二维码的生成原理是什么呢?二维彩虹来告诉你!

    字符在变成只有0和1组成的数字序列后,在进行一系列优化算法后,就得到了最终的二进制编码。

    在最后这串编码中,一个0对应的就是一个白色小方块,一个1对应的就是一个黑色的小方块。我们把这些小方块按照8个一组,填进大方块里,这就是一个完整的,可以被手机相机识别的二维码图案了。

    那么,为啥所有的二维码都有三个小方块在边上呢?其实这个三个一模一样的小方块是用来给手机相机定位的,这样不管你的二维码是正的扫还是倒着左右扫,都能被手机相机识别,并且扫出来的结果都一样。

    在这里插入图片描述

    展开全文
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自|新机器视觉生活在数字时代的我们,很多场合都用到了二维码。看网页要扫二维码,加好友要扫二维...

    点击上方“小白学视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达
    
    

    本文转自|新机器视觉

    生活在数字时代的我们,很多场合都用到了二维码。看网页要扫二维码,加好友要扫二维码,甚至在楼下卖水果的大爷,都支持扫码支付了。

    你有没有想过,这个长得很奇怪的东西,是怎么来的呢,又是什么原理呢?一起来看看下面的视频吧(视频下面还有图文版)。

    视频版——

    图文版——

    那么二维码是怎么出现的,是如何工作的呢?

    今天就和大家聊一聊

    二维码是谁发明的

    二维码 ,又称二维条码,二维条形码最早发明于日本,1994年日本 Denso Wave 发明的QR码,用于汽车制造,主要目的是在制作过程中保持每一个部件的行踪正确。

    它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。

    常见的二维码为QR Code

    最早于1994年被日本公司Denso Wave的腾弘原发明

    并且由原来的条形码改造而来

    相比条形码数据能力存储能力都大大提升

    最先的二维码是彩色的

    主要用来追踪其公司旗下汽车零部件维修等情况

    后来在此基础上

    为了提高工作效率Denso Wave公司又改进出了今天常见的黑白

    二维码的生成原理是:

    用特定的几何图形按编排规律在二维方向上分布

    采用黑白相见的图形来记录数据符号信息

    为了让计算机识别

    就要利用计算机内部逻辑

    用数字“0”和“1”作为代码

    同时使用若干个与二进制相对应的几何形体表示文字数值信息

    白块表示的就是二进制的“0”

    黑块就是“1”

    摄像头识别出颜色和排列就能解读出二维码包含的信息

    在QR码上

    不同的区域

    则表示着不同的信息

    安静区域:空白边框,可以将代码与其他打印信息隔离(例如,在脏信封上,报纸的黑白打印或污迹产品包装上)。

    Finder模式:三个角落中的大黑色和白色方块可以很容易地确认这是一个QR码。由于它们只有三个,所以很明显代码的哪个方向以及它指向的角度(除非代码在某种程度上被部分遮挡或损坏)。

    对齐模式:这确保代码可以被破译,即使它是扭曲的(以某个角度查看,打印在曲面上,等等)。

    定时模式:在三个取景器模式之间水平和垂直地运行,由交替的黑色和白色方块组成。时序模式可以轻松识别QR码中的各个数据单元,在代码损坏或失真时尤其有用。

    版本信息:QR码标准有各种不同版本;版本信息(位于两个取景器模式附近)简单地识别在特定代码中使用哪一个。

    数据单元:每个单独的黑色或白色方块不属于标准特征之一(时序,对齐和其他模式),包含代码中的一些实际数据。

    二维码有什么功能

    1、信息获取(名片、地图、WIFI密码、资料)。

    2、网站跳转(跳转到微博、手机网站、网站)。

    3、广告推送(用户扫码,直接浏览商家推送的视频、音频广告)。

    4、手机电商(用户扫码、手机直接购物下单)

    总的来说

    目前二维码已经成了生活中必不可少的一部分

    也确实为我们的生活带来了很多便捷~

    下载1:OpenCV-Contrib扩展模块中文版教程

    在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

    下载2:Python视觉实战项目52讲

    在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

    下载3:OpenCV实战项目20讲

    在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

    交流群

    欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

    展开全文
  • 浅析二维码基本原理

    万次阅读 2020-10-21 16:08:01
    纠错码 上面我们说到了一些纠错级别,Error Correction Code Level,二维码中有四种级别的纠错,这就是为什么二维码有残缺还能扫出来,也就是为什么有人在二维码的中心位置加入图标。 水平级别 错误修正容量 L水平 ...

    识别技术的发展可以分为三个阶段:自然识别阶段、模式识别阶段、自动识别阶段。自然识别主要是通过人的感官来识别物体。随着科技的发展,人的感官认识能力逐渐的被机器模拟出来。模式识别是对物体的直观信息进行读取识别,而这些信息通常数据量大且较为复杂,所以模式识别技术很难应用到对识别效率要求较高的应用领域,例如交通运输、物流、邮政等。自动识别技术就是针对这类需求发展起来,分为三部分:信息封装、信息传输和信息识别。信息封装是指通过对物体的直观信息进行抽象,将信息转化为可编码的文字、图像等形式。然后通过数据编码对原始数据进行压缩,最后将编码得到的数据存储在特定的信息载体中。信息最终以信息载体来得到原始信息。信息识别就是通过专门的识别设备对物体信息载体进行识读,并通过解码来得到原始信息。自动识别技术虽然增加了信息封装的过程并需要借助特定的信息载体来进行信息传输,但是大大提高了识别效率。

    常见的物体信息载体有:条码(Bar Code)、射频标签(RFID)、磁条\卡、智能卡(IC卡)等,其中条码又可以分为一维码和二维码。

    二维码兼具了一维码的一些优点,例如成本低、传播方便等,并且二维码的存储容量与一维码相比,扩大了几十到几百倍,同时保密安全性更高。但也有一些不足,比如存储容量受条码大小限制,一般在几十到几百字节;抗污染能力不佳,容易折损,容错能力最大为30%;只读且容易被伪造;识别距离短,只能一对一识别。

     

    上世纪80年代末,美国、日本等国家的企业、研究机构开始进行二维码的研究,1989年美国国际资料公司发明了Data Matrix,原名为Data Code;PDF417码为1991年留美华人王寅敬博士发明并由讯宝(Symbol)公司制定完成;1992年美国知名的UPS(United Parcel Service)快递公司推出UPS码,即Maxicode二维码的前身;1994年,日本Denso公司发明了QR码(Quick Response Code);2009年微软推出了一种新的二维码“Microsoft Tag”,增加了色彩维度,因此又称为彩色条码。

    二维码标准化的国外研究机构主要有国际自动识别制造商协会(AIMI)、美国标准化协会(ANSI)以及后来成立的国际标准化组织/国际电工委员会第一联合委员会的条码自动识别技术委员会(ISO/IEC/JTCI/SC31),它们已经制作了一些码的国际标准,并且不断完善。国内则对二维码的标准化还不够完善。

    这篇文章对我们常用的二维码QR Code进行一个生成细节和原理分析,供感兴趣的同学一起学习。

     

    1.基础知识

     

    首先,我们先说一下二维码一共有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 的正方形。

    下面我们看看一个二维码的样例:

     

     

    1.1 定位图案

     

    • Position Detection Pattern是定位图案,用于标记二维码的矩形大小。这三个定位图案有白边叫Separators for Postion Detection Patterns。三个就可以标识一个矩形。

    • Timing Patterns也是用于定位的。原因是二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪。

    • Alignment Patterns 只有Version 2以上(包括Version2)的二维码需要,同样用来定位。

    1.2 功能性数据

     

    • Format Information 存在于所有的尺寸中,用于存放一些格式化数据的。

    • Version Information 在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

     

    1.3 数据码和纠错码

     

    • 除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。

     

     

    2.数据编码

     

    我们先来说说数据编码。QR码支持如下的编码:

    Numeric mode 数字编码,从0到9。如果需要编码的数字的个数不是3的倍数,那么,最后剩下的1或2位数会被转成4或7bits,则其它的每3位数字会被编成 10bits,字符的个数编成多长还要看二维码的尺寸(Table 3)。

    Alphanumeric mode 字符编码。包括 0-9,大写的A到Z(没有小写),以及符号$ % * + – . / : 包括空格。这些字符会映射成一个字符索引表。如下所示:(其中的SP是空格,Char是字符,Value是其索引值) 编码的过程是把字符两两分组,然后转成下表的45进制,然后转成11bits的二进制,如果最后有一个落单的,那就转成6bits的二进制。字符的个数需要根据不同的Version尺寸编成9, 11或13个二进制(Table 3)。

     

     

    Byte mode, 字节编码,可以是0-255的ISO-8859-1字符。有些二维码的扫描器可以自动检测是否是UTF-8的编码。

    Kanji mode 这是日文编码,也是双字节编码。同样,也可以用于中文编码。日文和汉字的编码会减去一个值。如:在0X8140 to 0X9FFC中的字符会减去8140,在0XE040到0XEBBF中的字符要减去0XC140,然后把结果前两个16进制位拿出来乘以0XC0,然后再加上后两个16进制位,最后转成13bit的编码。如下图示例:

     

     

    Extended Channel Interpretation (ECI) mode 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。

    Structured Append mode 用于混合编码,也就是说,这个二维码中包含了多种编码格式。

    FNC1 mode 这种编码方式主要是给一些特殊的工业或行业用的。比如GS1条形码之类的

    简单起见,后面三种不会在本文中讨论。

    下面两张表中,

    • Table 2 是各个编码格式的“编号”,这个东西要写在Format Information中。注:中文是1101

    • Table 3 表示了,不同版本(尺寸)的二维码,对于,数字,字符,字节和Kanji模式下,对于单个编码的2进制的位数。(在二维码的规格说明书中,有各种各样的编码规范表,后面还会提到)

       

     

     

    下面我们看几个示例:

     

    2.1 示例一:数字编码

     

    在Version 1的尺寸下,纠错级别为H的情况下,编码:01234567

    1. 把上述数字分成三组: 012 345 67

    2. 把他们转成二进制:  012 转成 0000001100;345 转成 0101011001;67 转成 1000011。

    3. 把这三个二进制串起来: 0000001100 0101011001 1000011

    4. 把数字的个数转成二进制 (version 1是10 bits,Table3 ): 8个数字的二进制是 0000001000

    5. 把数字编码的标志0001和第4步的编码加到前面:  0001 0000001000 0000001100 0101011001 1000011

     

    2.2 示例二:字符编码

     

    在Version 1的尺寸下,纠错级别为H的情况下,编码: AC-42

    1. 从字符索引表中找到 AC-42 这五个字条的索引 (10,12,41,4,2)

    2. 两两分组: (10,12) (41,4) (2)

    3.把每一组转成11bits的二进制:

            (10,12) 10*45+12 等于 462 转成 00111001110
            (41,4) 41*45+4 等于 1849 转成 11100111001
            (2) 等于 2 转成 000010

    4. 把这些二进制连接起来:00111001110 11100111001 000010

    5. 把字符的个数转成二进制 (Version 1为9 bits,Table3 ): 5个字符,5转成 000000101

    6. 在头上加上编码标识 0010 和第5步的个数编码:  0010 000000101 00111001110 11100111001 000010

     

     

    3.结束符和补齐符

     

    假如我们有个HELLO WORLD的字符串要编码,根据上面的示例二,我们可以得到下面的编码,

     

    编码

    字符数

    HELLO WORLD的编码

    0010

    000001011

    01100001011 01111000110 10001011100 10110111000 10011010100 001101


    3.1 结束符

     

    我们还要加上结束符:

     

    编码

    字符数

    HELLO WORLD的编码

    结束符

    0010

    000001011

    01100001011 01111000110 10001011100 10110111000 10011010100 001101

    0000

     

    并按8bits重排——如果所有的编码加起来不是8个倍数我们还要在后面加上足够的0,比如上面一共有78个bits,所以,我们还要加上2个0,然后按8个bits分好组:

    00100000   01011011   00001011   01111000   11010001   01110010   11011100   01001101   01000011   01000000

     

    3.2 补齐符(Padding Bytes)

     

    最后,如果如果还没有达到我们最大的bits数的限制,我们还要加一些补齐码(Padding Bytes),Padding Bytes就是重复下面的两个bytes:11101100 00010001 (From Spec)。关于每一个Version的每一种纠错级别的最大Bits限制,可以参看QR Code Spec的第28页到32页的Table-7。

    假设我们需要编码的是Version 1的Q纠错级,那么,其最大需要104个bits,而我们上面只有80个bits,所以,还需要补24个bits,也就是需要3个Padding Bytes,我们就添加三个,于是得到下面的编码:

    00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100

    上面的编码就是数据码了,叫Data Codewords,每一个8bits叫一个codeword,我们还要对这些数据码加上纠错信息。

     

     

    4.纠错码

     

    上面我们说到了一些纠错级别,Error Correction Code Level,二维码中有四种级别的纠错,这就是为什么二维码有残缺还能扫出来,也就是为什么有人在二维码的中心位置加入图标。

     

    水平级别        错误修正容量

    L水平

    7%的字码可被修正

    M水平

    15%的字码可被修正

    Q水平

    25%的字码可被修正

    H水平

    30%的字码可被修正

     

    那么,QR是怎么对数据码加上纠错码的?首先,我们需要对数据码进行分组,也就是分成不同的Block,然后对各个Block进行纠错编码,对于如何分组,我们可以查看QR Spec中的Table-13到Table-22的定义表。

    举个例子:上述的Version 5-Q纠错级:需要4个Blocks(2个Blocks为一组,共两组),头一组的两个Blocks中各15个字节+ 各 9个字节的纠错码(注:表中的codewords就是一个8bits的字节,c = k + 2 * r)。

    下图给一个5-Q的示例(因为二进制写起来会让表格太大,所以,我都用了十进制,我们可以看到每一块的纠错码有18个codewords,也就是18个8bits的二进制数)

     

    数据对每个块的纠错码

    1

    1

    67 85 70 134 87 38 85 194 119 50 6 18 6 103 38

    213 199 11 45 115 247 241 223 229 248 154 117 154 111 86 161 111 39

    2

    246 246 66 7 118 134 242 7 38 86 22 198 199 146 6

    87 204 96 60 202 182 124 157 200 134 27 129 209 17 163 163 120 133

    2

    1

    182 230 247 119 50 7 118 134 87 38 82 6 134 151 50 7

    148 116 177 212 76 133 75 242 238 76 195 230 189 10 108 240 192 141

    2

    70 247 118 86 194 6 151 50 16 236 17 236 17 236 17 236

    235 159 5 173 24 147 59 33 106 40 255 172 82 2 131 32 178 236

     

    注:二维码的纠错码主要是通过Reed-Solomon error correction(里德-所罗门纠错算法)来实现的。里面有很多的数学计算,比如:多项式除法,把1-255的数映射成2的n次方(0<=n<255)的伽罗瓦域Galois Field。以及基于这些基础的纠错数学公式。

     

     

    5.最终编

     

    5.1 穿插放置

     

    接下来是把数据码和纠错码的各个codewords交替放在一起。规则如下:

    对于数据码:把每个块的第一个codewords先拿出来按顺度排列好,然后再取第一块的第二个,如此类推。如:上述示例中的Data Codewords如下:

     

    块 1

    67

    85

    70

    134

    87

    38

    85

    194

    119

    50

    6

    18

    6

    103

    38

     

    块 2

    246

    246

    66

    7

    118

    134

    242

    7

    38

    86

    22

    198

    199

    146

    6

     

    块 3

    182

    230

    247

    119

    50

    7

    118

    134

    87

    38

    82

    6

    134

    151

    50

    7

    块 4

    70

    247

    118

    86

    194

    6

    151

    50

    16

    236

    17

    236

    17

    236

    17

    236

    我们先取第一列的:67, 246, 182, 70

    然后再取第二列的:67, 246, 182, 70, 85,246,230 ,247

    如此类推:67, 246, 182, 70, 85,246,230 ,247 ……… ,38,6,50,17,7,236

    对于纠错码,也是一样:

    块 1

    213

    199

    11

    45

    115

    247

    241

    223

    229

    248

    154

    117

    154

    111

    86

    161

    111

    39

    块 2

    87

    204

    96

    60

    202

    182

    124

    157

    200

    134

    27

    129

    209

    17

    163

    163

    120

    133

    块 3

    148

    116

    177

    212

    76

    133

    75

    242

    238

    76

    195

    230

    189

    10

    108

    240

    192

    141

    块 4

    235

    159

    5

    173

    24

    147

    59

    33

    106

    40

    255

    172

    82

    2

    131

    32

    178

    236

    和数据码取的一样,得到:213,87,148,235,199,204,116,159,…… …… 39,133,141,236

    然后,再把这两组放在一起(纠错码放在数据码之后)得到:

    67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87, 118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87, 16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17, 7, 236, 213, 87, 148, 235, 199, 204, 116, 159, 11, 96, 177, 5, 45, 60, 212, 173, 115, 202, 76, 24, 247, 182, 133, 147, 241, 124, 75, 59, 223, 157, 242, 33, 229, 200, 238, 106, 248, 134, 76, 40, 154, 27, 195, 255, 117, 129, 230, 172, 154, 209, 189, 82, 111, 17, 10, 2, 86, 163, 108, 131, 161, 163, 240, 32, 111, 120, 192, 178, 39, 133, 141, 236

    这就是我们的数据区。

     

    5.2 Remainder Bits

     

    最后再加上Reminder Bits,对于某些Version的QR,上面的还不够长度,还要加上Remainder Bits,比如:上述的5Q版的二维码,还要加上7个bits,Remainder Bits加零就好了。关于哪些Version需要多少个Remainder bit,可以参看QR Code Spec的Table-1。

     

     

    6.二维码图像的画制

     

    6.1 Position Detection Pattern

     

    首先,先把Position Detection图案画在三个角上。(无论Version如何,这个图案的尺寸就是这么大)。

     

     

    6.2 Alignment Pattern

     

    然后,再把Alignment图案画上(无论Version如何,这个图案的尺寸就是这么大)。

     

    关于Alignment的位置,可以查看QR Spec中Table-E.1的定义表(下表是不完全表格)。

     

     

    下图是根据上述表格中的Version8的一个例子(6,24,42)。

     

     

     

    6.3 Timing Pattern

     

    接下来是Timing Pattern的线:

     

     

    6.4 Format Pattern

     

    再接下来是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,从而造成全部为白色,这会增加我们的扫描器的图像识别的困难。

    下面是一个示例:

     

     

    关于Error Correction Level如下表所示:

     

     

    关于Mask图案如后面的Table 23所示。

     

    6.5 Version Information

     

    再接下来是Version Information(版本7以后需要这个编码),下图中的蓝色部分。

     

     

    Version Information一共是18个bits,其中包括6个bits的版本号以及12个bits的纠错码,下面是一个示例:

     

     

    而其填充位置如下:

     

     

    6.6 数据和数据纠错码

     

    然后是填充我们的最终编码,最终编码的填充方式如下:从右下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。

     

     

     

    6.7 掩码图案

     

    这样下来,我们的图就填好了,但是,也许那些点并不均衡,如果出现大面积的空白或黑块,会告诉我们扫描识别的困难。所以,我们还要做Masking操作。QR有8个Mask可以使用,如下所示:其中,各个mask的公式在各个图下面。所谓mask,就是和上面生成的图做XOR操作。Mask只会和数据区进行XOR,不会影响功能区。(注:选择一个合适的Mask也是有算法的)

     

     

    其Mask的标识码如下所示:(其中的i,j分别对应于上图的x,y)

     

     

    下面是Mask后的一些样子,我们可以看到被某些Mask XOR了的数据变得比较零散了。

     

     

    Mask过后的二维码就成最终的图了。

     

    Reference:

    1.https://coolshell.cn/articles/10590.html

    2.盛秋康,二维码编解码技术的研究与应用

    3.https://www.swisseduc.ch/informatik/theoretische_informatik/qr_codes/docs/qr_standard.pdf

     

                                                                    (完)

     

     

                                         谢谢你的关注。

    展开全文
  • 二维码原理以及实现

    2018-03-26 14:37:51
    二维码原理的详细说明以及实现,java二维码工具类,供初学者使用
  • 二维码 扫描 登录,用到消息推送技术,可供初学者参考
  • 一、二维码简介_二维码基本概念_二维码基本原理 1.二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,...
  • 二维码基本原理

    千次阅读 2019-09-25 14:24:10
    矩阵式二维码,最流行莫过于QR CODE,二维码的名称是相对与一维码来说的,比如以前的条形码就是一个“一维码”。它的优点有:二维码存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性...
  • 日常使用的二维码识别原理

    千次阅读 2021-07-14 10:22:40
    二、二维码原理 1)二维码存储信息原理与计算机识别0和1是一样的。比如一个黑色块代表1,白色块代表0,我们假设“1000101”代表信息“A”,用二维码表示:黑白白白黑白黑,当我们手机扫描二维码
  • 一维码(条形码)在介绍二维码之前,先来看看它的“大哥”一维码,一维码也叫条形码(P.S. 好像在日常生活中都是叫这个),它是由不同宽度的黑条和白条按照一定的顺序排列组成的平行线图案,它的宽...
  • 二维码编码原理

    万次阅读 2019-10-14 10:48:19
    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。这两天学习了...
  • 二维码生成原理

    2013-07-18 10:17:37
    二维码生成原理,对二维码的生成细节、实现有很大帮助
  • 二维码扫码登录是什么原理?

    千次阅读 2021-10-13 01:22:53
    在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中...
  • 二维码原理以及怎么生成二维码

    千次阅读 2020-06-23 14:47:10
    目录一、什么二维码:二、常用的码制三、为什么二维码四、二维码什么是黑白相间的?五、QR CODE 介绍六、QR码纠错功能七、QR码的信息量和版本八、具体实现 一、什么二维码二维码 (2-dimensional bar ...
  • 主要大家详细解析了微信QQ的二维码登录原理js代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 微信二维码扫描原理

    千次阅读 2020-05-25 17:18:48
    每次打开微信网页版的时候,都会生成一个含有唯一uid的二维码,而且每次刷新后都会改变。这样可以保证一个uid只可以绑定一个账号和密码,确定登录用户的唯一性。 除了返回唯一的uid,实际上打开这个页面的时候,...
  • 二维码生成原理及解析代码

    万次阅读 多人点赞 2017-12-18 22:35:06
    二维码生成原理及解析代码 自从大街小巷的小商小贩都开始布满了腾讯爸爸和阿里爸爸的二维码之后,我才感觉到我大天朝共享支付的优越性。最近毕业论文写的差不多了,在入职之前多学一些东西也是好的。这里秉着好奇心...
  • 二维码之所以能够普及,除了看起来方方正正外,主要有以下几个有趣的点,这是其他之前的码没有想到的或者是二维码创新的部分,具体如下: 安静区域:空白边框,可以将代码与其他打印信息隔离(例如,在脏信封上,...
  • 二维码基本原理.zip

    2020-07-02 16:36:46
    呕心沥血整理之作,囊括了主流的QR码的原理以及发展历程,有趣好玩,界面简洁,干净清爽,这么好玩的东西你难道不想下载看看嘛,所需下载积分绝对全网最低门槛,走过路过千万不要错过,过了这个村就没这个店了,...
  • 微信扫描二维码登录网站是微信开放平台下网站应用的一种接口实现的功能。微信开放平台的网址是https://open.weixin.qq.com 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在...
  • 最全二维码详解原理——注意最全!
  • / 作者简介 / 本篇文章来自红鲤鱼鲤驴与驴的投稿,文章主要分享了他对二维码原理的理解以及二维码的实战演练,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。 红鲤鱼鲤驴与驴的博客地址: ...
  • 二维码原理课件.pptx

    2021-08-10 21:35:17
    二维码原理课件.pptx
  • 二维码识别的原理

    千次阅读 2020-07-07 08:40:25
    点击上方“3D视觉工坊”,选择“星标”干货第一时间送达整理:公众号@图像处理与计算机视觉本文仅做学术分享,如有侵权,请联系删除。二维码的特征定位和信息识别背景介绍视觉的方法可以用来估计位...
  • 是java后台的二维码生成以及扫一扫解析二维码原理的实例,包含二维码生产,以及解析原理,代码实现不易。
  • 视频二维码原理

    2019-11-12 11:23:56
    其实它的工作原理就跟商品外包装上底端的条形码是一样的,只不过条形码靠的是黑白条纹来存储。 二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流...
  • 二维码门禁的工作原理介绍二维码门禁如何实现开门.docx

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,457
精华内容 19,782
热门标签
关键字:

二维码的工作原理是什么