二维码QR Code(Quick Response Code)是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。

二维码QR Code呈正方形,常见的是黑白两色。在3个角落,印有较小,像”回”字的的正方图案。这3个是帮助解码软件定位的图案,用户不需要对准,无论以任何角度扫描,数据仍可正确被读取。

由于QR Code码用特定的数据压缩模式表示汉字,它仅用13 bit可表示一个汉字,而PDF417、Data Martix等二维码没有特定的汉字表示模式,因此仅用字节表示模式来表示汉字,在用字节模式表示汉字时,需用16 bit(二个字节)表示一个汉字,因此QR Code码比其它的二维条码表示汉字的效率提高了20%。

QR Code码主要特点:

1、符号规格从版本1(21*21模块)到版本40(177*177模块),每提高一个版本,每边增加4个模块。

2、数据类型与容量(参照最大规格符号版本40-L级):

(1)、数字数据:7,089个字符;

(2)、字母数据: 4,296个字符;

(3)、8位字节数据: 2,953个字符;

(4)、汉字数据:1,817个字符。

3、数据表示方法:深色模块表示二进制"1",浅色模块表示二进制"0"。

4、纠错能力:

(1)、L级:约可纠错7%的数据码字;

(2)、M级:约可纠错15%的数据码字;

(3)、Q级:约可纠错25%的数据码字;

(4)、H级:约可纠错30%的数据码字。

5、结构链接(可选):可用1-16个QR Code码符号表示一组信息。每一符号表示100个字符的信息。

以下是通过zxing-cpp开源库实现的对二维码QR Code进行解码的测试代码:

#include "funset.hpp"
#include <string>
#include <fstream>
#include <Windows.h>#include <zxing/LuminanceSource.h>
#include <zxing/common/Counted.h>
#include <zxing/Reader.h>
#include <zxing/aztec/AztecReader.h>
#include <zxing/common/GlobalHistogramBinarizer.h>
#include <zxing/DecodeHints.h>
#include <zxing/datamatrix/DataMatrixReader.h>
#include <zxing/MultiFormatReader.h>
#include <zxing/pdf417/PDF417Reader.h>
#include <zxing/qrcode/QRCodeReader.h>#include <opencv2/opencv.hpp>#include "zxing/MatSource.h"int test_QRCode_decode()
{std::string image_name = "E:/GitCode/BarCode_Test/test_images/QRCode.png";cv::Mat matSrc = cv::imread(image_name, 1);if (!matSrc.data) {fprintf(stderr, "read image error: %s", image_name.c_str());return -1;}cv::Mat matGray;cv::cvtColor(matSrc, matGray, CV_BGR2GRAY);zxing::Ref<zxing::LuminanceSource> source = MatSource::create(matGray);int width = source->getWidth();int height = source->getHeight();fprintf(stderr, "image width: %d, height: %d\n", width, height);zxing::Ref<zxing::Reader> reader;reader.reset(new zxing::qrcode::QRCodeReader);zxing::Ref<zxing::Binarizer> binarizer(new zxing::GlobalHistogramBinarizer(source));zxing::Ref<zxing::BinaryBitmap> bitmap(new zxing::BinaryBitmap(binarizer));zxing::Ref<zxing::Result> result(reader->decode(bitmap, zxing::DecodeHints(zxing::DecodeHints::QR_CODE_HINT)));std::string txt = "E:/GitCode/BarCode_Test/test_images/QRCode.txt";std::ifstream in(txt);if (!in.is_open()) {fprintf(stderr, "fail to open file: %s\n", txt.c_str());return -1;}std::string str1;std::getline(in, str1);fprintf(stderr, "actual        result: %s\n", str1.c_str());std::string str2 = result->getText()->getText();fprintf(stdout, "recognization result: %s\n", str2.c_str());if (str1.compare(str2) == 0) {fprintf(stderr, "=====  recognition is correct  =====\n");}else {fprintf(stderr, "=====  recognition is wrong =====\n");return -1;}in.close();return 0;
}

测试图像如下:

测试结果如下:

GitHub:https://github.com/fengbingchun/Barcode_Test

二维码QR Code简介及其解码实现(zxing-cpp)相关推荐

  1. 二维码(QR code)原理解析

    二维码(QR code)原理解析 基于 <GB/T 18284-2000 快速响应矩阵码> 文章目录 二维码(QR code)原理解析 1 模式 1.1 ECI 模式 1.2 数字模式 1 ...

  2. 开源二维码QR CODE编码/解码(识别)库

    在很近很近的未来,城市疏导局(前身是城市管理局)实行新政,秉持"用高科技提升城市形象"的原则,要给办证从业人员开辟专门的广告涂鸦墙,条件是:不得使用手工喷涂的字体,而必须改用工整的 ...

  3. 二维码QR Code不是一个产品,是一个功能

    2019独角兽企业重金招聘Python工程师标准>>> 台湾有许多公司,开始跨入 QR Code 的相关应用,热度开始逐渐上升.最近有幸跟许多在这方面有兴趣的朋友们聊天,得到了很多的 ...

  4. 关于java生成二维码:QR Code

    QR Code的生成和读取在两个文件: 生成:QRcode​​​​​qrcode encoder (cgi programs/libralies) , QRcode demo and document ...

  5. 用ABAP 生成二维码 QR Code

    除了使用我的这篇blogStep by step to create QRCode in ABAP Webdynpro提到的使用ABAP webdynpro生成二维码之外,也可以通过使用二维码在线生成 ...

  6. Bartender 的二维码QR Code出现编码错误:输入数据包含对所选编码无效的字符

    解决方法:右键属性 - 符号体系和大小--开始模式选择二进制--文本编码选择Unicode(UTF-8)   ,这样就可以啦

  7. Java二维码的一些简介、功能

      一.二维码的简介   二维码起源于日本,世界应用最广泛识别码,原本为追踪汽车零部件设计.二维条码/二维码 (2-dimensional bar code) 是用某种特定的几何图形按一定规律在平面( ...

  8. Python基于二维码实现的在线编解码系统

    目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 工作环境和背景 2 1.3.1 操作系统 3 1.3.2 编程语言 3 1.3.3编码 ...

  9. 二维条码 QR Code

    (第三个图已加密,密码为 ora_SIDs) QR Code (Quick Response Code)是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,比起我们常见的Bar Code, ...

最新文章

  1. python画指数函数图像_python实现画出e指数函数的图像
  2. 诺亚面向语音语义的深度学习研究进展
  3. /proc/asound详细介绍
  4. C++中this指针的用法详解
  5. 数据结构——从叶子结点到根节点的全部路径
  6. linux 内存溢出排查_【开发者成长】JAVA 线上故障排查完整套路!
  7. 单处理机系统的进程调度动态优先_操作系统复习笔记(王道)C2.1
  8. Java并发编程:volatile关键字解析(转载)
  9. ES6学习(新增字符串方法)
  10. Notepad++ 大小写转换
  11. .NET 内存管理与垃圾回收:实现IDisposable接口和析构函数
  12. java 打印ascii字符串_简单使用JAVA打印纯ASCII字符构成的酷图效果
  13. 学科领域本体关系数据与可视化
  14. KITTI数据集简介与使用
  15. 机器人学基础(三):机器人运动学
  16. 2022年全新USDT支付系统源码+支持自动监控回调
  17. hexo搭建个人博客之seo优化
  18. Matlab实现时间序列预测
  19. 什么是VHDL?一文带你了解VHDL语言
  20. select 多选下拉框获取值

热门文章

  1. OpenCV Python 2 数字识别(K近邻)
  2. Makefile中的几个调试方法
  3. Roundgod and Milk Tea 贪心
  4. 固定旋转_旋转压片机如何正确更换冲模?
  5. idea怎么使用jacoco生成报告_Intellij IDEA解析jacoco结果文件的方法
  6. python文件关键行数_Python计算大文件行数方法及性能比较
  7. 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
  8. 【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
  9. Rocksdb 获取当前db内部的有效key个数 (估值)
  10. [kuangbin带你飞]专题五 并查集 E - 食物链 (带权并查集)