使用Java中的ZXing库解码彩色图像

时间:2012-01-10 02:40:44

标签: java zxing

我正在尝试使用ZXing库解码Java中的彩色QR码。从一些研究中,我知道ZXing已经有能力做到这一点。但我已经这样做了2天,我所做的是尝试从文件中读取QR图像并计算图像中最暗和最亮的颜色。然后将每个前景像素更改为黑色,其他像素更改为白色在此之后,我会得到一个像标准的QR码。然后使用函数读取QR码:

然而,这仅适用于具有两种不同颜色的QR码,如果它达到三种颜色,那么在大多数情况下它将不起作用。除非,从彩色转换为灰色图像的新图像不会超过纠错百分比。

我尝试了其他方法,但每种方法仅适用于特定类型的QR码(带有徽标,多色,形状的Finder模式等)。

我正在寻找的是一种解码各种QR码的方法。至少对于多色和形状的Finder模式。

更多细节:

  1. 这是我用来解码this页面上的绿色QR码(第二张QR码)的代码,也用于解码第三张QR码(对齐图案上方有一种徽标)发现在同一个网站上,这绝对不起作用

    公共类解码器 {   public static void main(String [] args)   {     //输入图像文件     File imageFile = new File(“/ Users / User / Desktop / QR / green.png”);     BufferedImage image = null;     尝试     {       image = ImageIO.read(imageFile);     }     catch(IOException e)     {       System.out.println(“io outch”);     }     int imageWidth = image.getWidth();     int imageHeight = image.getHeight();     int total = 0;     int dark = image.getRGB(0,0);     int light = image.getRGB(0,0);     int backgroundColor = 0;     int foregroundColor = 0;     FinderPattern topLeftFinder;     for(int x = 0; x< imageWidth; x ++)     {       for(int y = 0; y light)         {           light = image.getRGB(x,y);         }       }     }     for(int x = 0; x< imageWidth; x ++)     {       for(int y = 0; y =(dark - light)/ 4)         {           image.setRGB(x,y,-1);         }         否则if(image.getRGB(x,y)< =(dark - light)* 3/4)         {           image.setRGB(x,y,-16777216);         }         其他         {           image.setRGB(x,y,-1);         }       }     }     System.out.println(“total”+ dark +“average”+ light);     文件outputFile = new File(“/ Users / Desktop / QR / outputQR.png”);     //ImageIO.write(image,"png“,file);     尝试     {       ImageIO.write(image,“png”,outputFile);     }     catch(IOException e)     {       的System.out.println(e.getMessage());     }     //从源图像创建二进制位图     LuminanceSource lumSource = new BufferedImageLuminanceSource(image);     BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(lumSource));     Hashtable提示= new Hashtable();     hint.put(DecodeHintType.TRY_HARDER,BarcodeFormat.QR_CODE);     //解码     QRCodeReader QRreader = new QRCodeReader();     结果result = null;     尝试     {       result = QRreader.decode(bitmap,hint);     }     catch(ReaderException e)     {       System.out.println(“阅读时出错”);     }     //获取输出文本     String decodingText = result.getText();     的System.out.println(decodedText);   } }

  2. 这是用于解码this QR的代码,它原本工作正常,但不知道为什么它现在不能正常工作。此代码不会解码上面提到的QR。

    公共类解码器 {     public static void main(String [] args)     {         //输入图像文件         文件imageFile = new File(“/ Users / User / Desktop / QR / bigfinderQR.png”);         BufferedImage image = null;         尝试         {             image = ImageIO.read(imageFile);         }         catch(IOException e)         {             System.out.println(“io outch”);         }         //从源图像创建二进制位图         LuminanceSource lumSource = new BufferedImageLuminanceSource(image);         BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(lumSource));         Hashtable提示= new Hashtable();         hint.put(DecodeHintType.TRY_HARDER,BarcodeFormat.QR_CODE);         //解码         QRCodeReader QRreader = new QRCodeReader();         结果result = null;         尝试         {             result = QRreader.decode(bitmap,hint);         }         catch(ReaderException e)         {             System.out.println(“阅读时出错”);         }         //获取输出文本         String decodingText = result.getText();         的System.out.println(decodedText);     } }

2 个答案:

答案 0 :(得分:2)

它只是基于每个像素的计算亮度进行二值化。任何合理的暗光照都应该没问题。一千种颜色都很好。如果它是亮暗(倒置),那么您需要反转图像或修改代码以反转图像。这几乎肯定不是问题。

扭曲查找程序模式是一项棘手的工作,因为这样更容易使其无效。您将需要保持几乎1:1:3:1:1暗 - 暗 - 暗 - 暗 - 暗比率水平和垂直扫描图案。圆角有点很好。例如,你不能在黑色模块之间放置空格。

您可以发布您尝试解码的原始图片吗?我可以很快告诉你什么是对错。

答案 1 :(得分:0)

管理QR码总是有风险的。 ZXing被定义为符合ISO标准,彩色代码,更不用说“异形Finder模式”,远不是标准。如果你扭曲了QR码,你应该期望一些(如果不是全部)解码器失败。

ZXing旨在最大限度地提高标准图像的成功率。它所做的一些事情实际上会使它在扭曲的图像上不能很好地工作。例如,提高带有阴影的图像的解码率的算法可能不利于处理均匀照明但有色的图像。

众所周知,ZXing对取景器模式失真很敏感。由于这种扭曲是非标准的,所以没有兴趣改变它。