本篇文章中,旨在解决如何用Matlab编程实现QR二维码的生成与识别。编程环境是Matlab2012a,所用的开源库是ZXing,ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。
一、问题描述
QR二维码应用广泛, 随处可见,如下图所示。很多人都想要用Matlab实现QR二维码的生成与识别的功能,但是苦于不会JAVA,不知道怎么在Matlab中调用JAVA库。本文将详细介绍如何编程实现。需要的主要库是ZXing开源库,需要在网上下载放在m文件的同一文件夹下,本次选择1.7版本的ZXing开源库,两个库名为:zxing-core-1.7和zxing-j2se-1.7。以下将分为QR二维码生成和识别两部分进行详细讲解。
二、编程实现
2.1 QR二维码生成的编程实现
需要生成QR二维码,首先了解一下需要用到的类。MultiFormatWriter是需要用到的类。我们需要知道这个类的成员函数,Matlab查看java类的成员用到的指令是:methodsview 类名。如查询MultiFormatWriter,指令如下:
methodsview com.google.zxing.MultiFormatWriter
然后运行指令出现对话框如下:
上图介绍了该类所有的成员函数,可以看到输入变量,输出变量,这样就可以很方便的调用成员函数。上图红框中的函数就是生产二维码的,可以看到,输入变量:
参数一:字符串类型,即需要编码的信息
参数二:指定条码的码制,常见二维码码制有QR、PDF417、datamatrix等。
参数三、四:指定生产的条码图像的大小。
输出变量即为编码完后的条码图像,上图可以看到它的数据类型是BitMatrix,该类型是Java自带的类型,所以当在Matlab编程产生了条码图像后,还需要进行数据类型转化,使其成为Matlab的矩阵的数据类型。本文将其封装为一个函数,所以代码如下:
encode_qr.m文件
function qr = encode_qr(message, width,height)
% 功能:把信息编码生成QR二维码图像,可以指定图像大小
%变量说明:
% 输入:
% message:字符串信息
% width :指定生成的图像的宽度
% height:指定生成的图像的高度
% 输出:
% qr:得到QR二维码图像
writer = com.google.zxing.MultiFormatWriter();%创建MultiFormatWriter类的对象
M_java = writer.encode(message, com.google.zxing.BarcodeFormat.QR_CODE, ...
width, height);%调用MultiFormatWriter类的成员函数
%数据类型转化
qr = char(M_java);
clear bitmtx writer
qr(qr==10) = [];
qr = reshape(qr(1:2:end), width, height)';
qr(qr~='X') = 1;
qr(qr=='X') = 0;
qr = double(qr);
end
所以当想要生成QR二维码的图像时,调用encode_qr函数即可,前提是需要加载java库的路径,代码如下:
clear
clc
%%%%%%%%%%QR图像生成%%%%%%%%
javaaddpath('zxing-core-1.7.jar');%加载Java库的路径
javaaddpath('zxing-j2se-1.7.jar');%加载Java库的路径
message=input('请输入编码信息:\n','s');%输入信息
QRimg= encode_qr(message, 512,512);
imshow(QRimg);
title('QR图片');
运行程序,结果如下图所示。
信息输入完毕,回车后结果如图所示:
2.2 QR二维码识别的编程实现
需要识别QR二维码,首先了解一下需要用到的类。有容器类BufferedImageLuminanceSource、BinaryBitmap。识别过程关键类是QRCodeReader。用前面提到的指令查阅类的详细情况。如下图:
上图红框是我们需要用到的函数,可以看到输入变量类型是BinaryBitmap,这就要求解码之前要进行类型转化。输出变量类型是Result,查看Result类的情况,如下图所示:
上图红框的函数可以将其转化为字符串类型输出。本文将解码过程封装为函数,代码如下:
decode_qr.m文件
function message = decode_qr(img)
%功能:QR二维码图像的解码
%
% 变量:
% 输入:
% img:QR二维码图像
% 输出:
% message:解码出来的信息,是字符串或者空
%数据类型转化jimg = im2java2d(img);%将其转化为java类型图像格式
source = com.google.zxing.client.j2se.BufferedImageLuminanceSource(jimg);
bitmap = com.google.zxing.BinaryBitmap(com.google.zxing.common.HybridBinarizer(source));
qr_reader = com.google.zxing.qrcode.QRCodeReader;
try
result = qr_reader.decode(bitmap);
message = char(result.getText());
catch e
message = [];
end
所以当想要识别QR二维码的图像时,调用decode_qr函数即可,前提是需要加载java库的路径,代码如下:
clear
clc
javaaddpath('zxing-core-1.7.jar');%加载Java库的路径
javaaddpath('zxing-j2se-1.7.jar');%加载Java库的路径
%%%%%%%%%%QR二维码识别%%%%%%%%
QRimg = imread('qr.jpg');
decode_message = decode_qr(QRimg);
disp( ['译码出来的信息:' decode_message] )
运行结果如下所示:
三、总结
可以看出,想要编程实现本文的目标,对Java要求并不高,用到的类并不多,用到的成员函数也不多,只需要学会类怎么用,成员函数的功能是啥,注意数据类型间的转化,就可以编程实现。然后所有代码的文件夹内容如下:
本篇文章的配套程序请点击这里下载: