0

我正在编写一个从图像中提取条形码的简单程序。

我试过zxing。它运作良好。直到我发现了一个奇怪的东西。

我工作的组织发布表格。相同的形式(我从 2 个地方得到的)

org)使用相同的条形码,我在同一台机器上扫描它们(同样的结果)

pdf格式。

zxing 在第一张图片上做得很好,并返回了条形码。没有运气

第二张图片.. 尝试提取条形码时出现 com.google.zxing.NotFoundException

从第二张图片。问题出现在更多形式的组织中)。

这是Zxing认不出来的形象。

http://s000.tinyupload.com/?file_id=12080994969485224486

这是他认得的。

http://s000.tinyupload.com/?file_id=30365671784453283753

这是我的代码:

private String handlePdf(File pdfFile) throws Exception { 


    StringBuilder sb = new StringBuilder();  


    PDDocument pdDoc = PDDocument.load(pdfFile);  


    int size = pdDoc.getDocumentCatalog().getAllPages().size();  


    for (int i = 0; i < size; i++) {    


        PDPage page = (PDPage) pdDoc.getDocumentCatalog().getAllPages().get(i); 


        PDResources resources = page.getResources();  


        Map images = resources.getImages();  


           if (images != null) {  


            Iterator<String> imageIter = images.keySet().iterator();  


                   while (imageIter.hasNext()) {  


                  String key = (String) imageIter.next();  


                  PDXObjectImage image = (PDXObjectImage) images.get(key);  


                  String barcode = null ;  


                  barcode = extraceBarcodeFromImage(image.getRGBImage());  


                if(barcode!= null){  


                   sb.append(barcode);  


                   sb.append(",");  


                }  


               }  


         }  

    }  


     return sb.capacity() > 0 ? sb.toString().substring(0, sb.length()-1) : 
                                  "no barcode was found";


}    



private String extraceBarcodeFromImage(BufferedImage image)  


            throws NotFoundException {  


    String finalResult;  


    if (image == null)  


        throw new IllegalArgumentException("Could not decode image.");  


    Map<DecodeHintType, Object> HINTS;  


    HINTS = new EnumMap(DecodeHintType.class);  


    HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);  


    HINTS.put(DecodeHintType.POSSIBLE_FORMATS,  


            EnumSet.allOf(BarcodeFormat.class));  


    Map<DecodeHintType, Object> HINTS_PURE;  


    HINTS_PURE = new EnumMap<DecodeHintType, Object>(HINTS);  


    HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);  


    LuminanceSource source = new BufferedImageLuminanceSource(image);  


    BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(  


            source));  


    MultiFormatReader barcodeReader = new MultiFormatReader();   


    Result result;  


    result = barcodeReader.decode(bitmap, HINTS_PURE);   


    finalResult = String.valueOf(result.getText());  


    return finalResult;  


}  

感谢您在这种情况下提供的任何帮助。

4

1 回答 1

1

问题只是图像质量相当低。

放大看工作条码:

放大的工作条码

质量不是很好,但已经足够好了。

现在将其与不工作的条形码进行比较:

放大的不工作条码

它有点旋转,并且(可能是由于旋转)条非常有边缘。zxing 太边缘识别条码。

我用调试器完成了它,甚至让它查看图像的每一行(不进行操作,它只查看 256 个均匀间隔的行),它没有找到任何可以作为条形码成功读取的行。

因此,您要么必须提高扫描质量(更高的分辨率,确保文档没有旋转,...),要么必须寻找一个条形码阅读器库,它不仅可以单独查看图像列或行,而且而是尝试识别更大的结构。我对这些东西还不够深入,无法推荐任何东西。

于 2013-09-10T08:52:43.320 回答