二维码QR Code简介及其解码实现(zxing-cpp)
二维码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;
}
测试图像如下:
测试结果如下:
二维码QR Code简介及其解码实现(zxing-cpp)相关推荐
- 二维码(QR code)原理解析
二维码(QR code)原理解析 基于 <GB/T 18284-2000 快速响应矩阵码> 文章目录 二维码(QR code)原理解析 1 模式 1.1 ECI 模式 1.2 数字模式 1 ...
- 开源二维码QR CODE编码/解码(识别)库
在很近很近的未来,城市疏导局(前身是城市管理局)实行新政,秉持"用高科技提升城市形象"的原则,要给办证从业人员开辟专门的广告涂鸦墙,条件是:不得使用手工喷涂的字体,而必须改用工整的 ...
- 二维码QR Code不是一个产品,是一个功能
2019独角兽企业重金招聘Python工程师标准>>> 台湾有许多公司,开始跨入 QR Code 的相关应用,热度开始逐渐上升.最近有幸跟许多在这方面有兴趣的朋友们聊天,得到了很多的 ...
- 关于java生成二维码:QR Code
QR Code的生成和读取在两个文件: 生成:QRcodeqrcode encoder (cgi programs/libralies) , QRcode demo and document ...
- 用ABAP 生成二维码 QR Code
除了使用我的这篇blogStep by step to create QRCode in ABAP Webdynpro提到的使用ABAP webdynpro生成二维码之外,也可以通过使用二维码在线生成 ...
- Bartender 的二维码QR Code出现编码错误:输入数据包含对所选编码无效的字符
解决方法:右键属性 - 符号体系和大小--开始模式选择二进制--文本编码选择Unicode(UTF-8) ,这样就可以啦
- Java二维码的一些简介、功能
一.二维码的简介 二维码起源于日本,世界应用最广泛识别码,原本为追踪汽车零部件设计.二维条码/二维码 (2-dimensional bar code) 是用某种特定的几何图形按一定规律在平面( ...
- 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编码 ...
- 二维条码 QR Code
(第三个图已加密,密码为 ora_SIDs) QR Code (Quick Response Code)是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,比起我们常见的Bar Code, ...
最新文章
- python画指数函数图像_python实现画出e指数函数的图像
- 诺亚面向语音语义的深度学习研究进展
- /proc/asound详细介绍
- C++中this指针的用法详解
- 数据结构——从叶子结点到根节点的全部路径
- linux 内存溢出排查_【开发者成长】JAVA 线上故障排查完整套路!
- 单处理机系统的进程调度动态优先_操作系统复习笔记(王道)C2.1
- Java并发编程:volatile关键字解析(转载)
- ES6学习(新增字符串方法)
- Notepad++ 大小写转换
- .NET 内存管理与垃圾回收:实现IDisposable接口和析构函数
- java 打印ascii字符串_简单使用JAVA打印纯ASCII字符构成的酷图效果
- 学科领域本体关系数据与可视化
- KITTI数据集简介与使用
- 机器人学基础(三):机器人运动学
- 2022年全新USDT支付系统源码+支持自动监控回调
- hexo搭建个人博客之seo优化
- Matlab实现时间序列预测
- 什么是VHDL?一文带你了解VHDL语言
- select 多选下拉框获取值
热门文章
- OpenCV Python 2 数字识别(K近邻)
- Makefile中的几个调试方法
- Roundgod and Milk Tea 贪心
- 固定旋转_旋转压片机如何正确更换冲模?
- idea怎么使用jacoco生成报告_Intellij IDEA解析jacoco结果文件的方法
- python文件关键行数_Python计算大文件行数方法及性能比较
- 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
- 【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
- Rocksdb 获取当前db内部的有效key个数 (估值)
- [kuangbin带你飞]专题五 并查集 E - 食物链 (带权并查集)