本文档内容主要基于java,包含图片中二维码的识别,以及如何提高识别精度
准备工作
引入jar包
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.beust/jcommander -->
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.82</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version>
</dependency>
代码介绍
简单识别
本代码可用于普通且不包含中文内容的二维码图片的识别
public static String readQrCodeImage(FileInputStream fileInputStream) throws Exception {
BufferedImage readImage = ImageIO.read(fileInputStream);
LuminanceSource source = new BufferedImageLuminanceSource(readImage);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result decode = qrCodeReader.decode(bitmap);
return decode.getText();
}
包含中文情况识别
本代码可用于包含中文内容的二维码图片的识别
public static String readQrCodeImage(FileInputStream fileInputStream) throws Exception {
BufferedImage readImage = ImageIO.read(fileInputStream);
LuminanceSource source = new BufferedImageLuminanceSource(readImage);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
EnumMap<DecodeHintType,Object> hints = new EnumMap<>(DecodeHintType.class);
//设置中文编码
hints.put(DecodeHintType.CHARACTER_SET,"GBK");
Result decode = qrCodeReader.decode(bitmap,hints);
return decode.getText();
}
图片清晰度差情况识别
本代码可用于图片清晰度差,图片中二维码不清晰情况下二维码图片的识别
针对图片不清晰情况,又不同措施:
1.对图片进行去除噪点的操作,生成高质量的图片(代价较大)
2.对图片进行截取,降低识别图片大小,提高图片中二维码所占比例
本次采用第2种方式对图片进行处理
public static String readQrCodeImage(FileInputStream fileInputStream) throws Exception {
BufferedImage readImage = ImageIO.read(fileInputStream);
int width = readImage.getWidth();
int height = readImage.getHeight();
//截取图片左下1/4进行识别
readImage = readImage.getSubimage(0, height/2, width/2 , height/2);
LuminanceSource source = new BufferedImageLuminanceSource(readImage);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
EnumMap<DecodeHintType,Object> hints = new EnumMap<>(DecodeHintType.class);
hints.put(DecodeHintType.CHARACTER_SET,"GBK");
Result decode = qrCodeReader.decode(bitmap,hints);
return decode.getText();
}