使用zxing二维码识别
1.多二维码识别 (同一张图片中多二维码识别)
直接上代码舒服:
pom文件:
1 <!-- QR Code --> 2 <dependency> 3 <groupId>com.google.zxing</groupId> 4 <artifactId>core</artifactId> 5 <version>3.3.3</version> 6 </dependency>、
1 /** 2 * Parse multiple qr codes(解析多个二维码) 3 * 使用java实现 4 * 5 * @param bufferedImage image 6 * @return QRCode analysis results 7 */ 8 @Override 9 public Result[] analysisQRCodeOfMore(BufferedImage bufferedImage) { 10 QRCodeMultiReader qrCodeMultiReader = new QRCodeMultiReader(); 11 Result[] results = null; 12 try { 13 BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(bufferedImage))); 14 Map hints = new Hashtable(); 15 hints.put(EncodeHintType.CHARACTER_SET, SystemConstants.SYS_ENC); 16 hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); //优化精度 17 hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); //复杂模式,开启PURE_BARCODE模式; 带图片LOGO的解码方案 18 hints.put(DecodeHintType.POSSIBLE_FORMATS,BarcodeFormat.QR_CODE);//指定识别的二维码格式 19 results = qrCodeMultiReader.decodeMultiple(binaryBitmap, hints); 20 } catch (NotFoundException e) { 21 //e.printStackTrace(); 22 System.err.println("二维码识别中..."); 23 } 24 return results; 25 }
注意:开启精度优化与复杂模式会消耗识别时间!
在多二维码识别中,应该说是zxing的一个小bug,在识别过程中对于模糊一点的图片,会一直抛异常 (二维码识别中...) 直至二维码识别不出来,或者二维码识别出来;此问题没来得及细细研究,等日后补充;
2.单二维码识别:
1 private String decodeQRCode(Mat src) { 2 if (src == null) { 3 return null; 4 } 5 BufferedImage image; 6 try { 7 image = ImageUtils.mat2BufferedImage(src, ".jpg"); 8 LuminanceSource source = new BufferedImageLuminanceSource(image); 9 Binarizer binarizer = new HybridBinarizer(source); 10 BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer); 11 Map<DecodeHintType, Object> hints = new HashMap<>(); 12 hints.put(DecodeHintType.CHARACTER_SET, SystemConstants.SYS_ENC); 13 hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); 14 Result resultText = new MultiFormatReader().decode(binaryBitmap, hints); 15 return resultText.getText(); 16 } catch (NotFoundException e) { 17 LogUtils.info("[QRCodeServiceImpl] decodeQRCode image transform failed."); 18 } 19 return null; 20 }
以上代码使用opencv格式的图片来转换为BufferedImage为需要的入参;
3. (扩展) 多二维码识别与多二维码识别不同点:
1 public Result[] decodeMultiple(BinaryBitmap image, Map<DecodeHintType,?> hints)
单二维码识别函数:
1 public Result decode(BinaryBitmap image, Map<DecodeHintType,?> hints)
完毕!