【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

时间:2024-03-27 16:36:33

本篇文章中,旨在解决如何用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二维码生成和识别两部分进行详细讲解。

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别


二、编程实现

2.1 QR二维码生成的编程实现

需要生成QR二维码,首先了解一下需要用到的类。MultiFormatWriter是需要用到的类。我们需要知道这个类的成员函数,Matlab查看java类的成员用到的指令是:methodsview  类名。如查询MultiFormatWriter,指令如下:

     methodsview com.google.zxing.MultiFormatWriter

然后运行指令出现对话框如下:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

上图介绍了该类所有的成员函数,可以看到输入变量,输出变量,这样就可以很方便的调用成员函数。上图红框中的函数就是生产二维码的,可以看到,输入变量:

    参数一:字符串类型,即需要编码的信息

    参数二:指定条码的码制,常见二维码码制有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图片');

运行程序,结果如下图所示。

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

信息输入完毕,回车后结果如图所示:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

2.2 QR二维码识别的编程实现

需要识别QR二维码,首先了解一下需要用到的类。有容器类BufferedImageLuminanceSource、BinaryBitmap。识别过程关键类是QRCodeReader。用前面提到的指令查阅类的详细情况。如下图:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

上图红框是我们需要用到的函数,可以看到输入变量类型是BinaryBitmap,这就要求解码之前要进行类型转化。输出变量类型是Result,查看Result类的情况,如下图所示:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

上图红框的函数可以将其转化为字符串类型输出。本文将解码过程封装为函数,代码如下:

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] )

运行结果如下所示:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

三、总结

可以看出,想要编程实现本文的目标,对Java要求并不高,用到的类并不多,用到的成员函数也不多,只需要学会类怎么用,成员函数的功能是啥,注意数据类型间的转化,就可以编程实现。然后所有代码的文件夹内容如下:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别

本篇文章的配套程序请点击这里下载:

【Matlab编程实现常见小问题之二】Matlab如何实现QR二维码的生成与识别